[llvm-dev] Help with pass manager
Mehdi Amini via llvm-dev
llvm-dev at lists.llvm.org
Wed Mar 23 17:14:13 PDT 2016
Assuming you are talking about this line:
passmanager.add(tliwp);
I don't see anything obviously wrong.
Are you hitting an assertion or a pure crash? (if LLVM not built with assertions, please rebuild).
What does your debugger gives you as a stracktrace?
--
Mehdi
> On Mar 23, 2016, at 3:44 PM, Lorenzo Laneve via llvm-dev <llvm-dev at lists.llvm.org> wrote:
>
> Sorry in advance for the stupid question, i still don’t understand some concepts like passes.
> I took a piece of code from llc, and I used it to write a function that creates an object (or assembly) file from an IR module.
> It compiles without any problems. But program crashes when it reaches add() method of the pass manager.
> Can you help me figuring out what’s the problem please? here is my function
>
>
> int moduleToObjectFile(llvm::Module *module, std::string &srcname, llvm::LLVMContext &Context) {
> SMDiagnostic error;
> Triple moduletriple = Triple(module->getTargetTriple());
>
> if (moduletriple.getTriple().empty())
> moduletriple.setTriple(sys::getDefaultTargetTriple());
>
> std::string lookuperror;
> const Target *moduletarget = TargetRegistry::lookupTarget(MArch, moduletriple, lookuperror);
>
> if (!moduletarget) {
> errs() << lookuperror;
> return 1;
> }
>
> std::string cpuname = getCPUStr(),
> ftrlist = getFeaturesStr();
>
> CodeGenOpt::Level OLvl = CodeGenOpt::Default;
> switch ('2') {
> default:
> errs() << "invalid optimization level.\n";
> return 1;
> case ' ': break;
> case '0': OLvl = CodeGenOpt::None; break;
> case '1': OLvl = CodeGenOpt::Less; break;
> case '2': OLvl = CodeGenOpt::Default; break;
> case '3': OLvl = CodeGenOpt::Aggressive; break;
> }
>
> TargetOptions targetopts = InitTargetOptionsFromCodeGenFlags();
>
> std::unique_ptr<TargetMachine> tmachine(moduletarget->createTargetMachine(moduletriple.getTriple(), cpuname, ftrlist, targetopts, Reloc::Default, CodeModel::Default, OLvl));
>
> assert(tmachine && "Could not allocate target machine!");
>
> assert(module && "Should have exited if we didn't have a module!");
> if (FloatABIForCalls != FloatABI::Default)
> targetopts.FloatABIType = FloatABIForCalls;
>
>
> std::unique_ptr<tool_output_file> objoutstream = getOutputFileStream(module, srcname);
> if (!objoutstream) return 1;
>
> legacy::PassManager passmanager;
>
> TargetLibraryInfoImpl TLII(moduletriple);
>
> TargetLibraryInfoWrapperPass *tliwp = new TargetLibraryInfoWrapperPass(TLII);
>
> passmanager.add(tliwp);
>
> module->setDataLayout(tmachine->createDataLayout());
>
> setFunctionAttributes(cpuname, ftrlist, *module);
>
> if (RelaxAll.getNumOccurrences() > 0 &&
> FileType != TargetMachine::CGFT_ObjectFile)
> errs() << "warning: ignoring -mc-relax-all because filetype != obj";
>
> {
> raw_pwrite_stream *outstream = &objoutstream->os();
>
> SmallVector<char, 0> filebuf;
> std::unique_ptr<raw_svector_ostream> BOS;
> if ((FileType != TargetMachine::CGFT_AssemblyFile && !objoutstream->os().supportsSeeking())) {
> BOS = make_unique<raw_svector_ostream>(filebuf);
> outstream = BOS.get();
> }
>
> AnalysisID StartBeforeID = nullptr;
> AnalysisID StartAfterID = nullptr;
> AnalysisID StopAfterID = nullptr;
> const PassRegistry *PR = PassRegistry::getPassRegistry();
> if (!RunPass.empty()) {
> if (!StartAfter.empty() || !StopAfter.empty()) {
> errs() << "start-after and/or stop-after passes are redundant when run-pass is specified.\n";
> return 1;
> }
> const PassInfo *PI = PR->getPassInfo(RunPass);
> if (!PI) {
> errs() << "run-pass pass is not registered.\n";
> return 1;
> }
> StopAfterID = StartBeforeID = PI->getTypeInfo();
> } else {
> if (!StartAfter.empty()) {
> const PassInfo *PI = PR->getPassInfo(StartAfter);
> if (!PI) {
> errs() << "start-after pass is not registered.\n";
> return 1;
> }
> StartAfterID = PI->getTypeInfo();
> }
> if (!StopAfter.empty()) {
> const PassInfo *PI = PR->getPassInfo(StopAfter);
> if (!PI) {
> errs() << "stop-after pass is not registered.\n";
> return 1;
> }
> StopAfterID = PI->getTypeInfo();
> }
> }
>
> if (tmachine->addPassesToEmitFile(passmanager, *outstream, FileType, false, StartBeforeID, StartAfterID, StopAfterID)) {
> errs() << "target does not support generation of this file type!\n";
> return 1;
> }
>
> passmanager.run(*module);
>
> if (BOS) {
> objoutstream->os() << filebuf;
> }
> }
>
> objoutstream->keep();
>
> return 0;
> }
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160323/2ad717dd/attachment-0001.html>
More information about the llvm-dev
mailing list