[llvm-dev] llvm/clang 7.0 crash
Kern Handa via llvm-dev
llvm-dev at lists.llvm.org
Wed Oct 3 14:51:19 PDT 2018
Christophe,
You've run into a problem I and Alastair Murray have run into (thread:
https://lists.llvm.org/pipermail/llvm-dev/2018-October/126683.html).
In short, building your project with clang and linking against LLVM
libraries built with GCC causes a SEGFAULT because of an ABI
incompatibility.
HTH,
Kern
On Wed, Oct 3, 2018 at 8:49 AM Christophe Duvernois via llvm-dev <
llvm-dev at lists.llvm.org> wrote:
> Hi,
>
> I'm just trying to create a TargetMachine. I'm using llvm 7.0
> The following snippet works as expected with gcc on Ubuntu 16.04 and 18.04
> but I have a crash with clang.
> Am I doing something wrong here or is it a clang issue?
>
> #include <memory>
> #include <llvm/ADT/Triple.h>
> #include <llvm/CodeGen/CommandFlags.inc>
> #include <llvm/Support/CodeGen.h>
> #include <llvm/InitializePasses.h>
> #include <llvm/LinkAllIR.h>
> #include <llvm/LinkAllPasses.h>
> #include <llvm/MC/SubtargetFeature.h>
> #include <llvm/Support/TargetRegistry.h>
> #include <llvm/Support/TargetSelect.h>
> #include <llvm/Target/TargetMachine.h>
>
> using namespace llvm;
>
> // Returns the TargetMachine instance or zero if no triple is provided.
> static TargetMachine* GetTargetMachine(Triple TheTriple, StringRef CPUStr,
> StringRef FeaturesStr,
> const TargetOptions &Options) {
> std::string Error;
> const Target *TheTarget = TargetRegistry::lookupTarget(MArch, TheTriple,
> Error);
> // Some modules don't specify a triple, and this is okay.
> if (!TheTarget) {
> return nullptr;
> }
>
> return TheTarget->createTargetMachine(TheTriple.getTriple(), CPUStr,
> FeaturesStr, Options, getRelocModel(),
> getCodeModel(), CodeGenOpt::Default);
> }
>
>
> //-----------------------------------------------------------------------------
> int main(int argc, const char** argv) {
> InitializeAllTargets();
> InitializeAllTargetMCs();
> InitializeAllAsmPrinters();
> InitializeAllAsmParsers();
>
> Triple ModuleTriple(sys::getProcessTriple());
> std::string CPUStr, FeaturesStr;
> TargetMachine* Machine = nullptr;
> const TargetOptions Options = InitTargetOptionsFromCodeGenFlags();
>
> if (ModuleTriple.getArch()) {
> CPUStr = getCPUStr();
> FeaturesStr = getFeaturesStr();
> Machine = GetTargetMachine(ModuleTriple, CPUStr, FeaturesStr,
> Options);
> }
> std::unique_ptr<TargetMachine> TM(Machine);
> fprintf(stderr, "%s:%d %p\n", __FUNCTION__, __LINE__, TM.get());
>
> return 0;
> }
>
> OK : g++ -std=c++11 crash.cpp -ocrash -I`llvm-config --includedir`
> -L`llvm-config --libdir` `llvm-config --libs` `llvm-config --system-libs`
> CRASH : clang++ -std=c++11 crash.cpp -ocrash -I`llvm-config --includedir`
> -L`llvm-config --libdir` `llvm-config --libs` `llvm-config --system-libs`
>
> Here is the valgrind output in case of binary built with clang:
> ==3931== Memcheck, a memory error detector
> ==3931== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
> ==3931== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright
> info
> ==3931== Command: ./crash
> ==3931==
> ==3931== Use of uninitialised value of size 8
> ==3931== at 0xF04483:
> llvm::RegisterTargetMachine<llvm::X86TargetMachine>::Allocator(llvm::Target
> const&, llvm::Triple const&, llvm::StringRef, llvm::StringRef,
> llvm::TargetOptions const&, llvm::Optional<llvm::Reloc::Model>,
> llvm::Optional<llvm::CodeModel::Model>, llv
> m::CodeGenOpt::Level, bool) (in /home/christophe/crash)
> ==3931== by 0x4D52AF:
> llvm::Target::createTargetMachine(llvm::StringRef, llvm::StringRef,
> llvm::StringRef, llvm::TargetOptions const&,
> llvm::Optional<llvm::Reloc::Model>, llvm::Optional<llvm::CodeModel::Model>,
> llvm::CodeGenOpt::Level, bool) const (in /home/christophe
> /crash)
> ==3931== by 0x4C027C: GetTargetMachine(llvm::Triple, llvm::StringRef,
> llvm::StringRef, llvm::TargetOptions const&) (in /home/christophe/crash)
> ==3931== by 0x4BF492: main (in /home/christophe/crash)
> ==3931==
> ==3931== Invalid read of size 1
> ==3931== at 0xF04483:
> llvm::RegisterTargetMachine<llvm::X86TargetMachine>::Allocator(llvm::Target
> const&, llvm::Triple const&, llvm::StringRef, llvm::StringRef,
> llvm::TargetOptions const&, llvm::Optional<llvm::Reloc::Model>,
> llvm::Optional<llvm::CodeModel::Model>, llv
> m::CodeGenOpt::Level, bool) (in /home/christophe/crash)
> ==3931== by 0x4D52AF:
> llvm::Target::createTargetMachine(llvm::StringRef, llvm::StringRef,
> llvm::StringRef, llvm::TargetOptions const&,
> llvm::Optional<llvm::Reloc::Model>, llvm::Optional<llvm::CodeModel::Model>,
> llvm::CodeGenOpt::Level, bool) const (in /home/christophe
> /crash)
> ==3931== by 0x4C027C: GetTargetMachine(llvm::Triple, llvm::StringRef,
> llvm::StringRef, llvm::TargetOptions const&) (in /home/christophe/crash)
> ==3931== by 0x4BF492: main (in /home/christophe/crash)
> ==3931== Address 0xfefffd04 is not stack'd, malloc'd or (recently) free'd
> ==3931==
> ==3931==
> ==3931== Process terminating with default action of signal 11 (SIGSEGV)
> ==3931== Access not within mapped region at address 0xFEFFFD04
> ==3931== at 0xF04483:
> llvm::RegisterTargetMachine<llvm::X86TargetMachine>::Allocator(llvm::Target
> const&, llvm::Triple const&, llvm::StringRef, llvm::StringRef,
> llvm::TargetOptions const&, llvm::Optional<llvm::Reloc::Model>,
> llvm::Optional<llvm::CodeModel::Model>, llv
> m::CodeGenOpt::Level, bool) (in /home/christophe/crash)
> ==3931== by 0x4D52AF:
> llvm::Target::createTargetMachine(llvm::StringRef, llvm::StringRef,
> llvm::StringRef, llvm::TargetOptions const&,
> llvm::Optional<llvm::Reloc::Model>, llvm::Optional<llvm::CodeModel::Model>,
> llvm::CodeGenOpt::Level, bool) const (in /home/christophe
> /crash)
> ==3931== by 0x4C027C: GetTargetMachine(llvm::Triple, llvm::StringRef,
> llvm::StringRef, llvm::TargetOptions const&) (in /home/christophe/crash)
> ==3931== by 0x4BF492: main (in /home/christophe/crash)
> ==3931== If you believe this happened as a result of a stack
> ==3931== overflow in your program's main thread (unlikely but
> ==3931== possible), you can try to increase the size of the
> ==3931== main thread stack using the --main-stacksize= flag.
> ==3931== The main thread stack size used in this run was 8388608.
> ==3931==
>
> Best regards,
> Christpohe
>
> _______________________________________________
> 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/20181003/8931ea2d/attachment.html>
More information about the llvm-dev
mailing list