static int generateobj(boost::shared_ptr<llvm::tool_output_file> Out , llvm::Module * module) { llvm::PassManager PM; llvm::TargetOptions Options; std::string Err; llvm::Triple TheTriple(module->getTargetTriple()); if (TheTriple.getTriple().empty()) TheTriple.setTriple(llvm::sys::getDefaultTargetTriple()); const llvm::Target* TheTarget = llvm::TargetRegistry::lookupTarget(TheTriple.getTriple(), Err); std::string MCPU,FeaturesStr; llvm::TargetMachine * machineTarget = TheTarget->createTargetMachine(TheTriple.getTriple(), MCPU, FeaturesStr, Options); // Figure out where we are going to send the output... llvm::formatted_raw_ostream FOS(Out->os()); if (machineTarget->addPassesToEmitFile(PM, FOS, llvm::TargetMachine::CGFT_ObjectFile,true)) { std::cerr << " target does not support generation of this" << " file type!\n"; return 1; } PM.run(*module); return 0; }
void SchedulerStatistics::printSchedulerUsage(raw_ostream &OS) const { assert(NumCycles && "Unexpected number of cycles!"); OS << "\nScheduler's queue usage:\n"; if (all_of(Usage, [](const BufferUsage &BU) { return !BU.MaxUsedSlots; })) { OS << "No scheduler resources used.\n"; return; } OS << "[1] Resource name.\n" << "[2] Average number of used buffer entries.\n" << "[3] Maximum number of used buffer entries.\n" << "[4] Total number of buffer entries.\n\n" << " [1] [2] [3] [4]\n"; formatted_raw_ostream FOS(OS); bool HasColors = FOS.has_colors(); for (unsigned I = 0, E = SM.getNumProcResourceKinds(); I < E; ++I) { const MCProcResourceDesc &ProcResource = *SM.getProcResource(I); if (ProcResource.BufferSize <= 0) continue; const BufferUsage &BU = Usage[I]; double AvgUsage = (double)BU.CumulativeNumUsedSlots / NumCycles; double AlmostFullThreshold = (double)(ProcResource.BufferSize * 4) / 5; unsigned NormalizedAvg = floor((AvgUsage * 10) + 0.5) / 10; unsigned NormalizedThreshold = floor((AlmostFullThreshold * 10) + 0.5) / 10; FOS << ProcResource.Name; FOS.PadToColumn(17); if (HasColors && NormalizedAvg >= NormalizedThreshold) FOS.changeColor(raw_ostream::YELLOW, true, false); FOS << NormalizedAvg; if (HasColors) FOS.resetColor(); FOS.PadToColumn(28); if (HasColors && BU.MaxUsedSlots == static_cast<unsigned>(ProcResource.BufferSize)) FOS.changeColor(raw_ostream::RED, true, false); FOS << BU.MaxUsedSlots; if (HasColors) FOS.resetColor(); FOS.PadToColumn(39); FOS << ProcResource.BufferSize << '\n'; } FOS.flush(); }
int main(int argc, char** argv) { llvm::llvm_shutdown_obj _ShutdownObj; llvm::cl::ParseCommandLineOptions(argc, argv, "P-NDK Link Tool"); llvm::LLVMContext& Ctx = llvm::getGlobalContext(); std::string ErrMsg; llvm::raw_fd_ostream FOS(OutputFilenames[0].c_str(), ErrMsg); assert(!FOS.has_error()); // No need to link (just one file). // Output Directly. if (InputFilenames.size() == 1) { llvm::OwningPtr<llvm::Module> M(getModuleFromFilename(InputFilenames[0], Ctx, ErrMsg)); llvm::WriteBitcodeToFile(M.get(), FOS); return 0; } llvm::OwningPtr<llvm::Module> M(linkFilesToModule(InputFilenames, Ctx)); llvm::WriteBitcodeToFile(M.get(), FOS); assert(!FOS.has_error()); return 0; }
// takes the running content that has collected in the shadow module and dump it to disk // this builds the object file portion of the sysimage files for fast startup static void jl_dump_shadow(char *fname, int jit_model, const char *sysimg_data, size_t sysimg_len, bool dump_as_bc) { #ifdef LLVM36 std::error_code err; StringRef fname_ref = StringRef(fname); raw_fd_ostream OS(fname_ref, err, sys::fs::F_None); #elif defined(LLVM35) std::string err; raw_fd_ostream OS(fname, err, sys::fs::F_None); #else std::string err; raw_fd_ostream OS(fname, err); #endif #ifdef LLVM37 // 3.7 simplified formatted output; just use the raw stream alone raw_fd_ostream& FOS(OS); #else formatted_raw_ostream FOS(OS); #endif // We don't want to use MCJIT's target machine because // it uses the large code model and we may potentially // want less optimizations there. Triple TheTriple = Triple(jl_TargetMachine->getTargetTriple()); #if defined(_OS_WINDOWS_) && defined(FORCE_ELF) #ifdef LLVM35 TheTriple.setObjectFormat(Triple::COFF); #else TheTriple.setEnvironment(Triple::UnknownEnvironment); #endif #elif defined(_OS_DARWIN_) && defined(FORCE_ELF) #ifdef LLVM35 TheTriple.setObjectFormat(Triple::MachO); #else TheTriple.setEnvironment(Triple::MachO); #endif #endif #ifdef LLVM35 std::unique_ptr<TargetMachine> #else OwningPtr<TargetMachine> #endif TM(jl_TargetMachine->getTarget().createTargetMachine( TheTriple.getTriple(), jl_TargetMachine->getTargetCPU(), jl_TargetMachine->getTargetFeatureString(), jl_TargetMachine->Options, #if defined(_OS_LINUX_) || defined(_OS_FREEBSD_) Reloc::PIC_, #else jit_model ? Reloc::PIC_ : Reloc::Default, #endif jit_model ? CodeModel::JITDefault : CodeModel::Default, CodeGenOpt::Aggressive // -O3 TODO: respect command -O0 flag? )); #ifdef LLVM38 legacy::PassManager PM; #else PassManager PM; #endif #ifndef LLVM37 PM.add(new TargetLibraryInfo(Triple(TM->getTargetTriple()))); #else PM.add(new TargetLibraryInfoWrapperPass(Triple(TM->getTargetTriple()))); #endif // set up optimization passes #ifdef LLVM37 // No DataLayout pass needed anymore. #elif defined(LLVM36) PM.add(new DataLayoutPass()); #elif defined(LLVM35) PM.add(new DataLayoutPass(*jl_ExecutionEngine->getDataLayout())); #else PM.add(new DataLayout(*jl_ExecutionEngine->getDataLayout())); #endif addOptimizationPasses(&PM); if (!dump_as_bc) { if (TM->addPassesToEmitFile(PM, FOS, TargetMachine::CGFT_ObjectFile, false)) { jl_error("Could not generate obj file for this target"); } } // now copy the module, since PM.run may modify it ValueToValueMapTy VMap; #ifdef LLVM38 Module *clone = CloneModule(shadow_output, VMap).release(); #else Module *clone = CloneModule(shadow_output, VMap); #endif #ifdef LLVM37 // Reset the target triple to make sure it matches the new target machine clone->setTargetTriple(TM->getTargetTriple().str()); #ifdef LLVM38 clone->setDataLayout(TM->createDataLayout()); #else clone->setDataLayout(TM->getDataLayout()->getStringRepresentation()); #endif #endif // add metadata information jl_gen_llvm_globaldata(clone, VMap, sysimg_data, sysimg_len); // do the actual work PM.run(*clone); if (dump_as_bc) WriteBitcodeToFile(clone, FOS); delete clone; }