[llvm-dev] setDataLayout segfault

Frank Winter via llvm-dev llvm-dev at lists.llvm.org
Wed Sep 14 09:23:33 PDT 2016


Ok. I can make a copy of the unique_ptr before moving it into the 
builder's constructor and use the copy later on. It is confusing to 
require a unique_ptr.

Frank

On 09/14/2016 12:11 PM, Frank Winter via llvm-dev wrote:
> I am constructing the engine builder in the following way:
>
> llvm::SMDiagnostic Err;
> unique_ptr<Module> Mod = getLazyIRFileModule("f.ll", Err, TheContext);
> llvm::EngineBuilder engineBuilder(std::move(Mod));
>
> However, after moving the pointer to the constructor it is no longer 
> retrievable from the unique_ptr object.
>
> Mod.get()->dump();   // this segfaults after the move, but not before
>
> So I conclude that any type of operation on the module is no longer 
> valid.
>
> Am I constructing the engine builder as it is supposed to?
>
> Frank
>
>
> On 09/14/2016 10:59 AM, Frank Winter via llvm-dev wrote:
>> I get a segfault with this code when setting the data layout:
>>
>>
>>
>> int main(int argc, char** argv)
>> {
>>   llvm::InitializeNativeTarget();
>>
>>   llvm::LLVMContext TheContext;
>>   unique_ptr<Module> Mod(new Module("A",TheContext));
>>
>>   llvm::EngineBuilder engineBuilder(std::move(Mod));
>>   std::string mcjit_error;
>>
>>   engineBuilder.setMCPU(llvm::sys::getHostCPUName());
>>
>>   engineBuilder.setEngineKind(llvm::EngineKind::JIT);
>>   engineBuilder.setOptLevel(llvm::CodeGenOpt::Aggressive);
>>   engineBuilder.setErrorStr(&mcjit_error);
>>
>>   llvm::TargetOptions targetOptions;
>>   targetOptions.AllowFPOpFusion = llvm::FPOpFusion::Fast;
>>   engineBuilder.setTargetOptions( targetOptions );
>>
>>   TargetMachine *targetMachine = engineBuilder.selectTarget();
>>
>>   assert(targetMachine && "failed to create target machine");
>>
>>   std::cout << 
>> targetMachine->createDataLayout().getStringRepresentation() << "\n";
>>
>>   Mod.get()->setDataLayout( 
>> targetMachine->createDataLayout().getStringRepresentation() ); // 
>> this segfaults
>>   Mod.get()->setDataLayout( targetMachine->createDataLayout()  ); // 
>> as well as this
>> }
>>
>>
>> Backtrace:
>>
>>
>> Using host libthread_db library 
>> "/lib/x86_64-linux-gnu/libthread_db.so.1".
>> e-m:e-i64:64-f80:128-n8:16:32:64-S128
>>
>> Program received signal SIGSEGV, Segmentation fault.
>> 0x00007ffff5f65832 in llvm::SmallVectorTemplateCommon<unsigned char, 
>> void>::end (this=0x148) at 
>> /home/fwinter/svn/llvm-3.9/include/llvm/ADT/SmallVector.h:117
>> 117      iterator end() { return (iterator)this->EndX; }
>> (gdb) bt
>> #0  0x00007ffff5f65832 in llvm::SmallVectorTemplateCommon<unsigned 
>> char, void>::end (this=0x148) at 
>> /home/fwinter/svn/llvm-3.9/include/llvm/ADT/SmallVector.h:117
>> #1  llvm::SmallVectorImpl<unsigned char>::clear (this=0x148) at 
>> /home/fwinter/svn/llvm-3.9/include/llvm/ADT/SmallVector.h:345
>> #2  0x00007ffff5fa13b5 in llvm::DataLayout::clear (this=0x138) at 
>> /home/fwinter/svn/llvm-3.9/lib/IR/DataLayout.cpp:545
>> #3  0x00007ffff5f9f561 in llvm::DataLayout::reset (this=0x138, 
>> Desc=...) at /home/fwinter/svn/llvm-3.9/lib/IR/DataLayout.cpp:179
>> #4  0x00007ffff60b25ca in llvm::Module::setDataLayout (this=0x0, 
>> Desc=...) at /home/fwinter/svn/llvm-3.9/lib/IR/Module.cpp:377
>> #5  0x0000000000406c46 in main (argc=1, argv=0x7fffffffde68) at 
>> main.cc:95
>>
>>
>> Any idea?
>>
>> Frank
>>
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev



More information about the llvm-dev mailing list