This is an archive of the discontinued LLVM Phabricator instance.

[RuntimeDyldELF] Fold Placeholder into Addend
ClosedPublic

Authored by loladiro on Apr 15 2015, 2:37 AM.

Details

Summary

This allows us to get rid of the original unrelocated object file after we're done processing relocations (but before applying them). Since we were already doing that anyway, this fixes the assertion failure uncovered in the MSVC build bots on my GOT commit. I have tested this on X86. I would appreciate if somebody could sanity check/test these changes on at least MIPS and ARM to make sure the remote mcjit tests don't regress. This represents my best understanding of how those relocations should work, but I may have missed something.

Diff Detail

Repository
rL LLVM

Event Timeline

loladiro updated this revision to Diff 23759.Apr 15 2015, 2:37 AM
loladiro retitled this revision from to [RuntimeDyldELF] Fold Placeholder into Addend.
loladiro updated this object.
loladiro edited the test plan for this revision. (Show Details)
loladiro added reviewers: lhames, petarj, t.p.northover.
loladiro set the repository for this revision to rL LLVM.
loladiro added a subscriber: Unknown Object (MLST).
lhames accepted this revision.Apr 15 2015, 2:25 PM
lhames edited edge metadata.

I don't have access to an ELF tester for this, but I can't see any problems on inspection. I think you should go ahead and commit, but maybe post a heads up to the dev-list. I'll chime in and recommend that ELF users take the time to write RuntimeDyldChecker regression tests for their architectures.

This revision is now accepted and ready to land.Apr 15 2015, 2:25 PM
This revision was automatically updated to reflect the committed changes.
labath added a subscriber: labath.Apr 16 2015, 1:59 AM

This commit seems to be causing regressions in the LLDB test suite http://lab.llvm.org:8011/builders/lldb-x86_64-ubuntu-14.04-cmake/builds/1698 on x86. I am not really sure what is going on, but reverting does fix the problem. Does this commit change the inferace of the code generator in any way? Should we adapt LLDB somehow?

In any case, I am going to revert this until we find a way to fix expression evaluation in LLDB.

I am getting the following backtrace from the test suite:

(gdb) bt full
#0  0x00007ffff0c2e88d in llvm::support::endian::read<unsigned int, (llvm::support::endianness)1, 1ul> (memory=0x6) at /usr/local/google/home/labath/ll/llvm/include/llvm/Support/Endian.h:53
        ret = 32767
#1  0x00007ffff37a5238 in llvm::support::detail::packed_endian_specific_integral<unsigned int, (llvm::support::endianness)1, 1ul>::ref::operator unsigned int (this=0x7fffffff8448)
    at /usr/local/google/home/labath/ll/llvm/include/llvm/Support/Endian.h:116
No locals.
#2  0x00007ffff37a1a84 in llvm::RuntimeDyldELF::processRelocationRef (this=0xfc4860, SectionID=2, 
    RelI=..., Obj=..., ObjSectionToID=std::map with 4 elements = {...}, 
    Stubs=std::map with 0 elements)
    at /usr/local/google/home/labath/ll/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp:1338
        RelType = 1
        Addend = 0
        Symbol = {<llvm::object::content_iterator<llvm::object::BasicSymbolRef>> = {<std::iterator<std::forward_iterator_tag, llvm::object::BasicSymbolRef, long, llvm::object::BasicSymbolRef*, llvm::object::BasicSymbolRef&>> = {<No data fields>}, Current = {SymbolPimpl = {d = {a = 16514800, b = 0}, 
                p = 16514800}, OwningObject = 0xfe0730}}, <No data fields>}
        TargetName = {static npos = 18446744073709551615, Data = 0xfbfd41 ".debug_abbrev", 
          Length = 13}
        Value = {SectionID = 3, Offset = 0, Addend = 0, SymbolName = 0x0}
        SymType = llvm::object::SymbolRef::ST_Debug
        gsi = {Ptr = 0xfd7730}
        Offset = 6
#3  0x00007ffff37806dd in llvm::RuntimeDyldImpl::loadObjectImpl (this=0xfc4860, Obj=...)
    at /usr/local/google/home/labath/ll/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp:238
        Stubs = std::map with 0 elements
        RelocatedSection = {<std::iterator<std::forward_iterator_tag, llvm::object::SectionRef, long, llvm::object::SectionRef*, llvm::object::SectionRef&>> = {<No data fields>}, Current = {
            SectionPimpl = {d = {a = 16515392, b = 0}, p = 16515392}, OwningObject = 0xfe0730}}
        I = {<std::iterator<std::forward_iterator_tag, llvm::object::RelocationRef, long, llvm::object::RelocationRef*, llvm::object::RelocationRef&>> = {<No data fields>}, Current = {RelocationPimpl = {
              d = {a = 8, b = 0}, p = 8}, OwningObject = 0xfe0730}}
        E = {<std::iterator<std::forward_iterator_tag, llvm::object::RelocationRef, long, llvm::object::RelocationRef*, llvm::object::RelocationRef&>> = {<No data fields>}, Current = {RelocationPimpl = {
              d = {a = 8, b = 11}, p = 47244640264}, OwningObject = 0xfe0730}}
        SectionID = 2
        IsCode = false
        SI = {<std::iterator<std::forward_iterator_tag, llvm::object::SectionRef, long, llvm::object::SectionRef*, llvm::object::SectionRef&>> = {<No data fields>}, Current = {SectionPimpl = {d = {
                a = 16515432, b = 0}, p = 16515432}, OwningObject = 0xfe0730}}
        SE = {<std::iterator<std::forward_iterator_tag, llvm::object::SectionRef, long, llvm::object::SectionRef*, llvm::object::SectionRef&>> = {<No data fields>}, Current = {SectionPimpl = {d = {
                a = 16516032, b = 0}, p = 16516032}, OwningObject = 0xfe0730}}
        locked = {M = @0xfc5500}
        SectionsAddedBeginIdx = 0
        LocalSections = std::map with 4 elements = {[{SectionPimpl = {d = {a = 16515352, b = 0}, 
              p = 16515352}, OwningObject = 0xfe0730}] = 3, [{SectionPimpl = {d = {a = 16515392, 
                b = 0}, p = 16515392}, OwningObject = 0xfe0730}] = 2, [{SectionPimpl = {d = {
                a = 16515152, b = 0}, p = 16515152}, OwningObject = 0xfe0730}] = 1, [{
            SectionPimpl = {d = {a = 16515272, b = 0}, p = 16515272}, OwningObject = 0xfe0730}] = 0}
        CommonSymbols = std::vector of length 0, capacity 0
        SectionsAddedEndIdx = 32767
#4  0x00007ffff379bf2e in llvm::RuntimeDyldELF::loadObject (this=0xfc4860, O=...)
    at /usr/local/google/home/labath/ll/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp:218
        SectionStartIdx = 32767
        SectionEndIdx = 4084749621
#5  0x00007ffff3783385 in llvm::RuntimeDyld::loadObject (this=0xf82b28, Obj=...)
    at /usr/local/google/home/labath/ll/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp:913
No locals.
#6  0x00007ffff36973ae in llvm::MCJIT::generateCodeForModule (this=0xf82a40, M=0xf1d9e0)
---Type <return> to continue, or q <return> to quit---
    at /usr/local/google/home/labath/ll/llvm/lib/ExecutionEngine/MCJIT/MCJIT.cpp:209
        locked = {M = @0xf82ad8}
        ObjectToLoad = std::unique_ptr<llvm::MemoryBuffer> containing 0xfbca50
        LoadedObject = {static isRef = false, {TStorage = {<llvm::AlignedCharArray<8, 8>> = {
                buffer = "0\a\376\000\000\000\000"}, <No data fields>}, 
            ErrorStorage = {<llvm::AlignedCharArray<8, 16>> = {
                buffer = "0\a\376\000\000\000\000\000h+\370\000\000\000\000"}, <No data fields>}}, 
          HasError = false}
        L = std::unique_ptr<llvm::RuntimeDyld::LoadedObjectInfo> containing 0xf1d9e0
#7  0x00007ffff36982cb in llvm::MCJIT::getPointerToFunction (this=0xf82a40, F=0xf7c6e0)
    at /usr/local/google/home/labath/ll/llvm/lib/ExecutionEngine/MCJIT/MCJIT.cpp:388
        locked = {M = @0xf82ad8}
        Mang = {DL = 0xf21020, 
          AnonGlobalIDs = {<llvm::DenseMapBase<llvm::DenseMap<llvm::GlobalValue const*, unsigned int, llvm::DenseMapInfo<llvm::GlobalValue const*>, llvm::detail::DenseMapPair<llvm::GlobalValue const*, unsigned int> >, llvm::GlobalValue const*, unsigned int, llvm::DenseMapInfo<llvm::GlobalValue const*>, llvm::detail::DenseMapPair<llvm::GlobalValue const*, unsigned int> >> = {<llvm::DebugEpochBase> = {
                Epoch = 0}, <No data fields>}, Buckets = 0x0, NumEntries = 0, NumTombstones = 0, 
            NumBuckets = 0}, NextAnonGlobalID = 1}
        Name = {<llvm::SmallVector<char, 128>> = {<llvm::SmallVectorImpl<char>> = {<llvm::SmallVectorTemplateBase<char, true>> = {<llvm::SmallVectorTemplateCommon<char, void>> = {<llvm::SmallVectorBase> = {BeginX = 0x7fffffff9410, EndX = 0x7fffffff942b, CapacityX = 0x7fffffff9490}, 
                  FirstEl = {<llvm::AlignedCharArray<1, 1>> = {
                      buffer = "$"}, <No data fields>}}, <No data fields>}, <No data fields>}, 
            Storage = {InlineElts = {{<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "_"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "_"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "l"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "l"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "d"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "b"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "_"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "v"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "a"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "l"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "i"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "d"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "_"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "p"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "o"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "i"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "n"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "t"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "e"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "r"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "_"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "c"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "h"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "e"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "c"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "k"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = ""}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = ""}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = ""}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = ""}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = ""}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "P"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "\224"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "\377"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "\377"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
---Type <return> to continue, or q <return> to quit---
                    buffer = "\377"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "\177"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = ""}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = ""}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "\b"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = "\n"}, <No data fields>}, {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = <incomplete sequence \365>}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "`"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\224"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\377"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\377"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\377"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\177"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\225"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\257"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = <incomplete sequence \322>}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = <incomplete sequence \361>}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\377"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\177"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "p"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\224"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\377"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\377"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\377"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\177"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\b"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\n"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = <incomplete sequence \365>}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\200"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\224"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\377"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\377"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\377"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\177"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "u"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\257"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = <incomplete sequence \322>}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {
---Type <return> to continue, or q <return> to quit---
                    buffer = <incomplete sequence \361>}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\377"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\177"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\220"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\224"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\377"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\377"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\377"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\177"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\b"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\n"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = <incomplete sequence \365>}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\240"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\224"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\377"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\377"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\377"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\177"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "U"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\257"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = <incomplete sequence \322>}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = <incomplete sequence \361>}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\377"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = "\177"}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {buffer = ""}, <No data fields>}, 
                {<llvm::AlignedCharArray<1, 1>> = {
                    buffer = ""}, <No data fields>}}}}, <No data fields>}
        M = 0xf1d9e0
        HasBeenAddedButNotLoaded = true
#8  0x00007ffff1d258af in lldb_private::IRExecutionUnit::GetRunnableInfo (this=0xf50980, error=..., 
    func_addr=@0xe3eab8: 18446744073709551615, func_end=@0xe3eac0: 18446744073709551615)
    at /usr/local/google/home/labath/ll/llvm/tools/lldb/source/Expression/IRExecutionUnit.cpp:334
        s_runnable_info_mutex = {m_mutex = {__data = {__lock = 1, __count = 1, __owner = 29073, 
              __nusers = 1, __kind = 1, __spins = 0, __elision = 0, __list = {__prev = 0x0, 
                __next = 0x0}}, 
            __size = "\001\000\000\000\001\000\000\000\221q\000\000\001\000\000\000\001", '\000' <repeats 22 times>, __align = 4294967297}}
        process_sp = warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::process_gdb_remote::ProcessGDBRemote*, (__gnu_cxx::_Lock_policy)2>'
warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::process_gdb_remote::ProcessGDBRemote*, (__gnu_cxx::_Lock_policy)2>'
std::shared_ptr (count 8, weak 13) 0xd2c800
        runnable_info_mutex_locker = {
          m_mutex_ptr = 0x7ffff5c48338 <lldb_private::IRExecutionUnit::GetRunnableInfo(lldb_private::Error&, unsigned long&, unsigned long&)::s_runnable_info_mutex>}
        log = 0x0
        error_string = ""
        triple = {Data = "i386-unknown-linux-gnu", Arch = llvm::Triple::x86, 
          SubArch = llvm::Triple::NoSubArch, Vendor = llvm::Triple::UnknownVendor, 
          OS = llvm::Triple::Linux, Environment = llvm::Triple::GNU, 
---Type <return> to continue, or q <return> to quit---
          ObjectFormat = llvm::Triple::ELF}
        function = 0xf7c6e0
        relocModel = llvm::Reloc::Static
        codeModel = llvm::CodeModel::JITDefault
        builder = {M = std::unique_ptr<llvm::Module> containing 0x0, 
          WhichEngine = llvm::EngineKind::JIT, ErrorStr = 0x7fffffff99b0, 
          OptLevel = llvm::CodeGenOpt::Less, MemMgr = std::shared_ptr (empty) 0x0, 
          Resolver = std::shared_ptr (empty) 0x0, Options = {PrintMachineCode = 0, 
            NoFramePointerElim = 0, LessPreciseFPMADOption = 0, UnsafeFPMath = 0, NoInfsFPMath = 0, 
            NoNaNsFPMath = 0, HonorSignDependentRoundingFPMathOption = 0, UseSoftFloat = 0, 
            NoZerosInBSS = 0, JITEmitDebugInfo = 0, JITEmitDebugInfoToDisk = 0, 
            GuaranteedTailCallOpt = 0, DisableTailCalls = 0, StackAlignmentOverride = 0, 
            EnableFastISel = 0, PositionIndependentExecutable = 0, UseInitArray = 0, 
            DisableIntegratedAS = 0, CompressDebugSections = 0, FunctionSections = 0, 
            DataSections = 0, UniqueSectionNames = 1, TrapUnreachable = 0, TrapFuncName = "", 
            FloatABIType = llvm::FloatABI::Default, AllowFPOpFusion = llvm::FPOpFusion::Standard, 
            JTType = llvm::JumpTable::Single, FCFI = false, ThreadModel = llvm::ThreadModel::POSIX, 
            CFIType = llvm::CFIntegrity::Sub, CFIEnforcing = false, CFIFuncName = "", MCOptions = {
              SanitizeAddress = false, MCRelaxAll = false, MCNoExecStack = false, 
              MCFatalWarnings = false, MCSaveTempLabels = false, MCUseDwarfDirectory = false, 
              ShowMCEncoding = false, ShowMCInst = false, AsmVerbose = false, DwarfVersion = 0, 
              ABIName = ""}}, RelocModel = llvm::Reloc::Static, 
          CMModel = llvm::CodeModel::JITDefault, MArch = "", MCPU = "", 
          MAttrs = {<llvm::SmallVectorImpl<std::basic_string<char> >> = {<llvm::SmallVectorTemplateBase<std::basic_string<char>, false>> = {<llvm::SmallVectorTemplateCommon<std::basic_string<char>, void>> = {<llvm::SmallVectorBase> = {BeginX = 0x7fffffff98f8, EndX = 0x7fffffff98f8, 
                    CapacityX = 0x7fffffff9918}, FirstEl = {<llvm::AlignedCharArray<8, 8>> = {
                      buffer = "\230\231\377\377\377\177\000"}, <No data fields>}}, <No data fields>}, <No data fields>}, Storage = {InlineElts = {{<llvm::AlignedCharArray<8, 8>> = {
                    buffer = " \231\377\377\377\177\000"}, <No data fields>}, 
                {<llvm::AlignedCharArray<8, 8>> = {
                    buffer = "\362j\271\360\377\377\377\377"}, <No data fields>}, 
                {<llvm::AlignedCharArray<8, 8>> = {
                    buffer = "\340\306\367\000\000\000\000"}, <No data fields>}}}}, 
          VerifyModules = true, UseOrcMCJITReplacement = false}
        mArch = {static npos = 18446744073709551615, Data = 0x0, Length = 0}
        mCPU = {static npos = 18446744073709551615, Data = 0x0, Length = 0}
        mAttrs = {<llvm::SmallVectorImpl<std::basic_string<char> >> = {<llvm::SmallVectorTemplateBase<std::basic_string<char>, false>> = {<llvm::SmallVectorTemplateCommon<std::basic_string<char>, void>> = {<llvm::SmallVectorBase> = {BeginX = 0x7fffffff97f0, EndX = 0x7fffffff97f0, 
                  CapacityX = 0x7fffffff97f0}, FirstEl = {<llvm::AlignedCharArray<8, 8>> = {
                    buffer = "p\230\377\377\377\177\000"}, <No data fields>}}, <No data fields>}, <No data fields>}, Storage = {<No data fields>}}
        target_machine = 0xf21010
        fun_ptr = 0x1007ffff1a01e28
#9  0x00007ffff1d55bd2 in lldb_private::ClangExpressionParser::PrepareForExecution (
    this=0x7fffffff9de8, func_addr=@0xe3eab8: 18446744073709551615, 
    func_end=@0xe3eac0: 18446744073709551615, execution_unit_sp=warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::IRExecutionUnit*, (__gnu_cxx::_Lock_policy)2>'
warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::IRExecutionUnit*, (__gnu_cxx::_Lock_policy)2>'
 
std::shared_ptr (count 1, weak 1) 0xf50980, exe_ctx=..., can_interpret=@0x7fffffff9ddf: true, 
    execution_policy=lldb_private::eExecutionPolicyAlways)
    at /usr/local/google/home/labath/ll/llvm/tools/lldb/source/Expression/ClangExpressionParser.cpp:589
        ir_for_target = {<llvm::ModulePass> = {<llvm::Pass> = {
              _vptr$Pass = 0x7ffff5b311f0 <vtable for IRForTarget+16>, Resolver = 0x0, 
              PassID = 0x7ffff5c483b8 <_ZL2ID>, Kind = llvm::PT_Module}, <No data fields>}, 
          m_resolve_vars = false, m_func_name = "$__lldb_valid_pointer_check", m_result_name = {
            m_string = 0x0}, m_result_type = warning: RTTI symbol not found for class 'lldb_private::TaggedASTType<0u>'
{<lldb_private::ClangASTType> = {m_type = 0x0, 
              m_ast = 0x0}, 
            _vptr$TaggedASTType = 0x7ffff5a83890 <vtable for lldb_private::TaggedASTType<0u>+16>}, 
          m_module = 0xf1d9e0, 
---Type <return> to continue, or q <return> to quit---
          m_target_data = std::unique_ptr<llvm::DataLayout> containing 0xf7b100, 
          m_decl_map = 0xe9fd30, m_data_allocator = {m_execution_unit = @0xf50980, 
            m_stream_string = {<lldb_private::Stream> = {
                _vptr$Stream = 0x7ffff5b2e920 <vtable for lldb_private::StreamString+16>, m_flags = {
                  m_flags = 8}, m_addr_size = 4, m_byte_order = lldb::eByteOrderLittle, 
                m_indent_level = 0}, m_packet = ""}, m_allocation = 18446744073709551615}, 
          m_CFStringCreateWithBytes = 0x0, m_sel_registerName = 0x0, m_intptr_ty = 0xf1cee0, 
          m_error_stream = 0xb3f920, m_result_store = 0x0, m_result_is_pointer = false, 
          m_reloc_placeholder = 0xf7f1d8, m_entry_instruction_finder = {
            m_maker = {<std::_Maybe_unary_or_binary_function<llvm::Value*, llvm::Function*>> = {<std::unary_function<llvm::Function*, llvm::Value*>> = {<No data fields>}, <No data fields>}, <std::_Function_base> = {static _M_max_size = 16, static _M_max_align = 8, _M_functor = {_M_unused = {
                    _M_object = 0x7ffff1d61c50 <FindEntryInstruction(llvm::Function*)>, 
                    _M_const_object = 0x7ffff1d61c50 <FindEntryInstruction(llvm::Function*)>, 
                    _M_function_pointer = 0x7ffff1d61c50 <FindEntryInstruction(llvm::Function*)>, 
                    _M_member_pointer = <error reading variable>, 
                  _M_pod_data = "P\034\326\361\377\177\000\000d^\324\361\377\177\000"}, 
                _M_manager = 0x7ffff1d70020 <std::_Function_base::_Base_manager<llvm::Value* (*)(llvm::Function*)>::_M_manager(std::_Any_data&, std::_Any_data const&, std::_Manager_operation)>}, 
              _M_invoker = 0x7ffff1d6ffe0 <std::_Function_handler<llvm::Value* (llvm::Function*), llvm::Value* (*)(llvm::Function*)>::_M_invoke(std::_Any_data const&, llvm::Function*)>}, 
            m_values = std::map with 0 elements}}
        ir_can_run = true
        process = 0xd2c800
        error_stream = 0xb3f920
        target = 0xd0b280
        interpret_error = {m_code = 0, m_type = lldb::eErrorTypeInvalid, m_string = ""}
        log = 0x0
        llvm_module_ap = std::unique_ptr<llvm::Module> containing 0x0
        function_name = {m_string = 0xf03cf8 "$__lldb_valid_pointer_check"}
        decl_map = 0xe9fd30
        err = {m_code = 0, m_type = lldb::eErrorTypeInvalid, m_string = ""}
#10 0x00007ffff1d91bf6 in lldb_private::ClangUtilityFunction::Install (this=0xe3eaa0, 
    error_stream=..., exe_ctx=...)
    at /usr/local/google/home/labath/ll/llvm/tools/lldb/source/Expression/ClangUtilityFunction.cpp:144
        target = 0xd0b280
        process = 0xd2c800
        keep_result_in_memory = false
        generate_debug_info = true
        parser = {m_expr = @0xe3eaa0, 
          m_llvm_context = std::unique_ptr<llvm::LLVMContext> containing 0x0, 
          m_file_manager = std::unique_ptr<clang::FileManager> containing 0xefa6d0, 
          m_compiler = std::unique_ptr<clang::CompilerInstance> containing 0xef9570, 
          m_builtin_context = std::unique_ptr<clang::Builtin::Context> containing 0xed26e0, 
          m_selector_table = std::unique_ptr<clang::SelectorTable> containing 0xea3c00, 
          m_code_generator = std::unique_ptr<clang::CodeGenerator> containing 0xf1d810, 
          m_pp_callbacks = 0x0}
        num_errors = 0
        can_interpret = true
        jit_error = {m_code = 0, m_type = lldb::eErrorTypeInvalid, m_string = ""}
#11 0x00007ffff1d5dc1e in lldb_private::DynamicCheckerFunctions::Install (this=0xe9f010, 
    error_stream=..., exe_ctx=...)
    at /usr/local/google/home/labath/ll/llvm/tools/lldb/source/Expression/IRDynamicChecks.cpp:57
        process = 0x7fffffff9fa0
#12 0x00007ffff1d55a22 in lldb_private::ClangExpressionParser::PrepareForExecution (
    this=0x7fffffffa330, func_addr=@0xea8388: 18446744073709551615, 
 
    func_end=@0xea8390: 18446744073709551615, execution_unit_sp=warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::IRExecutionUnit*, (__gnu_cxx::_Lock_policy)2>'
warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::IRExecutionUnit*, (__gnu_cxx::_Lock_policy)2>'
 
std::shared_ptr (count 1, weak 1) 0xf064b0, exe_ctx=..., can_interpret=@0xea8440: false, 
    execution_policy=lldb_private::eExecutionPolicyOnlyWhenNeeded)
---Type <return> to continue, or q <return> to quit---
    at /usr/local/google/home/labath/ll/llvm/tools/lldb/source/Expression/ClangExpressionParser.cpp:563
        dynamic_checkers = 0xe9f010
        install_errors = {<lldb_private::Stream> = {
            _vptr$Stream = 0x7ffff5b2e920 <vtable for lldb_private::StreamString+16>, m_flags = {
              m_flags = 0}, m_addr_size = 4, m_byte_order = lldb::eByteOrderBig, 
            m_indent_level = 0}, m_packet = ""}
        ir_dynamic_checks = {<llvm::ModulePass> = {<llvm::Pass> = {_vptr$Pass = 0x7fffffffa0e8, 
              Resolver = 0x7fffffffa348, PassID = 0x7fffffffa0d8, 
              Kind = 4122151664}, <No data fields>}, 
          m_func_name = "\320U\361\000\000\000\000\000@\023\361\000\000\000\000\000\320\325\355\000\000\000\000\000\220\353\343", '\000' <repeats 13 times>, "\360\310\322\000\000\000\000\000\000\310\322\000\000\000\000\000p\203\352\000\000\000\000\000P\202\343\000\000\000\000\000\030\000\000\000\000\000\000\000`\200\321\361\377\177\000\000\060\200\321\361\377\177\000\000@\204\355\000\000\000\000\000\243|\354\365\377\177\000\000`\200\321\361\377\177\000\000\060\200\321\361\377\177\000\000\200\262\320\000\000\000\000\000 \244\377\377\004\000\000\000\300_\323\000\000\000\000\000p\203\352\000\000\000\000\000\000\063\361\000\000\000\000\000 \244\377\377\377\177\000\000\001m\270\361\377\177\000\000\000\063\361\000\000\000\000\000\300\245\377\377\377\177\000\000"..., m_checker_functions = @0x7ffff1c1a326}
        ir_for_target = {<llvm::ModulePass> = {<llvm::Pass> = {
              _vptr$Pass = 0x7ffff5b311f0 <vtable for IRForTarget+16>, Resolver = 0x0, 
              PassID = 0x7ffff5c483b8 <_ZL2ID>, Kind = llvm::PT_Module}, <No data fields>}, 
          m_resolve_vars = true, m_func_name = "_ZN1AIiE12$__lldb_exprEPv", m_result_name = {
            m_string = 0xf03be0 "$RESULT_NAME"}, m_result_type = warning: RTTI symbol not found for class 'lldb_private::TaggedASTType<0u>'
{<lldb_private::ClangASTType> = {
              m_type = 0xf0b530, m_ast = 0xe39ee0}, 
            _vptr$TaggedASTType = 0x7ffff5a83890 <vtable for lldb_private::TaggedASTType<0u>+16>}, 
          m_module = 0xf0d4a0, 
          m_target_data = std::unique_ptr<llvm::DataLayout> containing 0xe14f30, 
          m_decl_map = 0xedb440, m_data_allocator = {m_execution_unit = @0xf064b0, 
            m_stream_string = {<lldb_private::Stream> = {
                _vptr$Stream = 0x7ffff5b2e920 <vtable for lldb_private::StreamString+16>, m_flags = {
                  m_flags = 8}, m_addr_size = 4, m_byte_order = lldb::eByteOrderLittle, 
                m_indent_level = 0}, m_packet = ""}, m_allocation = 18446744073709551615}, 
          m_CFStringCreateWithBytes = 0x0, m_sel_registerName = 0x0, m_intptr_ty = 0xf0ca60, 
          m_error_stream = 0xb3f920, m_result_store = 0x0, m_result_is_pointer = true, 
          m_reloc_placeholder = 0xe3e9c8, m_entry_instruction_finder = {
            m_maker = {<std::_Maybe_unary_or_binary_function<llvm::Value*, llvm::Function*>> = {<std::unary_function<llvm::Function*, llvm::Value*>> = {<No data fields>}, <No data fields>}, <std::_Function_base> = {static _M_max_size = 16, static _M_max_align = 8, _M_functor = {_M_unused = {
                    _M_object = 0x7ffff1d61c50 <FindEntryInstruction(llvm::Function*)>, 
                    _M_const_object = 0x7ffff1d61c50 <FindEntryInstruction(llvm::Function*)>, 
                    _M_function_pointer = 0x7ffff1d61c50 <FindEntryInstruction(llvm::Function*)>, 
                    _M_member_pointer = <error reading variable>, 
                  _M_pod_data = "P\034\326\361\377\177\000\000d^\324\361\377\177\000"}, 
                _M_manager = 0x7ffff1d70020 <std::_Function_base::_Base_manager<llvm::Value* (*)(llvm::Function*)>::_M_manager(std::_Any_data&, std::_Any_data const&, std::_Manager_operation)>}, 
              _M_invoker = 0x7ffff1d6ffe0 <std::_Function_handler<llvm::Value* (llvm::Function*), llvm::Value* (*)(llvm::Function*)>::_M_invoke(std::_Any_data const&, llvm::Function*)>}, 
            m_values = std::map with 1 elements = {[0xea1da0] = 0xea2428}}}
        ir_can_run = true
        process = 0xd2c800
        error_stream = 0xb3f920
        target = 0xd0b280
        interpret_error = {m_code = 4294967295, m_type = lldb::eErrorTypeGeneric, 
          m_string = "Interpreter doesn't handle one of the expression's opcodes"}
        log = 0x0
        llvm_module_ap = std::unique_ptr<llvm::Module> containing 0x0
        function_name = {m_string = 0xf03bb0 "_ZN1AIiE12$__lldb_exprEPv"}
        decl_map = 0xedb440
        err = {m_code = 0, m_type = lldb::eErrorTypeInvalid, m_string = ""}
#13 0x00007ffff1d15d82 in lldb_private::ClangUserExpression::Parse (this=0xea8370, error_stream=..., 
---Type <return> to continue, or q <return> to quit---
    exe_ctx=..., execution_policy=lldb_private::eExecutionPolicyOnlyWhenNeeded, 
    keep_result_in_memory=true, generate_debug_info=false)
    at /usr/local/google/home/labath/ll/llvm/tools/lldb/source/Expression/ClangUserExpression.cpp:560
        log = 0x0
        err = {m_code = 0, m_type = lldb::eErrorTypeInvalid, m_string = ""}
        m_transformed_stream = {<lldb_private::Stream> = {
            _vptr$Stream = 0x7ffff5b2e920 <vtable for lldb_private::StreamString+16>, m_flags = {
              m_flags = 0}, m_addr_size = 4, m_byte_order = lldb::eByteOrderBig, 
            m_indent_level = 0}, m_packet = ""}
        prefix = ""
        source_code = std::unique_ptr<lldb_private::ExpressionSourceCode> containing 0xd35fc0
        lang_type = lldb::eLanguageTypeC_plus_plus
        target = 0xd0b280
        on_exit = {
          m_callback = {<std::_Maybe_unary_or_binary_function<void>> = {<No data fields>}, <std::_Function_base> = {static _M_max_size = 16, static _M_max_align = 8, _M_functor = {_M_unused = {
                  _M_object = 0xed8440, _M_const_object = 0xed8440, _M_function_pointer = 0xed8440, 
                  _M_member_pointer = <error reading variable>, 
                _M_pod_data = "@\204\355\000\000\000\000\000\243|\354\365\377\177\000"}, 
              _M_manager = 0x7ffff1d18060 <std::_Function_base::_Base_manager<lldb_private::ClangUserExpression::Parse(lldb_private::Stream&, lldb_private::ExecutionContext&, lldb_private::ExecutionPolicy, bool, bool)::$_1>::_M_manager(std::_Any_data&, std::_Any_data const&, std::_Manager_operation)>}, 
            _M_invoker = 0x7ffff1d18030 <std::_Function_handler<void (), lldb_private::ClangUserExpression::Parse(lldb_private::Stream&, lldb_private::ExecutionContext&, lldb_private::ExecutionPolicy, bool, bool)::$_1>::_M_invoke(std::_Any_data const&)>}}
        process = 0xd2c800
        exe_scope = 0xd2c8f0
        parser = {m_expr = @0xea8370, 
          m_llvm_context = std::unique_ptr<llvm::LLVMContext> containing 0x0, 
          m_file_manager = std::unique_ptr<clang::FileManager> containing 0xf15290, 
          m_compiler = std::unique_ptr<clang::CompilerInstance> containing 0xf155d0, 
          m_builtin_context = std::unique_ptr<clang::Builtin::Context> containing 0xf11340, 
          m_selector_table = std::unique_ptr<clang::SelectorTable> containing 0xedd5d0, 
          m_code_generator = std::unique_ptr<clang::CodeGenerator> containing 0xe3eb90, 
          m_pp_callbacks = 0x0}
        num_errors = 0
        jit_error = {m_code = 0, m_type = lldb::eErrorTypeInvalid, m_string = ""}
#14 0x00007ffff1d178ff in lldb_private::ClangUserExpression::Evaluate (exe_ctx=..., options=..., 
    expr_cstr=0xf155ab "(int)getpid(); m_a", expr_prefix=0x0, result_valobj_sp=..., error=...)
    at /usr/local/google/home/labath/ll/llvm/tools/lldb/source/Expression/ClangUserExpression.cpp:1041
        log = 0x0
        execution_policy = lldb_private::eExecutionPolicyOnlyWhenNeeded
        language = lldb::eLanguageTypeUnknown
        desired_type = lldb_private::ClangExpression::eResultTypeAny
        execution_results = lldb::eExpressionSetupError
        process = 0xd2c800
        user_expression_sp = warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::ClangUserExpression*, (__gnu_cxx::_Lock_policy)2>'
warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::ClangUserExpression*, (__gnu_cxx::_Lock_policy)2>'
std::shared_ptr (count 1, weak 0) 0xea8370
        error_stream = {<lldb_private::Stream> = {
            _vptr$Stream = 0x7ffff5b2e920 <vtable for lldb_private::StreamString+16>, m_flags = {
              m_flags = 0}, m_addr_size = 4, m_byte_order = lldb::eByteOrderBig, 
            m_indent_level = 0}, 
          m_packet = "warning: function 'getpid' has internal linkage but is not defined\nnote: used here\n"}
        keep_expression_in_memory = true
        generate_debug_info = false
#15 0x00007ffff1f09bcb in lldb_private::Target::EvaluateExpression (this=0xd0b280, 
    expr_cstr=0xf155ab "(int)getpid(); m_a", frame=0x7fffd800bae0, result_valobj_sp=..., options=...)
    at /usr/local/google/home/labath/ll/llvm/tools/lldb/source/Target/Target.cpp:2020
        prefix = 0x0
---Type <return> to continue, or q <return> to quit---
        error = {m_code = 0, m_type = lldb::eErrorTypeInvalid, m_string = ""}
        execution_results = lldb::eExpressionSetupError
        old_suppress_value = false
        exe_ctx = {m_target_sp = warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::Target*, (__gnu_cxx::_Lock_policy)2>'
warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::Target*, (__gnu_cxx::_Lock_policy)2>'
std::shared_ptr (count 20, weak 12) 0xd0b280, m_process_sp = warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::process_gdb_remote::ProcessGDBRemote*, (__gnu_cxx::_Lock_policy)2>'
warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::process_gdb_remote::ProcessGDBRemote*, (__gnu_cxx::_Lock_policy)2>'
 
std::shared_ptr (count 8, weak 13) 0xd2c800, m_thread_sp = warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::process_gdb_remote::ThreadGDBRemote*, (__gnu_cxx::_Lock_policy)2>'
warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::process_gdb_remote::ThreadGDBRemote*, (__gnu_cxx::_Lock_policy)2>'
 
std::shared_ptr (count 7, weak 12) 0xd3df20, m_frame_sp = warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::StackFrame*, (__gnu_cxx::_Lock_policy)2>'
warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::StackFrame*, (__gnu_cxx::_Lock_policy)2>'
 
std::shared_ptr (count 6, weak 1) 0x7fffd800bae0}
        persistent_var_sp = std::shared_ptr (empty) 0x0
#16 0x00007ffff21841f9 in lldb_private::CommandObjectExpression::EvaluateExpression (this=0xb459e0, 
    expr=0xf155ab "(int)getpid(); m_a", output_stream=0xd1a1b0, error_stream=0xd1a208, 
    result=0xd1a1b0)
    at /usr/local/google/home/labath/ll/llvm/tools/lldb/source/Commands/CommandObjectExpression.cpp:312
        result_valobj_sp = {ptr_ = 0x0, cntrl_ = 0x0}
        keep_in_memory = true
        options = {static default_timeout = 500000, 
          m_execution_policy = lldb_private::eExecutionPolicyOnlyWhenNeeded, 
          m_language = lldb::eLanguageTypeUnknown, m_coerce_to_id = false, m_unwind_on_error = true, 
          m_ignore_breakpoints = true, m_keep_in_memory = true, m_try_others = true, 
          m_stop_others = true, m_debug = false, m_trap_exceptions = true, 
          m_generate_debug_info = false, m_result_is_internal = false, 
          m_use_dynamic = lldb::eNoDynamicValues, m_timeout_usec = 0, m_one_thread_timeout_usec = 0, 
          m_cancel_callback = 0x0, m_cancel_callback_baton = 0x0}
        exe_ctx = {m_target_sp = warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::Target*, (__gnu_cxx::_Lock_policy)2>'
warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::Target*, (__gnu_cxx::_Lock_policy)2>'
std::shared_ptr (count 20, weak 12) 0xd0b280, m_process_sp = warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::process_gdb_remote::ProcessGDBRemote*, (__gnu_cxx::_Lock_policy)2>'
warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::process_gdb_remote::ProcessGDBRemote*, (__gnu_cxx::_Lock_policy)2>'
 
std::shared_ptr (count 8, weak 13) 0xd2c800, m_thread_sp = warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::process_gdb_remote::ThreadGDBRemote*, (__gnu_cxx::_Lock_policy)2>'
warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::process_gdb_remote::ThreadGDBRemote*, (__gnu_cxx::_Lock_policy)2>'
 
std::shared_ptr (count 7, weak 12) 0xd3df20, m_frame_sp = warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::StackFrame*, (__gnu_cxx::_Lock_policy)2>'
warning: RTTI symbol not found for class 'std::_Sp_counted_ptr<lldb_private::StackFrame*, (__gnu_cxx::_Lock_policy)2>'
 
std::shared_ptr (count 6, weak 1) 0x7fffd800bae0}
        target = 0xd0b280
#17 0x00007ffff2184cd1 in lldb_private::CommandObjectExpression::DoExecute (this=0xb459e0, 
    command=0xf155a8 "-- (int)getpid(); m_a", result=...)
    at /usr/local/google/home/labath/ll/llvm/tools/lldb/source/Commands/CommandObjectExpression.cpp:514
        expr = 0xf155ab "(int)getpid(); m_a"
#18 0x00007ffff1db7052 in lldb_private::CommandObjectRaw::Execute (this=0xb459e0, 
    args_string=0xf155a8 "-- (int)getpid(); m_a", result=...)
    at /usr/local/google/home/labath/ll/llvm/tools/lldb/source/Interpreter/CommandObject.cpp:1103
        handled = false

Steps to reproduce:
build lldb
cd test
./dotest.py -A x86 --executable path/to/built/lldb -p TestCPPThis.py

The expression we are evaluating is "(int)getpid(); m_a" (where m_a is a local variable), but I think it happens on pretty much any expression. Please let me know if I can somehow help you with this.

Hi Pavel, I'm finally getting around to trying to track down the LLDB failure and reapplying this. I had a patch that I thought should fix this, but I'm still getting failures with ninja check-lldb even though the command you listed succeeds. Any ideas on how I can reproduce outside the test suite?

Hello,

I would compare the list of test suite failures before and after applying your patch. If the results are the same then I think you are good to go.

Also, which system are you working on? We are trying to keep the linux build green (although failures still do creep up pretty often), but the Mac build is pretty much constantly red.

Judging by the tests that were failing originally, I think the original patch broke LLDB expression evaluation completely, so I think you can reproduce it by just loading any program into LLDB and evaluating random expressions. I.e., something like this:

labath /tmp $ cat a.cc
#include <cstdio>

int main() {
    int a = 4;
    int b = 7;
    printf("%d\n", a+b);
    return 0;
}
labath /tmp $ clang -g a.cc
labath /tmp $ ~/ll/build/dbg/bin/lldb a.out
(lldb) target create "a.out"
Current executable set to 'a.out' (x86_64).
(lldb) b 6
Breakpoint 1: where = a.out`main + 39 at a.cc:6, address = 0x0000000000400557
(lldb) r
Process 11820 launched: '/tmp/a.out' (x86_64)
Process 11820 stopped
* thread #1: tid = 11820, 0x0000000000400557 a.out`main + 39 at a.cc:6, name = 'a.out', stop reason = breakpoint 1.1
    frame #0: 0x0000000000400557 a.out`main + 39 at a.cc:6
   3   	int main() {
   4   	    int a = 4;
   5   	    int b = 7;
-> 6   	    printf("%d\n", a+b);
   7   	    return 0;
   8   	}
(lldb) expr a
(int) $0 = 4
(lldb) expr a+b
(int) $1 = 11
(lldb) expr getpid()
error: 'getpid' has unknown return type; cast the call to its declared return type
error: 1 errors parsing expression
(lldb) expr (int)getpid()
(int) $2 = 11820
...

Is this what you had in mind? If you want to reproduce a specific test case, you can go into the test/ directory and find the corresponding .py file. Inside you should find the exact expressions it is trying to evaluate, and in the same folder you can find the .c file, which it is testing. However, it is usually just easier to use the test runner (dotest.py) to run a single test case (you can run dotest in a debugger if you like).

Also, feel free to drop me a revised version of the patch. I'd be happy to check it out locally and see if things work now.

cheers,
pl

I tried a few things for expression evaluation and they worked fine. I'm looking into it more. For the record the patch I thought would fix the problem is:

diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
index a13ecb7..24a3ec1 100644
--- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
+++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
@@ -574,10 +574,16 @@ unsigned RuntimeDyldImpl::emitSection(const ObjectFile &Obj,
   uint8_t *Addr;
   const char *pData = nullptr;

+  // In either case, set the location of the unrelocated section in memory,
+  // since we still process relocations for it even if we're not applying them.
+  Check(Section.getContents(data));
+  // Virtual sections have no data in the object image, so leave pData = 0
+  if (!IsVirtual)
+    pData = data.data();
+
   // Some sections, such as debug info, don't need to be loaded for execution.
   // Leave those where they are.
   if (IsRequired) {
-    Check(Section.getContents(data));
     Allocate = DataSize + PaddingSize + StubBufSize;
     if (!Allocate)
       Allocate = 1;
@@ -588,10 +594,6 @@ unsigned RuntimeDyldImpl::emitSection(const ObjectFile &Obj,
     if (!Addr)
       report_fatal_error("Unable to allocate section memory!");

-    // Virtual sections have no data in the object image, so leave pData = 0
-    if (!IsVirtual)
-      pData = data.data();
-
     // Zero-initialize or copy the data from the image
     if (IsZeroInit || IsVirtual)
       memset(Addr, 0, DataSize);

Hi Pavel, just to be sure, I ran the tests again without both patches and the same tests fail (I didn't see them a couple of weeks ago), but they seem to be unrelated to this patch now. Can you verify that reapplying my patch plus the additional patch I just posted works for you as well?

labath added a comment.May 1 2015, 4:29 AM

Hi,

I just tested the patch + the update and everything works fine. OK to commit. Thanks for fixing this.

cheers,
pl

This is really great work. Thanks again for this Keno!

  • Lang.