diff options
author | Stephen Hines <srhines@google.com> | 2015-03-23 12:10:34 -0700 |
---|---|---|
committer | Stephen Hines <srhines@google.com> | 2015-03-23 12:10:34 -0700 |
commit | ebe69fe11e48d322045d5949c83283927a0d790b (patch) | |
tree | c92f1907a6b8006628a4b01615f38264d29834ea /lib/ExecutionEngine/OProfileJIT/OProfileJITEventListener.cpp | |
parent | b7d2e72b02a4cb8034f32f8247a2558d2434e121 (diff) | |
download | external_llvm-ebe69fe11e48d322045d5949c83283927a0d790b.zip external_llvm-ebe69fe11e48d322045d5949c83283927a0d790b.tar.gz external_llvm-ebe69fe11e48d322045d5949c83283927a0d790b.tar.bz2 |
Update aosp/master LLVM for rebase to r230699.
Change-Id: I2b5be30509658cb8266be782de0ab24f9099f9b9
Diffstat (limited to 'lib/ExecutionEngine/OProfileJIT/OProfileJITEventListener.cpp')
-rw-r--r-- | lib/ExecutionEngine/OProfileJIT/OProfileJITEventListener.cpp | 107 |
1 files changed, 58 insertions, 49 deletions
diff --git a/lib/ExecutionEngine/OProfileJIT/OProfileJITEventListener.cpp b/lib/ExecutionEngine/OProfileJIT/OProfileJITEventListener.cpp index 5a8ccb6..9ab4003 100644 --- a/lib/ExecutionEngine/OProfileJIT/OProfileJITEventListener.cpp +++ b/lib/ExecutionEngine/OProfileJIT/OProfileJITEventListener.cpp @@ -13,49 +13,50 @@ //===----------------------------------------------------------------------===// #include "llvm/Config/config.h" +#include "EventListenerCommon.h" +#include "llvm/CodeGen/MachineFunction.h" #include "llvm/ExecutionEngine/JITEventListener.h" - +#include "llvm/ExecutionEngine/OProfileWrapper.h" +#include "llvm/ExecutionEngine/RuntimeDyld.h" #include "llvm/IR/DebugInfo.h" #include "llvm/IR/Function.h" -#include "llvm/CodeGen/MachineFunction.h" -#include "llvm/ExecutionEngine/ObjectImage.h" -#include "llvm/ExecutionEngine/OProfileWrapper.h" #include "llvm/Object/ObjectFile.h" #include "llvm/Support/Debug.h" -#include "llvm/Support/raw_ostream.h" #include "llvm/Support/Errno.h" -#include "EventListenerCommon.h" - +#include "llvm/Support/raw_ostream.h" #include <dirent.h> #include <fcntl.h> using namespace llvm; using namespace llvm::jitprofiling; +using namespace llvm::object; #define DEBUG_TYPE "oprofile-jit-event-listener" namespace { class OProfileJITEventListener : public JITEventListener { - OProfileWrapper& Wrapper; + std::unique_ptr<OProfileWrapper> Wrapper; void initialize(); + std::map<const char*, OwningBinary<ObjectFile>> DebugObjects; public: - OProfileJITEventListener(OProfileWrapper& LibraryWrapper) - : Wrapper(LibraryWrapper) { + OProfileJITEventListener(std::unique_ptr<OProfileWrapper> LibraryWrapper) + : Wrapper(std::move(LibraryWrapper)) { initialize(); } ~OProfileJITEventListener(); - virtual void NotifyObjectEmitted(const ObjectImage &Obj); + void NotifyObjectEmitted(const ObjectFile &Obj, + const RuntimeDyld::LoadedObjectInfo &L) override; - virtual void NotifyFreeingObject(const ObjectImage &Obj); + void NotifyFreeingObject(const ObjectFile &Obj) override; }; void OProfileJITEventListener::initialize() { - if (!Wrapper.op_open_agent()) { + if (!Wrapper->op_open_agent()) { const std::string err_str = sys::StrError(); DEBUG(dbgs() << "Failed to connect to OProfile agent: " << err_str << "\n"); } else { @@ -64,8 +65,8 @@ void OProfileJITEventListener::initialize() { } OProfileJITEventListener::~OProfileJITEventListener() { - if (Wrapper.isAgentAvailable()) { - if (Wrapper.op_close_agent() == -1) { + if (Wrapper->isAgentAvailable()) { + if (Wrapper->op_close_agent() == -1) { const std::string err_str = sys::StrError(); DEBUG(dbgs() << "Failed to disconnect from OProfile agent: " << err_str << "\n"); @@ -75,17 +76,22 @@ OProfileJITEventListener::~OProfileJITEventListener() { } } -void OProfileJITEventListener::NotifyObjectEmitted(const ObjectImage &Obj) { - if (!Wrapper.isAgentAvailable()) { +void OProfileJITEventListener::NotifyObjectEmitted( + const ObjectFile &Obj, + const RuntimeDyld::LoadedObjectInfo &L) { + if (!Wrapper->isAgentAvailable()) { return; } + OwningBinary<ObjectFile> DebugObjOwner = L.getObjectForDebug(Obj); + const ObjectFile &DebugObj = *DebugObjOwner.getBinary(); + // Use symbol info to iterate functions in the object. - for (object::symbol_iterator I = Obj.begin_symbols(), E = Obj.end_symbols(); + for (symbol_iterator I = DebugObj.symbol_begin(), E = DebugObj.symbol_end(); I != E; ++I) { - object::SymbolRef::Type SymType; + SymbolRef::Type SymType; if (I->getType(SymType)) continue; - if (SymType == object::SymbolRef::ST_Function) { + if (SymType == SymbolRef::ST_Function) { StringRef Name; uint64_t Addr; uint64_t Size; @@ -93,7 +99,7 @@ void OProfileJITEventListener::NotifyObjectEmitted(const ObjectImage &Obj) { if (I->getAddress(Addr)) continue; if (I->getSize(Size)) continue; - if (Wrapper.op_write_native_code(Name.data(), Addr, (void*)Addr, Size) + if (Wrapper->op_write_native_code(Name.data(), Addr, (void*)Addr, Size) == -1) { DEBUG(dbgs() << "Failed to tell OProfile about native function " << Name << " at [" @@ -103,45 +109,48 @@ void OProfileJITEventListener::NotifyObjectEmitted(const ObjectImage &Obj) { // TODO: support line number info (similar to IntelJITEventListener.cpp) } } -} -void OProfileJITEventListener::NotifyFreeingObject(const ObjectImage &Obj) { - if (!Wrapper.isAgentAvailable()) { - return; - } - - // Use symbol info to iterate functions in the object. - for (object::symbol_iterator I = Obj.begin_symbols(), E = Obj.end_symbols(); - I != E; ++I) { - object::SymbolRef::Type SymType; - if (I->getType(SymType)) continue; - if (SymType == object::SymbolRef::ST_Function) { - uint64_t Addr; - if (I->getAddress(Addr)) continue; + DebugObjects[Obj.getData().data()] = std::move(DebugObjOwner); +} - if (Wrapper.op_unload_native_code(Addr) == -1) { - DEBUG(dbgs() - << "Failed to tell OProfile about unload of native function at " - << (void*)Addr << "\n"); - continue; +void OProfileJITEventListener::NotifyFreeingObject(const ObjectFile &Obj) { + if (Wrapper->isAgentAvailable()) { + + // If there was no agent registered when the original object was loaded then + // we won't have created a debug object for it, so bail out. + if (DebugObjects.find(Obj.getData().data()) == DebugObjects.end()) + return; + + const ObjectFile &DebugObj = *DebugObjects[Obj.getData().data()].getBinary(); + + // Use symbol info to iterate functions in the object. + for (symbol_iterator I = DebugObj.symbol_begin(), + E = DebugObj.symbol_end(); + I != E; ++I) { + SymbolRef::Type SymType; + if (I->getType(SymType)) continue; + if (SymType == SymbolRef::ST_Function) { + uint64_t Addr; + if (I->getAddress(Addr)) continue; + + if (Wrapper->op_unload_native_code(Addr) == -1) { + DEBUG(dbgs() + << "Failed to tell OProfile about unload of native function at " + << (void*)Addr << "\n"); + continue; + } } } } + + DebugObjects.erase(Obj.getData().data()); } } // anonymous namespace. namespace llvm { JITEventListener *JITEventListener::createOProfileJITEventListener() { - static std::unique_ptr<OProfileWrapper> JITProfilingWrapper( - new OProfileWrapper); - return new OProfileJITEventListener(*JITProfilingWrapper); -} - -// for testing -JITEventListener *JITEventListener::createOProfileJITEventListener( - OProfileWrapper* TestImpl) { - return new OProfileJITEventListener(*TestImpl); + return new OProfileJITEventListener(llvm::make_unique<OProfileWrapper>()); } } // namespace llvm |