static void codegenModule(Module* m) { // debug info gIR->DBuilder.EmitCompileUnit(m); // process module members for (unsigned k=0; k < m->members->dim; k++) { Dsymbol* dsym = static_cast<Dsymbol*>(m->members->data[k]); assert(dsym); Declaration_codegen(dsym); } if (global.errors) return; // finalize debug info gIR->DBuilder.EmitModuleEnd(); // Skip emission of all the additional module metadata if requested by the user. if (!m->noModuleInfo) { // generate ModuleInfo m->genmoduleinfo(); build_llvm_used_array(gIR); #if LDC_LLVM_VER >= 303 // Add the linker options metadata flag. gIR->module->addModuleFlag(llvm::Module::AppendUnique, "Linker Options", llvm::MDNode::get(gIR->context(), gIR->LinkerMetadataArgs)); #endif #if LDC_LLVM_VER >= 304 // Emit ldc version as llvm.ident metadata. llvm::NamedMDNode *IdentMetadata = gIR->module->getOrInsertNamedMetadata("llvm.ident"); std::string Version("ldc version "); Version.append(global.ldc_version); llvm::Value *IdentNode[] = { llvm::MDString::get(gIR->context(), Version) }; IdentMetadata->addOperand(llvm::MDNode::get(gIR->context(), IdentNode)); #endif } // verify the llvm verifyModule(*gIR->module); }
llvm::Module* Module::genLLVMModule(llvm::LLVMContext& context) { bool logenabled = Logger::enabled(); if (llvmForceLogging && !logenabled) { Logger::enable(); } IF_LOG Logger::println("Generating module: %s", (md ? md->toChars() : toChars())); LOG_SCOPE; if (global.params.verbose_cg) printf("codegen: %s (%s)\n", toPrettyChars(), srcfile->toChars()); if (global.errors) { Logger::println("Aborting because of errors"); fatal(); } // name the module #if 1 // Temporary workaround for http://llvm.org/bugs/show_bug.cgi?id=11479 – // just use the source file name, as it is unlikely to collide with a // symbol name used somewhere in the module. llvm::StringRef mname(srcfile->toChars()); #else llvm::StringRef mname(toChars()); if (md != 0) mname = md->toChars(); #endif // create a new ir state // TODO look at making the instance static and moving most functionality into IrModule where it belongs IRState ir(new llvm::Module(mname, context)); gIR = &ir; ir.dmodule = this; // reset all IR data stored in Dsymbols IrDsymbol::resetAll(); // set target triple ir.module->setTargetTriple(global.params.targetTriple.str()); // set final data layout ir.module->setDataLayout(gDataLayout->getStringRepresentation()); IF_LOG Logger::cout() << "Final data layout: " << ir.module->getDataLayout() << '\n'; // allocate the target abi gABI = TargetABI::getTarget(); // debug info gIR->DBuilder.EmitCompileUnit(this); // handle invalid 'objectø module if (!ClassDeclaration::object) { error("is missing 'class Object'"); fatal(); } LLVM_D_InitRuntime(); // process module members for (unsigned k=0; k < members->dim; k++) { Dsymbol* dsym = static_cast<Dsymbol*>(members->data[k]); assert(dsym); Declaration_codegen(dsym); } // finalize debug info gIR->DBuilder.EmitModuleEnd(); // generate ModuleInfo genmoduleinfo(); build_llvm_used_array(&ir); #if LDC_LLVM_VER >= 303 // Add the linker options metadata flag. ir.module->addModuleFlag(llvm::Module::AppendUnique, "Linker Options", llvm::MDNode::get(ir.context(), ir.LinkerMetadataArgs)); #endif #if LDC_LLVM_VER >= 304 // Emit ldc version as llvm.ident metadata. llvm::NamedMDNode *IdentMetadata = ir.module->getOrInsertNamedMetadata("llvm.ident"); std::string Version("ldc version "); Version.append(global.ldc_version); llvm::Value *IdentNode[] = { llvm::MDString::get(ir.context(), Version) }; IdentMetadata->addOperand(llvm::MDNode::get(ir.context(), IdentNode)); #endif // verify the llvm verifyModule(*ir.module); gIR = NULL; if (llvmForceLogging && !logenabled) { Logger::disable(); } return ir.module; }