[llvm-dev] Help with pass manager
Lorenzo Laneve via llvm-dev
llvm-dev at lists.llvm.org
Wed Mar 23 17:41:24 PDT 2016
The stack trace:
llvm::PMTopLevelManager::addImmutablePass(llvm::ImmutablePass*)
llvm::PMTopLevelManager::schedulePass(llvm::Pass*)
moduleToObjectFile(llvm::Module*,std::string&,llvm::LLVMContext&)
Sometimes it doesn't crash because TargetRegistry::lookupTarget() returns an error which says it doesn't support the current target
> On Mar 24, 2016, at 1:14 AM, Mehdi Amini <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> 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/20160324/f6fedddc/attachment-0001.html>
More information about the llvm-dev
mailing list