123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- //===- JITEventListener.h - Exposes events from JIT compilation -*- C++ -*-===//
- //
- // The LLVM Compiler Infrastructure
- //
- // This file is distributed under the University of Illinois Open Source
- // License. See LICENSE.TXT for details.
- //
- //===----------------------------------------------------------------------===//
- //
- // This file defines the JITEventListener interface, which lets users get
- // callbacks when significant events happen during the JIT compilation process.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_EXECUTIONENGINE_JITEVENTLISTENER_H
- #define LLVM_EXECUTIONENGINE_JITEVENTLISTENER_H
- #include "RuntimeDyld.h"
- #include "llvm/Config/llvm-config.h"
- #include "llvm/IR/DebugLoc.h"
- #include "llvm/Support/DataTypes.h"
- #include <vector>
- namespace llvm {
- class Function;
- class MachineFunction;
- class OProfileWrapper;
- class IntelJITEventsWrapper;
- namespace object {
- class ObjectFile;
- }
- /// JITEvent_EmittedFunctionDetails - Helper struct for containing information
- /// about a generated machine code function.
- struct JITEvent_EmittedFunctionDetails {
- struct LineStart {
- /// The address at which the current line changes.
- uintptr_t Address;
- /// The new location information. These can be translated to DebugLocTuples
- /// using MF->getDebugLocTuple().
- DebugLoc Loc;
- };
- /// The machine function the struct contains information for.
- const MachineFunction *MF;
- /// The list of line boundary information, sorted by address.
- std::vector<LineStart> LineStarts;
- };
- /// JITEventListener - Abstract interface for use by the JIT to notify clients
- /// about significant events during compilation. For example, to notify
- /// profilers and debuggers that need to know where functions have been emitted.
- ///
- /// The default implementation of each method does nothing.
- class JITEventListener {
- public:
- typedef JITEvent_EmittedFunctionDetails EmittedFunctionDetails;
- public:
- JITEventListener() {}
- virtual ~JITEventListener() {}
- /// NotifyObjectEmitted - Called after an object has been successfully
- /// emitted to memory. NotifyFunctionEmitted will not be called for
- /// individual functions in the object.
- ///
- /// ELF-specific information
- /// The ObjectImage contains the generated object image
- /// with section headers updated to reflect the address at which sections
- /// were loaded and with relocations performed in-place on debug sections.
- virtual void NotifyObjectEmitted(const object::ObjectFile &Obj,
- const RuntimeDyld::LoadedObjectInfo &L) {}
- /// NotifyFreeingObject - Called just before the memory associated with
- /// a previously emitted object is released.
- virtual void NotifyFreeingObject(const object::ObjectFile &Obj) {}
- // Get a pointe to the GDB debugger registration listener.
- static JITEventListener *createGDBRegistrationListener();
- #if LLVM_USE_INTEL_JITEVENTS
- // Construct an IntelJITEventListener
- static JITEventListener *createIntelJITEventListener();
- // Construct an IntelJITEventListener with a test Intel JIT API implementation
- static JITEventListener *createIntelJITEventListener(
- IntelJITEventsWrapper* AlternativeImpl);
- #else
- static JITEventListener *createIntelJITEventListener() { return nullptr; }
- static JITEventListener *createIntelJITEventListener(
- IntelJITEventsWrapper* AlternativeImpl) {
- return nullptr;
- }
- #endif // USE_INTEL_JITEVENTS
- #if LLVM_USE_OPROFILE
- // Construct an OProfileJITEventListener
- static JITEventListener *createOProfileJITEventListener();
- // Construct an OProfileJITEventListener with a test opagent implementation
- static JITEventListener *createOProfileJITEventListener(
- OProfileWrapper* AlternativeImpl);
- #else
- static JITEventListener *createOProfileJITEventListener() { return nullptr; }
- static JITEventListener *createOProfileJITEventListener(
- OProfileWrapper* AlternativeImpl) {
- return nullptr;
- }
- #endif // USE_OPROFILE
- private:
- virtual void anchor();
- };
- } // end namespace llvm.
- #endif // defined LLVM_EXECUTIONENGINE_JITEVENTLISTENER_H
|