15 #include "llvm/Config/config.h"
18 #define DEBUG_TYPE "amplifier-jit-event-listener"
36 using namespace llvm::jitprofiling;
44 MethodIDMap MethodIDs;
50 ObjectMap LoadedObjectMap;
57 ~IntelJITEventListener() {
60 virtual void NotifyFunctionEmitted(
const Function &
F,
61 void *FnStart,
size_t FnSize,
62 const EmittedFunctionDetails &Details);
64 virtual void NotifyFreeingMachineCode(
void *OldPtr);
66 virtual void NotifyObjectEmitted(
const ObjectImage &Obj);
68 virtual void NotifyFreeingObject(
const ObjectImage &Obj);
72 uintptr_t StartAddress,
77 Result.
Offset = Address - StartAddress;
83 static LineNumberInfo DILineInfoToIntelJITFormat(uintptr_t StartAddress,
88 Result.
Offset = Address - StartAddress;
117 void IntelJITEventListener::NotifyFunctionEmitted(
118 const Function &
F,
void *FnStart,
size_t FnSize,
119 const EmittedFunctionDetails &Details) {
122 reinterpret_cast<uint64_t
>(FnStart),
125 std::vector<LineNumberInfo> LineInfo;
127 if (!Details.LineStarts.empty()) {
131 LineInfo.reserve(Details.LineStarts.size() + 1);
133 DebugLoc FirstLoc = Details.LineStarts[0].Loc;
135 &&
"LineStarts should not contain unknown DebugLocs");
139 if (FunctionDI.
Verify()) {
141 Filenames.getFullPath(FirstLocScope));
146 LineInfo.push_back(FirstLine);
149 for (std::vector<EmittedFunctionDetails::LineStart>::const_iterator
I =
150 Details.LineStarts.begin(), E = Details.LineStarts.end();
155 LineInfo.push_back(LineStartToIntelJITFormat(
156 reinterpret_cast<uintptr_t>(FnStart),
163 MDNode *scope =
I->Loc.getScope(
164 Details.MF->getFunction()->getContext());
166 Filenames.getFullPath(scope));
179 MethodIDs[FnStart] = FunctionMessage.
method_id;
182 void IntelJITEventListener::NotifyFreeingMachineCode(
void *FnStart) {
183 MethodIDMap::iterator
I = MethodIDs.find(FnStart);
184 if (I != MethodIDs.end()) {
190 void IntelJITEventListener::NotifyObjectEmitted(
const ObjectImage &Obj) {
194 MethodAddressVector Functions;
202 std::vector<LineNumberInfo> LineInfo;
203 std::string SourceFileName;
206 if (
I->getType(SymType))
continue;
211 if (
I->getName(Name))
continue;
212 if (
I->getAddress(Addr))
continue;
213 if (
I->getSize(Size))
continue;
216 Functions.push_back((
void*)Addr);
228 LineInfo.push_back(DILineInfoToIntelJITFormat((uintptr_t)Addr,
232 if (LineInfo.size() == 0) {
237 SourceFileName = Lines.
front().second.getFileName();
250 MethodIDs[(
void*)Addr] = FunctionMessage.
method_id;
257 LoadedObjectMap[ObjData] = Functions;
260 void IntelJITEventListener::NotifyFreeingObject(
const ObjectImage &Obj) {
265 ObjectMap::iterator OI = LoadedObjectMap.find(ObjData);
266 if (OI == LoadedObjectMap.end())
268 MethodAddressVector& Functions = OI->second;
271 for (MethodAddressVector::iterator FI = Functions.begin(),
272 FE = Functions.end();
275 void* FnStart =
const_cast<void*
>(*FI);
276 MethodIDMap::iterator
MI = MethodIDs.find(FnStart);
277 if (MI != MethodIDs.end()) {
285 LoadedObjectMap.erase(OI);
298 return new IntelJITEventListener(TestImpl);
static JITEventListener * createIntelJITEventListener()
LLVMContext & getContext() const
MDNode - a tuple of other values.
StringRef getName() const
bool isUnknown() const
isUnknown - Return true if this is an unknown location.
static DIContext * getDWARFContext(object::ObjectFile *)
getDWARFContext - get a context for binary DWARF data.
pLineNumberInfo line_number_table
DISubprogram - This is a wrapper for a subprogram (e.g. a function).
const char * data() const
virtual object::symbol_iterator end_symbols() const =0
virtual object::symbol_iterator begin_symbols() const =0
unsigned getLineNumber() const
virtual StringRef getData() const =0
DISubprogram getDISubprogram(const MDNode *Scope)
getDISubprogram - Find subprogram that is enclosing this scope.
void * method_load_address
unsigned int user_data_size
DILineInfo - a format-neutral container for source line information.
unsigned int line_number_size
MDNode * getScope(const LLVMContext &Ctx) const
int iJIT_NotifyEvent(iJIT_JVM_EVENT EventType, void *EventSpecificData)
unsigned int iJIT_GetNewMethodID(void)
virtual object::ObjectFile * getObjectFile() const =0
virtual DILineInfoTable getLineInfoForAddressRange(uint64_t Address, uint64_t Size, DILineInfoSpecifier Specifier=DILineInfoSpecifier())=0
bool Verify() const
Verify - Verify that a subprogram descriptor is well formed.