~IntelJITEventListener() {
}
- virtual void NotifyFunctionEmitted(const Function &F,
- void *FnStart, size_t FnSize,
- const EmittedFunctionDetails &Details);
-
virtual void NotifyFreeingMachineCode(void *OldPtr);
virtual void NotifyObjectEmitted(const ObjectImage &Obj);
virtual void NotifyFreeingObject(const ObjectImage &Obj);
};
-static LineNumberInfo LineStartToIntelJITFormat(
- uintptr_t StartAddress,
- uintptr_t Address,
- DebugLoc Loc) {
- LineNumberInfo Result;
-
- Result.Offset = Address - StartAddress;
- Result.LineNumber = Loc.getLine();
-
- return Result;
-}
-
static LineNumberInfo DILineInfoToIntelJITFormat(uintptr_t StartAddress,
uintptr_t Address,
DILineInfo Line) {
return Result;
}
-// Adds the just-emitted function to the symbol table.
-void IntelJITEventListener::NotifyFunctionEmitted(
- const Function &F, void *FnStart, size_t FnSize,
- const EmittedFunctionDetails &Details) {
- iJIT_Method_Load FunctionMessage = FunctionDescToIntelJITFormat(*Wrapper,
- F.getName().data(),
- reinterpret_cast<uint64_t>(FnStart),
- FnSize);
-
- std::vector<LineNumberInfo> LineInfo;
-
- if (!Details.LineStarts.empty()) {
- // Now convert the line number information from the address/DebugLoc
- // format in Details to the offset/lineno in Intel JIT API format.
-
- LineInfo.reserve(Details.LineStarts.size() + 1);
-
- DebugLoc FirstLoc = Details.LineStarts[0].Loc;
- assert(!FirstLoc.isUnknown()
- && "LineStarts should not contain unknown DebugLocs");
-
- MDNode *FirstLocScope = FirstLoc.getScope(F.getContext());
- DISubprogram FunctionDI = getDISubprogram(FirstLocScope);
- if (FunctionDI.Verify()) {
- FunctionMessage.source_file_name = const_cast<char*>(
- Filenames.getFullPath(FirstLocScope));
-
- LineNumberInfo FirstLine;
- FirstLine.Offset = 0;
- FirstLine.LineNumber = FunctionDI.getLineNumber();
- LineInfo.push_back(FirstLine);
- }
-
- for (std::vector<EmittedFunctionDetails::LineStart>::const_iterator I =
- Details.LineStarts.begin(), E = Details.LineStarts.end();
- I != E; ++I) {
- // This implementation ignores the DebugLoc filename because the Intel
- // JIT API does not support multiple source files associated with a single
- // JIT function
- LineInfo.push_back(LineStartToIntelJITFormat(
- reinterpret_cast<uintptr_t>(FnStart),
- I->Address,
- I->Loc));
-
- // If we have no file name yet for the function, use the filename from
- // the first instruction that has one
- if (FunctionMessage.source_file_name == 0) {
- MDNode *scope = I->Loc.getScope(
- Details.MF->getFunction()->getContext());
- FunctionMessage.source_file_name = const_cast<char*>(
- Filenames.getFullPath(scope));
- }
- }
-
- FunctionMessage.line_number_size = LineInfo.size();
- FunctionMessage.line_number_table = &*LineInfo.begin();
- } else {
- FunctionMessage.line_number_size = 0;
- FunctionMessage.line_number_table = 0;
- }
-
- Wrapper->iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED,
- &FunctionMessage);
- MethodIDs[FnStart] = FunctionMessage.method_id;
-}
-
void IntelJITEventListener::NotifyFreeingMachineCode(void *FnStart) {
MethodIDMap::iterator I = MethodIDs.find(FnStart);
if (I != MethodIDs.end()) {