GPUAPI void operator () (const int thread_in_system) { pass_one(thread_in_system); pass_two(thread_in_system); if(need_to_log_system() && (thread_in_system==0) ) _monitor1.log_system(); }
GPUAPI void operator () (const int thread_in_system) { pass_one(thread_in_system); pass_two(thread_in_system); if(need_to_log_system() && (thread_in_system()==0) ) log::system(_log, _sys); }
int main(int argc, char **argv) { SymbolTable* symtbl = create_table(SYMTBL_UNIQUE_NAME); SymbolTable* reltbl = create_table(SYMTBL_UNIQUE_NAME); FILE* input1 = fopen("myinstr.txt", "r"); FILE* output1 = fopen("res.txt", "w"); pass_one(input1, output1, symtbl); fclose(input1); fclose(output1); FILE* input2 = fopen("res.txt", "r"); FILE* output2 = fopen("final.txt", "w"); pass_two(input2, output2, symtbl, reltbl); // int ret = translate_inst(stdout, "addu", args, 3 , 0, tb1, tb2); printf("symtbl:\n"); write_table(symtbl, stdout); printf("reltbl:\n"); write_table(reltbl, stdout); free_table(symtbl); free_table(reltbl); fclose(input2); fclose(output2); return 0; }
void mkmap(lev_init *init_lev) { schar bg_typ = init_lev->bg, fg_typ = init_lev->fg; boolean smooth = init_lev->smoothed, join = init_lev->joined; xchar lit = init_lev->lit, walled = init_lev->walled; int i; if(lit < 0) lit = (rnd(1+abs(depth(&u.uz))) < 11 && rn2(77)) ? 1 : 0; new_locations = (char *)alloc((WIDTH+1) * HEIGHT); if (bg_typ < MAX_TYPE) init_map(bg_typ); init_fill(bg_typ, fg_typ); for(i = 0; i < N_P1_ITER; i++) pass_one(bg_typ, fg_typ); for(i = 0; i < N_P2_ITER; i++) pass_two(bg_typ, fg_typ); if(smooth) for(i = 0; i < N_P3_ITER; i++) pass_three(bg_typ, fg_typ); if(join) join_map(bg_typ, fg_typ); finish_map(fg_typ, bg_typ, (boolean)lit, (boolean)walled); /* a walled, joined level is cavernous, not mazelike -dlc * * also, caverns have a defined "inside" and "outside"; the outside * doesn't _have_ to be stone, say, for hell. so if the player * defined a maze filler originally, go ahead and backfill the * background in with that filler - DSR */ if (walled && join && (init_lev->filling > -1)) { level.flags.is_maze_lev = FALSE; level.flags.is_cavernous_lev = TRUE; backfill(bg_typ,init_lev->filling); } free(new_locations); }
/* Runs the two-pass assembler. Most of the actual work is done in pass_one() and pass_two(). */ int assemble(const char* in_name, const char* tmp_name, const char* out_name) { FILE *src, *dst; int err = 0; SymbolTable* symtbl = create_table(SYMTBL_UNIQUE_NAME); SymbolTable* reltbl = create_table(SYMTBL_NON_UNIQUE); if (in_name) { printf("Running pass one: %s -> %s\n", in_name, tmp_name); if (open_files(&src, &dst, in_name, tmp_name) != 0) { free_table(symtbl); free_table(reltbl); exit(1); } if (pass_one(src, dst, symtbl) != 0) { err = 1; } close_files(src, dst); } if (out_name) { printf("Running pass two: %s -> %s\n", tmp_name, out_name); if (open_files(&src, &dst, tmp_name, out_name) != 0) { free_table(symtbl); free_table(reltbl); exit(1); } fprintf(dst, ".text\n"); if (pass_two(src, dst, symtbl, reltbl) != 0) { err = 1; } fprintf(dst, "\n.symbol\n"); write_table(symtbl, dst); fprintf(dst, "\n.relocation\n"); write_table(reltbl, dst); close_files(src, dst); } free_table(symtbl); free_table(reltbl); return err; }
void mkmap(struct level *lev, lev_init *init_lev) { schar bg_typ = init_lev->bg, fg_typ = init_lev->fg; boolean smooth = init_lev->smoothed, join = init_lev->joined; xchar lit = init_lev->lit, walled = init_lev->walled; int i; if (lit < 0) lit = (mklev_rn2(1 + abs(depth(&u.uz)), lev) < 10 && mklev_rn2(77, lev)) ? 1 : 0; new_locations = malloc((WIDTH + 1) * HEIGHT); init_map(lev, bg_typ); init_fill(lev, bg_typ, fg_typ); for (i = 0; i < N_P1_ITER; i++) pass_one(lev, bg_typ, fg_typ); for (i = 0; i < N_P2_ITER; i++) pass_two(lev, bg_typ, fg_typ); if (smooth) for (i = 0; i < N_P3_ITER; i++) pass_three(lev, bg_typ, fg_typ); if (join) join_map(lev, bg_typ, fg_typ); finish_map(lev, fg_typ, bg_typ, (boolean) lit, (boolean) walled); /* a walled, joined level is cavernous, not mazelike -dlc */ if (walled && join) { lev->flags.is_maze_lev = FALSE; lev->flags.is_cavernous_lev = TRUE; } free(new_locations); }
void BlockBuilder::setup() { std::vector<const Type*> ftypes; ftypes.push_back(ls_->ptr_type("VM")); ftypes.push_back(ls_->ptr_type("CallFrame")); ftypes.push_back(ls_->ptr_type("BlockEnvironment")); ftypes.push_back(ls_->ptr_type("Arguments")); ftypes.push_back(ls_->ptr_type("BlockInvocation")); FunctionType* ft = FunctionType::get(ls_->ptr_type("Object"), ftypes, false); std::stringstream ss; ss << std::string("_X_") << ls_->enclosure_name(info_.method()) << "#" << ls_->symbol_cstr(info_.method()->name()) << "$block@" << ls_->add_jitted_method(); func = Function::Create(ft, GlobalValue::ExternalLinkage, ss.str().c_str(), ls_->module()); Function::arg_iterator ai = func->arg_begin(); vm = ai++; vm->setName("state"); prev = ai++; prev->setName("previous"); block_env = ai++; block_env->setName("env"); args = ai++; args->setName("args"); block_inv = ai++; block_inv->setName("invocation"); BasicBlock* block = BasicBlock::Create(ls_->ctx(), "entry", func); b().SetInsertPoint(block); info_.set_function(func); info_.set_vm(vm); info_.set_args(args); info_.set_previous(prev); info_.set_entry(block); BasicBlock* body = BasicBlock::Create(ls_->ctx(), "block_body", func); pass_one(body); info_.set_counter(b().CreateAlloca(ls_->Int32Ty, 0, "counter_alloca")); counter2_ = b().CreateAlloca(ls_->Int32Ty, 0, "counter2"); // The 3 here is because we store {ip, sp, type} per unwind. info_.set_unwind_info(b().CreateAlloca(ls_->Int32Ty, ConstantInt::get(ls_->Int32Ty, rubinius::kMaxUnwindInfos * 3), "unwind_info")); valid_flag = b().CreateAlloca(ls_->Int1Ty, 0, "valid_flag"); Value* cfstk = b().CreateAlloca(obj_type, ConstantInt::get(ls_->Int32Ty, (sizeof(CallFrame) / sizeof(Object*)) + vmm_->stack_size), "cfstk"); call_frame = b().CreateBitCast( cfstk, llvm::PointerType::getUnqual(cf_type), "call_frame"); info_.set_out_args(b().CreateAlloca(ls_->type("Arguments"), 0, "out_args")); if(ls_->include_profiling()) { method_entry_ = b().CreateAlloca(ls_->Int8Ty, ConstantInt::get(ls_->Int32Ty, sizeof(tooling::MethodEntry)), "method_entry"); info_.set_profiling_entry(method_entry_); } info_.set_call_frame(call_frame); stk = b().CreateConstGEP1_32(cfstk, sizeof(CallFrame) / sizeof(Object*), "stack"); info_.set_stack(stk); Value* var_mem = b().CreateAlloca(obj_type, ConstantInt::get(ls_->Int32Ty, (sizeof(StackVariables) / sizeof(Object*)) + vmm_->number_of_locals), "var_mem"); vars = b().CreateBitCast( var_mem, llvm::PointerType::getUnqual(stack_vars_type), "vars"); info_.set_variables(vars); initialize_frame(vmm_->stack_size); nil_stack(vmm_->stack_size, constant(Qnil, obj_type)); setup_block_scope(); if(ls_->config().version >= 19) { import_args_19_style(); } if(ls_->include_profiling()) { Value* test = b().CreateLoad(ls_->profiling(), "profiling"); BasicBlock* setup_profiling = BasicBlock::Create(ls_->ctx(), "setup_profiling", func); BasicBlock* cont = BasicBlock::Create(ls_->ctx(), "continue", func); b().CreateCondBr(test, setup_profiling, cont); b().SetInsertPoint(setup_profiling); Signature sig(ls_, ls_->VoidTy); sig << "VM"; sig << llvm::PointerType::getUnqual(ls_->Int8Ty); sig << "BlockEnvironment"; sig << "Module"; sig << "CompiledMethod"; Value* call_args[] = { vm, method_entry_, block_env, module_, method }; sig.call("rbx_begin_profiling_block", call_args, 5, "", b()); b().CreateBr(cont); b().SetInsertPoint(cont); } b().CreateBr(body); b().SetInsertPoint(body); }
BasicBlock* InlineMethodBuilder::setup_inline(Value* self, Value* blk, std::vector<Value*>& stack_args) { llvm::Value* prev = info_.parent_call_frame(); llvm::Value* args = ConstantExpr::getNullValue(ctx_->ptr_type("Arguments")); BasicBlock* entry = BasicBlock::Create(ctx_->llvm_context(), "inline_entry", info_.function()); b().SetInsertPoint(entry); info_.set_args(args); info_.set_previous(prev); info_.set_entry(entry); BasicBlock* body = BasicBlock::Create(ctx_->llvm_context(), "method_body", info_.function()); pass_one(body); BasicBlock* alloca_block = &info_.function()->getEntryBlock(); Value* cfstk = new AllocaInst(obj_type, ConstantInt::get(ctx_->Int32Ty, (sizeof(CallFrame) / sizeof(Object*)) + machine_code_->stack_size), "cfstk", alloca_block->getTerminator()); call_frame = b().CreateBitCast( cfstk, llvm::PointerType::getUnqual(cf_type), "call_frame"); stk = b().CreateConstGEP1_32(cfstk, sizeof(CallFrame) / sizeof(Object*), "stack"); info_.set_call_frame(call_frame); info_.set_stack(stk); Value* var_mem = new AllocaInst(obj_type, ConstantInt::get(ctx_->Int32Ty, (sizeof(StackVariables) / sizeof(Object*)) + machine_code_->number_of_locals), "var_mem", alloca_block->getTerminator()); vars = b().CreateBitCast( var_mem, llvm::PointerType::getUnqual(stack_vars_type), "vars"); info_.set_variables(vars); Value* rd = constant(runtime_data_, ctx_->ptr_type("jit::RuntimeData")); // Setup the CallFrame // // previous b().CreateStore(prev, get_field(call_frame, offset::CallFrame::previous)); // msg b().CreateStore( b().CreatePointerCast(rd, ctx_->Int8PtrTy), get_field(call_frame, offset::CallFrame::dispatch_data)); // compiled_code method = b().CreateLoad( b().CreateConstGEP2_32(rd, 0, offset::jit_RuntimeData::method, "method_pos"), "compiled_code"); Value* code_gep = get_field(call_frame, offset::CallFrame::compiled_code); b().CreateStore(method, code_gep); // constant_scope Value* constant_scope = b().CreateLoad( b().CreateConstGEP2_32(method, 0, offset::CompiledCode::scope, "constant_scope_pos"), "constant_scope"); Value* constant_scope_gep = get_field(call_frame, offset::CallFrame::constant_scope); b().CreateStore(constant_scope, constant_scope_gep); // flags int flags = CallFrame::cInlineFrame; if(!use_full_scope_) flags |= CallFrame::cClosedScope; b().CreateStore(cint(flags), get_field(call_frame, offset::CallFrame::flags)); // ip b().CreateStore(cint(0), get_field(call_frame, offset::CallFrame::ip)); // scope b().CreateStore(vars, get_field(call_frame, offset::CallFrame::scope)); nil_stack(machine_code_->stack_size, constant(cNil, obj_type)); Value* mod = b().CreateLoad( b().CreateConstGEP2_32(rd, 0, offset::jit_RuntimeData::module, "module_pos"), "module"); setup_inline_scope(self, blk, mod); // We know the right arguments are present, so we just need to put them // in the right place. // // We don't support splat in an inlined method! assert(machine_code_->splat_position < 0); assert(stack_args.size() <= (size_t)machine_code_->total_args); for(size_t i = 0; i < stack_args.size(); i++) { Value* int_pos = cint(i); Value* idx2[] = { cint(0), cint(offset::StackVariables::locals), int_pos }; Value* pos = b().CreateGEP(vars, idx2, "local_pos"); Value* arg_val = stack_args.at(i); LocalInfo* li = info_.get_local(i); li->make_argument(); if(ctx_->llvm_state()->type_optz()) { if(type::KnownType::has_hint(ctx_, arg_val)) { type::KnownType kt = type::KnownType::extract(ctx_, arg_val); li->set_known_type(kt); } } b().CreateStore(arg_val, pos); } b().CreateBr(body); b().SetInsertPoint(body); return entry; }