77#include < llvm/DebugInfo/DWARF/DWARFContext.h>
88#include < llvm/Object/SymbolSize.h>
99#include < llvm/Support/MemoryBuffer.h>
10+ #include < llvm/Support/MemoryBufferRef.h>
1011#include < llvm/IR/Function.h>
1112#include < llvm/ADT/StringRef.h>
1213#include < llvm/ADT/StringMap.h>
@@ -335,8 +336,12 @@ void JITDebugInfoRegistry::registerJITObject(const object::ObjectFile &Object,
335336#endif // defined(_OS_X86_64_)
336337#endif // defined(_OS_WINDOWS_)
337338
338- auto ObjectCopy = new LazyObjectInfo{MemoryBuffer::getMemBufferCopy (Object.getData ())}; // intentionally leaked so that we don't need to ref-count it
339+ SmallVector<uint8_t , 0 > packed;
340+ compression::zlib::compress (ArrayRef<uint8_t >((uint8_t *)Object.getData ().data (), Object.getData ().size ()), packed, compression::zlib::DefaultCompression);
341+ jl_jit_add_bytes (packed.size ());
342+ auto ObjectCopy = new LazyObjectInfo{packed, Object.getData ().size ()}; // intentionally leaked so that we don't need to ref-count it, intentionally copied so that we exact-size the allocation (since no shrink_to_fit function)
339343 auto symbols = object::computeSymbolSizes (Object);
344+ bool hassection = false ;
340345 for (const auto &sym_size : symbols) {
341346 const object::SymbolRef &sym_iter = sym_size.first ;
342347 object::SymbolRef::Type SymbolType = cantFail (sym_iter.getType ());
@@ -385,6 +390,7 @@ void JITDebugInfoRegistry::registerJITObject(const object::ObjectFile &Object,
385390 jl_profile_atomic ([&]() JL_NOTSAFEPOINT {
386391 if (mi)
387392 linfomap[Addr] = std::make_pair (Size, mi);
393+ hassection = true ;
388394 objectmap.insert (std::pair{SectionLoadAddr, SectionInfo{
389395 ObjectCopy,
390396 (size_t )SectionSize,
@@ -393,6 +399,8 @@ void JITDebugInfoRegistry::registerJITObject(const object::ObjectFile &Object,
393399 }});
394400 });
395401 }
402+ if (!hassection) // clang-sa demands that we do this to fool cplusplus.NewDeleteLeaks
403+ delete ObjectCopy;
396404}
397405
398406void jl_register_jit_object (const object::ObjectFile &Object,
@@ -1211,13 +1219,32 @@ int jl_DI_for_fptr(uint64_t fptr, uint64_t *symsize, int64_t *slide,
12111219 if (fit != objmap.end () && fptr < fit->first + fit->second .SectionSize ) {
12121220 *slide = fit->second .slide ;
12131221 auto lazyobject = fit->second .object ;
1214- if (!lazyobject->object )
1215- lazyobject->object = cantFail (object::ObjectFile::createObjectFile (lazyobject->data ->getMemBufferRef ()));
1216- *Section = *std::next (lazyobject->object ->section_begin (), fit->second .SectionIndex );
1217- if (context) {
1218- if (lazyobject->context == nullptr )
1219- lazyobject->context = DWARFContext::create (*lazyobject->object );
1220- *context = lazyobject->context .get ();
1222+ if (!lazyobject->object && !lazyobject->data .empty ()) {
1223+ if (lazyobject->uncompressedsize ) {
1224+ SmallVector<uint8_t , 0 > unpacked;
1225+ Error E = compression::zlib::decompress (lazyobject->data , unpacked, lazyobject->uncompressedsize );
1226+ if (E)
1227+ lazyobject->data .clear ();
1228+ else
1229+ lazyobject->data = std::move (unpacked);
1230+ jl_jit_add_bytes (lazyobject->data .size () - lazyobject->uncompressedsize );
1231+ lazyobject->uncompressedsize = 0 ;
1232+ }
1233+ if (!lazyobject->data .empty ()) {
1234+ auto obj = object::ObjectFile::createObjectFile (MemoryBufferRef (StringRef ((const char *)lazyobject->data .data (), lazyobject->data .size ()), " jit.o" ));
1235+ if (obj)
1236+ lazyobject->object = std::move (*obj);
1237+ else
1238+ lazyobject->data .clear ();
1239+ }
1240+ }
1241+ if (lazyobject->object ) {
1242+ *Section = *std::next (lazyobject->object ->section_begin (), fit->second .SectionIndex );
1243+ if (context) {
1244+ if (lazyobject->context == nullptr )
1245+ lazyobject->context = DWARFContext::create (*lazyobject->object );
1246+ *context = lazyobject->context .get ();
1247+ }
12211248 }
12221249 found = 1 ;
12231250 }
0 commit comments