OpenCLProgram* OpenCLContext::loadProgramFromStrings(std::vector<std::string> file_strs) { const char * str_ptr[file_strs.size()]; size_t size_ptr[file_strs.size()]; for (int i = 0; i < file_strs.size(); i++) { str_ptr[i] = file_strs[i].c_str(); size_ptr[i] = file_strs[i].size(); } cl_int error; cl_program program = clCreateProgramWithSource (context, file_strs.size(), str_ptr, size_ptr, &error); check_error(error); // build for all devices, I can implement different devices later; error = clBuildProgram(program, 0, NULL, "", NULL, NULL); if (error) { print_err_msg(error); // uses first device for error messages size_t length; check_error(clGetProgramBuildInfo(program, devices[0]->getDeviceId(), CL_PROGRAM_BUILD_LOG, 0, NULL, &length)); char buffer[length+1]; check_error(clGetProgramBuildInfo(program, devices[0]->getDeviceId(), CL_PROGRAM_BUILD_LOG, length, buffer, &length)); std::cout<<"--- Build log ---"<<std::endl<<buffer<<std::endl<<"--- End log ---"<<std::endl; assert(!error); } OpenCLProgram* ret = new OpenCLProgram(program, this); programs.push_back(ret); return ret; }
void print_err_msg(ErrorMsg *err, ErrColor color) { if (color == ErrColorOn || (color == ErrColorAuto && os_stderr_tty())) { fprintf(stderr, WHITE "%s:%d:%d: " RED "error:" WHITE " %s" RESET "\n", buf_ptr(err->path), err->line_start + 1, err->column_start + 1, buf_ptr(err->msg)); fprintf(stderr, "%s\n", buf_ptr(&err->line_buf)); for (int i = 0; i < err->column_start; i += 1) { fprintf(stderr, " "); } fprintf(stderr, GREEN "^" RESET "\n"); } else { fprintf(stderr, "%s:%d:%d: error: %s\n", buf_ptr(err->path), err->line_start + 1, err->column_start + 1, buf_ptr(err->msg)); } for (int i = 0; i < err->notes.length; i += 1) { ErrorMsg *note = err->notes.at(i); print_err_msg(note, color); } }
rt_private int run_idr_read (IDR *bu) { RT_GET_CONTEXT register char * ptr = bu->i_buf; int32 read_size; long amount_left; register int part_read; register int total_read = 0; if ((char_read_func ((char *)(&read_size), sizeof (int32))) < sizeof (int32)) eise_io("Independent retrieve: unable to read buffer size."); read_size = ntohl (read_size); #ifdef DEBUG if (read_size > idrs_size (bu)) print_err_msg(stderr, "Too large %d info for %d buffer\n", read_size, idrs_size (bu)); #endif amount_left = read_size; while (total_read < read_size) { if ((part_read = char_read_func (ptr, amount_left)) <= 0) { /* If we read 0 bytes, it means that we reached the end of file, * so we are missing something, instead of going further we stop */ eio(); } total_read += part_read; ptr += part_read; amount_left -= part_read; } return total_read; }
rt_private Signal_t emergency(int sig) { /* A signal has been trapped while we were failing peacefully. The memory * must really be in a desastrous state, so print out a give-up message * and exit. * The code is protected in case `emergency' is triggered while calling `print_err_msg' * which was happening in eweasel test#vsrp208 because we got a SIGPIPE when outputs * of `ec' are redirected and closed while the compiler is not yet done. */ if (!emergency_call_success) { emergency_call_success = 1; print_err_msg(stderr, "\n\n%s: PANIC: caught signal #%d (%s) -- Giving up...\n", egc_system_name, sig, signame(sig)); } exit(2); /* Really abnormal termination */ /* NOTREACHED */ }
rt_private void run_idr_write (IDR *bu) { RT_GET_CONTEXT register char * ptr = idrs_buf (bu); int32 host_send, send_size = (int32) (bu->i_ptr - ptr); register int number_writen; #ifdef DEBUG if (send_size == 0) print_err_msg(stderr, "send size equal zero"); #endif host_send = htonl (send_size - sizeof(int32)); memcpy (ptr, &host_send, sizeof(int32)); while (send_size > 0) { if ((number_writen = char_write_func (ptr, (int) send_size)) <= 0) eio(); send_size -= number_writen; ptr += number_writen; } }