[llvm-dev] Help with pass manager

Lorenzo Laneve via llvm-dev llvm-dev at lists.llvm.org
Wed Mar 23 17:50:41 PDT 2016


Sorry, that's a pure crash I think, assertions are not triggered.
Xcode doesn’t map those 2 functions to line numbers because they’re in precompiled libraries


On Mar 24, 2016, at 1:44 AM, Mehdi Amini <mehdi.amini at apple.com <mailto:mehdi.amini at apple.com>> wrote:

> 
>> On Mar 23, 2016, at 5:41 PM, Lorenzo Laneve <lore97drk at icloud.com <mailto:lore97drk at icloud.com>> wrote:
>> 
>> The stack trace:
>> llvm::PMTopLevelManager::addImmutablePass(llvm::ImmutablePass*)
>> llvm::PMTopLevelManager::schedulePass(llvm::Pass*)
>> moduleToObjectFile(llvm::Module*,std::string&,llvm::LLVMContext&)
> 
> 
> Without mapping to line numbers this is not very helpful: moduleToObjectFile never calls schedulePass.
> 
> Also you didn't answer my previous question about the crash.
> 
> 
>> Sometimes it doesn't crash because TargetRegistry::lookupTarget() returns an error which says it doesn't support the current target
> 
> Do you mean that running it multiple time does not always produce the same behavior in the call to lookupTarget?
> That's unexpected and I'd be worried about my program.
> 
> -- 
> Mehdi
> 
> 
> 
>> 
>> On Mar 24, 2016, at 1:14 AM, Mehdi Amini <mehdi.amini at apple.com <mailto:mehdi.amini at apple.com>> wrote:
>> 
>>> 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 <mailto: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 <mailto:llvm-dev at lists.llvm.org>
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev <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/20160324/cfe07cfe/attachment-0001.html>


More information about the llvm-dev mailing list