<div dir="ltr">Hi David,<div><br></div><div>This is definitely the right place to ask.</div><div><br></div><div>Let me see if I can reproduce this locally...</div><div><br></div><div>Cheers,</div><div>Lang.</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Apr 9, 2017 at 2:02 PM, David Lurton via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Firstly, apologies if this is not the right place to be asking this question--feel free to point me in the correct direction.  I could be doing something wrong here but stackoverflow didn't feel like the correct place for this since there's so little there about LLVM ORC.<div><br></div><div><div><div>Basically, I have a reproduction case (below) where if I throw an exception before I call JITSymbol::getAddress() everything works properly but throwing the same exception afterward will result in a SIGSEGV during stack unwinding.  This suggests to me that somehow the stack is getting corrupted during the JITSymbol::getAddress() call.  </div></div></div><div><br></div><div>This problem was initially discovered while working on my own project.  While troubleshooting this I've discvoered that when LLVM is<span style="font-family:monospace,monospace">-DLLVM_USE_SANITIZER:STRING=<wbr>Address </span><font face="arial, helvetica, sans-serif">the problem happens at different points during execution, perhaps having something to do with the padding around the stack variables added by the sanitizer?  See the note after the call to runTest() in main().</font></div><div><br></div><div>I'm running this under an up-to-date Antergos Linux, clang version: 3.9.1 (tried compiling LLVM and the example program below with gcc 6.3.1 and the result is the same) clang set to default compiler by setting the following environment variables:</div><div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    CC=/usr/bin/clang</font></div><div><font face="monospace, monospace">    CXX=/usr/bin/clang++</font></div><div><br></div><div>Commands used to build LLVM:</div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    git clone <a href="https://github.com/llvm-mirror/llvm.git" target="_blank">https://github.com/llvm-<wbr>mirror/llvm.git</a></font></div><div><font face="monospace, monospace">    git checkout release_40</font></div><div><font face="monospace, monospace">    cd llvm</font></div><div><font face="monospace, monospace">    mkdir build</font></div><div><font face="monospace, monospace">    cd build</font></div><div><font face="monospace, monospace">    cmake .. -DLLVM_BUILD_LLVM_DYLIB:BOOL=<wbr>ON -DLLVM_ENABLE_RTTI:BOOL=ON -DLLVM_ENABLE_EH:BOOL=ON -DLLVM_USE_SANITIZER:STRING=<wbr>Address -DLLVM_PARALLEL_COMPILE_JOBS:<wbr>STRING=8 -DLLVM_ENABLE_ASSERTIONS:BOOL=<wbr>ON</font></div><div><font face="monospace, monospace">    cmake --build . -- -j 8</font></div><div><font face="monospace, monospace">    sudo cmake --build . --target install</font></div><div><br></div><div>Command used to build test case executable:</div><div><br></div><div>    clang test.cpp -std=c++14 -lstdc++ -lLLVM-4.0 -Wall -pedantic -Wextra  -fstack-protector-all -fsanitize=address -fexceptions</div><div><br></div><div>Then of course:</div><div><br></div><div><font face="monospace, monospace">    ./a.out</font></div></div><div><br></div><div>Output from the a.out:</div><div><br></div><div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div><font face="monospace, monospace">ASAN:DEADLYSIGNAL</font></div><div><font face="monospace, monospace">==============================<wbr>==============================<wbr>=====</font></div><div><font face="monospace, monospace">==6582==ERROR: AddressSanitizer: SEGV on unknown address 0x7f59eeb06020 (pc 0x7f59f1b20930 bp 0x000000000001 sp 0x7ffc5e546218 T0)</font></div><div><font face="monospace, monospace">==6582==The signal is caused by a READ memory access.</font></div></div></blockquote></div><div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif">The result if running `backtrace` in GDB while execution is paused after the SIGSEGV occurs:</font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace">#0  read_encoded_value_with_base (encoding=encoding@entry=28 '\034', base=base@entry=0, p=p@entry=0x7fffe8a06020 <error: Cannot access memory at address 0x7fffe8a06020>, val=val@entry=0x7fffffffd6d8) at /build/gcc/src/gcc/libgcc/<wbr>unwind-pe.h:252</font></div><div><font face="monospace, monospace">#1  0x00007fffeba05a61 in binary_search_single_encoding_<wbr>fdes (pc=0x7fffeba04426 <_Unwind_Resume+54>, ob=0x0) at /build/gcc/src/gcc/libgcc/<wbr>unwind-dw2-fde.c:908</font></div><div><font face="monospace, monospace">#2  search_object (ob=ob@entry=0x60400001d9d0, pc=pc@entry=0x7fffeba04426 <_Unwind_Resume+54>) at /build/gcc/src/gcc/libgcc/<wbr>unwind-dw2-fde.c:977</font></div><div><font face="monospace, monospace">#3  0x00007fffeba05fdd in _Unwind_Find_registered_FDE (bases=0x7fffffffda78, pc=0x7fffeba04426 <_Unwind_Resume+54>) at /build/gcc/src/gcc/libgcc/<wbr>unwind-dw2-fde.c:1013</font></div><div><font face="monospace, monospace">#4  _Unwind_Find_FDE (pc=0x7fffeba04426 <_Unwind_Resume+54>, bases=bases@entry=<wbr>0x7fffffffda78) at /build/gcc/src/gcc/libgcc/<wbr>unwind-dw2-fde-dip.c:454</font></div><div><font face="monospace, monospace">#5  0x00007fffeba02b23 in uw_frame_state_for (context=context@entry=<wbr>0x7fffffffd9d0, fs=fs@entry=0x7fffffffd820) at /build/gcc/src/gcc/libgcc/<wbr>unwind-dw2.c:1241</font></div><div><font face="monospace, monospace">#6  0x00007fffeba03d40 in uw_init_context_1 (context=context@entry=<wbr>0x7fffffffd9d0, outer_cfa=outer_cfa@entry=<wbr>0x7fffffffdc00, outer_ra=0x5110fc) at /build/gcc/src/gcc/libgcc/<wbr>unwind-dw2.c:1562</font></div><div><font face="monospace, monospace">#7  0x00007fffeba04427 in _Unwind_Resume (exc=0x60d00000c7b0) at /build/gcc/src/gcc/libgcc/<wbr>unwind.inc:224</font></div><div><font face="monospace, monospace">#8  0x00000000005110fc in runTest () at /home/dave/projects/untitled/<wbr>test.cpp:124</font></div><div><font face="monospace, monospace">#9  0x0000000000511138 in main (argc=1, argv=0x7fffffffe698) at /home/dave/projects/untitled/<wbr>test.cpp:132</font></div><div><font face="monospace, monospace"><br></font></div></blockquote></div><div>My test-case is below.  In runTest(), note the commented out throw statement before symbol.getAddress() and the uncommented one after it.  Also note the comments after the call to runTest() in main().<br></div><div><br></div><div>Thanks.</div><div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><br></div><div><font face="monospace, monospace">#include "llvm/ADT/STLExtras.h"</font></div><div><font face="monospace, monospace">#include "llvm/ExecutionEngine/<wbr>ExecutionEngine.h"</font></div><div><font face="monospace, monospace">#include "llvm/IR/IRBuilder.h"</font></div><div><font face="monospace, monospace">#include "llvm/ExecutionEngine/<wbr>SectionMemoryManager.h"</font></div><div><font face="monospace, monospace">#include "llvm/ExecutionEngine/Orc/<wbr>CompileUtils.h"</font></div><div><font face="monospace, monospace">#include "llvm/ExecutionEngine/Orc/<wbr>IRCompileLayer.h"</font></div><div><font face="monospace, monospace">#include "llvm/ExecutionEngine/Orc/<wbr>LambdaResolver.h"</font></div><div><font face="monospace, monospace">#include "llvm/ExecutionEngine/Orc/<wbr>ObjectLinkingLayer.h"</font></div><div><font face="monospace, monospace">#include "llvm/IR/Mangler.h"</font></div><div><font face="monospace, monospace">#include "llvm/Support/DynamicLibrary.<wbr>h"</font></div><div><font face="monospace, monospace">#include "llvm/Support/TargetSelect.h"</font></div><div><font face="monospace, monospace">#include <iostream></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">using namespace llvm;</font></div><div><font face="monospace, monospace">using namespace llvm::orc;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">/** This class taken verbatim from</font></div><div><font face="monospace, monospace"> * <a href="https://github.com/llvm-mirror/llvm/blob/release_40/examples/Kaleidoscope/BuildingAJIT/Chapter1/KaleidoscopeJIT.h" target="_blank">https://github.com/llvm-<wbr>mirror/llvm/blob/release_40/<wbr>examples/Kaleidoscope/<wbr>BuildingAJIT/Chapter1/<wbr>KaleidoscopeJIT.h</a></font></div><div><font face="monospace, monospace"> * This is from the same revision of LLVM I am using (the release_40 branch as of 4/8/2017)</font></div><div><font face="monospace, monospace"> */</font></div><div><font face="monospace, monospace">class KaleidoscopeJIT {</font></div><div><font face="monospace, monospace">private:</font></div><div><font face="monospace, monospace">    std::unique_ptr<TargetMachine> TM;</font></div><div><font face="monospace, monospace">    const DataLayout DL;</font></div><div><font face="monospace, monospace">    ObjectLinkingLayer<> ObjectLayer;</font></div><div><font face="monospace, monospace">    IRCompileLayer<decltype(<wbr>ObjectLayer)> CompileLayer;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">public:</font></div><div><font face="monospace, monospace">    typedef decltype(CompileLayer)::<wbr>ModuleSetHandleT ModuleHandle;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    KaleidoscopeJIT()</font></div><div><font face="monospace, monospace">            : TM(EngineBuilder().<wbr>selectTarget()), DL(TM->createDataLayout()),</font></div><div><font face="monospace, monospace">              CompileLayer(ObjectLayer, SimpleCompiler(*TM)) {</font></div><div><font face="monospace, monospace">        llvm::sys::DynamicLibrary::<wbr>LoadLibraryPermanently(<wbr>nullptr);</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    TargetMachine &getTargetMachine() { return *TM; }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    ModuleHandle addModule(std::unique_ptr<<wbr>Module> M) {</font></div><div><font face="monospace, monospace">        // Build our symbol resolver:</font></div><div><font face="monospace, monospace">        // Lambda 1: Look back into the JIT itself to find symbols that are part of</font></div><div><font face="monospace, monospace">        //           the same "logical dylib".</font></div><div><font face="monospace, monospace">        // Lambda 2: Search for external symbols in the host process.</font></div><div><font face="monospace, monospace">        auto Resolver = createLambdaResolver(</font></div><div><font face="monospace, monospace">                [&](const std::string &Name) {</font></div><div><font face="monospace, monospace">                    if (auto Sym = CompileLayer.findSymbol(Name, false))</font></div><div><font face="monospace, monospace">                        return Sym;</font></div><div><font face="monospace, monospace">                    return JITSymbol(nullptr);</font></div><div><font face="monospace, monospace">                },</font></div><div><font face="monospace, monospace">                [](const std::string &Name) {</font></div><div><font face="monospace, monospace">                    if (auto SymAddr =</font></div><div><font face="monospace, monospace">                            RTDyldMemoryManager::<wbr>getSymbolAddressInProcess(<wbr>Name))</font></div><div><font face="monospace, monospace">                        return JITSymbol(SymAddr, JITSymbolFlags::Exported);</font></div><div><font face="monospace, monospace">                    return JITSymbol(nullptr);</font></div><div><font face="monospace, monospace">                });</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">        // Build a singleton module set to hold our module.</font></div><div><font face="monospace, monospace">        std::vector<std::unique_ptr<<wbr>Module>> Ms;</font></div><div><font face="monospace, monospace">        Ms.push_back(std::move(M));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">        // Add the set to the JIT with the resolver we created above and a newly</font></div><div><font face="monospace, monospace">        // created SectionMemoryManager.</font></div><div><font face="monospace, monospace">        return CompileLayer.addModuleSet(std:<wbr>:move(Ms),</font></div><div><font face="monospace, monospace">                                         make_unique<<wbr>SectionMemoryManager>(),</font></div><div><font face="monospace, monospace">                                         std::move(Resolver));</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    JITSymbol findSymbol(const std::string Name) {</font></div><div><font face="monospace, monospace">        std::string MangledName;</font></div><div><font face="monospace, monospace">        raw_string_ostream MangledNameStream(MangledName)<wbr>;</font></div><div><font face="monospace, monospace">        Mangler::getNameWithPrefix(<wbr>MangledNameStream, Name, DL);</font></div><div><font face="monospace, monospace">        return CompileLayer.findSymbol(<wbr>MangledNameStream.str(), true);</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    void removeModule(ModuleHandle H) {</font></div><div><font face="monospace, monospace">        CompileLayer.removeModuleSet(<wbr>H);</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace">};</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">const std::string FUNC_NAME = "someFunction";</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">void runTest() {</font></div><div><font face="monospace, monospace">    llvm::LLVMContext context;</font></div><div><font face="monospace, monospace">    llvm::IRBuilder<> irBuilder{context};</font></div><div><font face="monospace, monospace">    KaleidoscopeJIT jit;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    auto module = std::make_unique<llvm::Module><wbr>("help", context);</font></div><div><font face="monospace, monospace">    module->setDataLayout(jit.<wbr>getTargetMachine().<wbr>createDataLayout());</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    auto function = llvm::cast<llvm::Function>(<wbr>module->getOrInsertFunction(<wbr>FUNC_NAME,</font></div><div><font face="monospace, monospace">                                                                           llvm::Type::getInt32Ty(<wbr>context), nullptr));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    auto block = llvm::BasicBlock::Create(<wbr>context, "functionBody", function);</font></div><div><font face="monospace, monospace">    irBuilder.SetInsertPoint(<wbr>block);</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    irBuilder.CreateRet(llvm::<wbr>ConstantInt::get(context, llvm::APInt(32, 1, true)));</font></div><div><font face="monospace, monospace">    jit.addModule(std::move(<wbr>module));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    llvm::JITSymbol symbol = jit.findSymbol(FUNC_NAME);</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    //Just to ensure that the symbol is in fact valid (symbol evaluates to true during execution)</font></div><div><font face="monospace, monospace">    if(!symbol) {</font></div><div><font face="monospace, monospace">        throw std::runtime_error("Symbol not found");</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    //when uncommented, the throw statement does NOT cause a SIGSEGV.</font></div><div><font face="monospace, monospace">    //throw std::runtime_error("This should not crash.");</font></div><div><font face="monospace, monospace">    uint64_t ptr = symbol.getAddress();</font></div><div><font face="monospace, monospace">    //HOWEVER... a SIGSEGV occurs during stack-unwinding while throwing the exception below.</font></div><div><font face="monospace, monospace">    //Hence, the call to symbol.getAddress() must be causing some kind of memory corruption.</font></div><div><font face="monospace, monospace">    //My guess is that it's clobbering the stack.</font></div><div><font face="monospace, monospace">    throw std::runtime_error("This should not crash but does anyway.");</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    std::cout << "Ptr is " << ptr << "\n";</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    int (*someFuncPtr)() = reinterpret_cast<int (*)()>(ptr);</font></div><div><font face="monospace, monospace">    //int (*someFuncPtr)() = (int (*)())ptr;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    int returnValue = someFuncPtr();</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    std::cout << "Return value is: " << returnValue << "\n";</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">int main(int argc, char **argv) {</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    llvm::InitializeNativeTarget()<wbr>;</font></div><div><font face="monospace, monospace">    llvm::<wbr>InitializeAllAsmPrinters();</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    try {</font></div><div><font face="monospace, monospace">        runTest();</font></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace">        //NOTE:  if LLVM is compiled without </font><span style="font-family:monospace,monospace">-DLLVM_USE_SANITIZER:<wbr>STRING=Address, the last throw in runTest() does not cause</span></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace">        //a SIGSEGV, however this throw will.</font></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div><font face="monospace, monospace">        //throw std::runtime_error("This should not crash but does anyway.");</font></div></div><div><span style="font-family:monospace,monospace">    } catch(std::runtime_error &e) {</span><br></div><div><font face="monospace, monospace">        std::cout << "Exception caught: " << e.what() << "\n";</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    llvm::llvm_shutdown();</font></div><div><font face="monospace, monospace">    return 0;</font></div><div><font face="monospace, monospace">}<br><br><br></font></div></blockquote></div><div><font face="arial, helvetica, sans-serif"><br></font></div></div>
<br>______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
<br></blockquote></div><br></div>