1 //===-- JITEmitter.cpp - Write machine code to executable memory ----------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines a MachineCodeEmitter object that is used by the JIT to
11 // write machine code to memory and remember where relocatable values are.
13 //===----------------------------------------------------------------------===//
15 #define DEBUG_TYPE "jit"
17 #include "JITDebugRegisterer.h"
18 #include "JITDwarfEmitter.h"
19 #include "llvm/ADT/OwningPtr.h"
20 #include "llvm/Constants.h"
21 #include "llvm/Module.h"
22 #include "llvm/DerivedTypes.h"
23 #include "llvm/Analysis/DebugInfo.h"
24 #include "llvm/CodeGen/JITCodeEmitter.h"
25 #include "llvm/CodeGen/MachineFunction.h"
26 #include "llvm/CodeGen/MachineCodeInfo.h"
27 #include "llvm/CodeGen/MachineConstantPool.h"
28 #include "llvm/CodeGen/MachineJumpTableInfo.h"
29 #include "llvm/CodeGen/MachineModuleInfo.h"
30 #include "llvm/CodeGen/MachineRelocation.h"
31 #include "llvm/ExecutionEngine/GenericValue.h"
32 #include "llvm/ExecutionEngine/JITEventListener.h"
33 #include "llvm/ExecutionEngine/JITMemoryManager.h"
34 #include "llvm/Target/TargetData.h"
35 #include "llvm/Target/TargetInstrInfo.h"
36 #include "llvm/Target/TargetJITInfo.h"
37 #include "llvm/Target/TargetMachine.h"
38 #include "llvm/Target/TargetOptions.h"
39 #include "llvm/Support/Debug.h"
40 #include "llvm/Support/ErrorHandling.h"
41 #include "llvm/Support/ManagedStatic.h"
42 #include "llvm/Support/MutexGuard.h"
43 #include "llvm/Support/ValueHandle.h"
44 #include "llvm/Support/raw_ostream.h"
45 #include "llvm/System/Disassembler.h"
46 #include "llvm/System/Memory.h"
47 #include "llvm/ADT/DenseMap.h"
48 #include "llvm/ADT/SmallPtrSet.h"
49 #include "llvm/ADT/SmallVector.h"
50 #include "llvm/ADT/Statistic.h"
51 #include "llvm/ADT/ValueMap.h"
58 STATISTIC(NumBytes
, "Number of bytes of machine code compiled");
59 STATISTIC(NumRelos
, "Number of relocations applied");
60 STATISTIC(NumRetries
, "Number of retries with more memory");
63 // A declaration may stop being a declaration once it's fully read from bitcode.
64 // This function returns true if F is fully read and is still a declaration.
65 static bool isNonGhostDeclaration(const Function
*F
) {
66 return F
->isDeclaration() && !F
->isMaterializable();
69 //===----------------------------------------------------------------------===//
70 // JIT lazy compilation code.
74 class JITResolverState
;
76 template<typename ValueTy
>
77 struct NoRAUWValueMapConfig
: public ValueMapConfig
<ValueTy
> {
78 typedef JITResolverState
*ExtraData
;
79 static void onRAUW(JITResolverState
*, Value
*Old
, Value
*New
) {
80 assert(false && "The JIT doesn't know how to handle a"
81 " RAUW on a value it has emitted.");
85 struct CallSiteValueMapConfig
: public NoRAUWValueMapConfig
<Function
*> {
86 typedef JITResolverState
*ExtraData
;
87 static void onDelete(JITResolverState
*JRS
, Function
*F
);
90 class JITResolverState
{
92 typedef ValueMap
<Function
*, void*, NoRAUWValueMapConfig
<Function
*> >
93 FunctionToLazyStubMapTy
;
94 typedef std::map
<void*, AssertingVH
<Function
> > CallSiteToFunctionMapTy
;
95 typedef ValueMap
<Function
*, SmallPtrSet
<void*, 1>,
96 CallSiteValueMapConfig
> FunctionToCallSitesMapTy
;
97 typedef std::map
<AssertingVH
<GlobalValue
>, void*> GlobalToIndirectSymMapTy
;
99 /// FunctionToLazyStubMap - Keep track of the lazy stub created for a
100 /// particular function so that we can reuse them if necessary.
101 FunctionToLazyStubMapTy FunctionToLazyStubMap
;
103 /// CallSiteToFunctionMap - Keep track of the function that each lazy call
104 /// site corresponds to, and vice versa.
105 CallSiteToFunctionMapTy CallSiteToFunctionMap
;
106 FunctionToCallSitesMapTy FunctionToCallSitesMap
;
108 /// GlobalToIndirectSymMap - Keep track of the indirect symbol created for a
109 /// particular GlobalVariable so that we can reuse them if necessary.
110 GlobalToIndirectSymMapTy GlobalToIndirectSymMap
;
112 /// Instance of the JIT this ResolverState serves.
116 JITResolverState(JIT
*jit
) : FunctionToLazyStubMap(this),
117 FunctionToCallSitesMap(this),
120 FunctionToLazyStubMapTy
& getFunctionToLazyStubMap(
121 const MutexGuard
& locked
) {
122 assert(locked
.holds(TheJIT
->lock
));
123 return FunctionToLazyStubMap
;
126 GlobalToIndirectSymMapTy
& getGlobalToIndirectSymMap(const MutexGuard
& locked
) {
127 assert(locked
.holds(TheJIT
->lock
));
128 return GlobalToIndirectSymMap
;
131 pair
<void *, Function
*> LookupFunctionFromCallSite(
132 const MutexGuard
&locked
, void *CallSite
) const {
133 assert(locked
.holds(TheJIT
->lock
));
135 // The address given to us for the stub may not be exactly right, it might be
136 // a little bit after the stub. As such, use upper_bound to find it.
137 CallSiteToFunctionMapTy::const_iterator I
=
138 CallSiteToFunctionMap
.upper_bound(CallSite
);
139 assert(I
!= CallSiteToFunctionMap
.begin() &&
140 "This is not a known call site!");
145 void AddCallSite(const MutexGuard
&locked
, void *CallSite
, Function
*F
) {
146 assert(locked
.holds(TheJIT
->lock
));
148 bool Inserted
= CallSiteToFunctionMap
.insert(
149 std::make_pair(CallSite
, F
)).second
;
151 assert(Inserted
&& "Pair was already in CallSiteToFunctionMap");
152 FunctionToCallSitesMap
[F
].insert(CallSite
);
155 void EraseAllCallSitesForPrelocked(Function
*F
);
157 // Erases _all_ call sites regardless of their function. This is used to
158 // unregister the stub addresses from the StubToResolverMap in
160 void EraseAllCallSitesPrelocked();
163 /// JITResolver - Keep track of, and resolve, call sites for functions that
164 /// have not yet been compiled.
166 typedef JITResolverState::FunctionToLazyStubMapTy FunctionToLazyStubMapTy
;
167 typedef JITResolverState::CallSiteToFunctionMapTy CallSiteToFunctionMapTy
;
168 typedef JITResolverState::GlobalToIndirectSymMapTy GlobalToIndirectSymMapTy
;
170 /// LazyResolverFn - The target lazy resolver function that we actually
171 /// rewrite instructions to use.
172 TargetJITInfo::LazyResolverFn LazyResolverFn
;
174 JITResolverState state
;
176 /// ExternalFnToStubMap - This is the equivalent of FunctionToLazyStubMap
177 /// for external functions. TODO: Of course, external functions don't need
178 /// a lazy stub. It's actually here to make it more likely that far calls
179 /// succeed, but no single stub can guarantee that. I'll remove this in a
180 /// subsequent checkin when I actually fix far calls.
181 std::map
<void*, void*> ExternalFnToStubMap
;
183 /// revGOTMap - map addresses to indexes in the GOT
184 std::map
<void*, unsigned> revGOTMap
;
185 unsigned nextGOTIndex
;
189 /// Instance of JIT corresponding to this Resolver.
193 explicit JITResolver(JIT
&jit
, JITEmitter
&je
)
194 : state(&jit
), nextGOTIndex(0), JE(je
), TheJIT(&jit
) {
195 LazyResolverFn
= jit
.getJITInfo().getLazyResolverFunction(JITCompilerFn
);
200 /// getLazyFunctionStubIfAvailable - This returns a pointer to a function's
201 /// lazy-compilation stub if it has already been created.
202 void *getLazyFunctionStubIfAvailable(Function
*F
);
204 /// getLazyFunctionStub - This returns a pointer to a function's
205 /// lazy-compilation stub, creating one on demand as needed.
206 void *getLazyFunctionStub(Function
*F
);
208 /// getExternalFunctionStub - Return a stub for the function at the
209 /// specified address, created lazily on demand.
210 void *getExternalFunctionStub(void *FnAddr
);
212 /// getGlobalValueIndirectSym - Return an indirect symbol containing the
213 /// specified GV address.
214 void *getGlobalValueIndirectSym(GlobalValue
*V
, void *GVAddress
);
216 /// getGOTIndexForAddress - Return a new or existing index in the GOT for
217 /// an address. This function only manages slots, it does not manage the
218 /// contents of the slots or the memory associated with the GOT.
219 unsigned getGOTIndexForAddr(void *addr
);
221 /// JITCompilerFn - This function is called to resolve a stub to a compiled
222 /// address. If the LLVM Function corresponding to the stub has not yet
223 /// been compiled, this function compiles it first.
224 static void *JITCompilerFn(void *Stub
);
227 class StubToResolverMapTy
{
228 /// Map a stub address to a specific instance of a JITResolver so that
229 /// lazily-compiled functions can find the right resolver to use.
232 std::map
<void*, JITResolver
*> Map
;
234 /// Guards Map from concurrent accesses.
235 mutable sys::Mutex Lock
;
238 /// Registers a Stub to be resolved by Resolver.
239 void RegisterStubResolver(void *Stub
, JITResolver
*Resolver
) {
240 MutexGuard
guard(Lock
);
241 Map
.insert(std::make_pair(Stub
, Resolver
));
243 /// Unregisters the Stub when it's invalidated.
244 void UnregisterStubResolver(void *Stub
) {
245 MutexGuard
guard(Lock
);
248 /// Returns the JITResolver instance that owns the Stub.
249 JITResolver
*getResolverFromStub(void *Stub
) const {
250 MutexGuard
guard(Lock
);
251 // The address given to us for the stub may not be exactly right, it might
252 // be a little bit after the stub. As such, use upper_bound to find it.
253 // This is the same trick as in LookupFunctionFromCallSite from
255 std::map
<void*, JITResolver
*>::const_iterator I
= Map
.upper_bound(Stub
);
256 assert(I
!= Map
.begin() && "This is not a known stub!");
260 /// True if any stubs refer to the given resolver. Only used in an assert().
262 bool ResolverHasStubs(JITResolver
* Resolver
) const {
263 MutexGuard
guard(Lock
);
264 for (std::map
<void*, JITResolver
*>::const_iterator I
= Map
.begin(),
265 E
= Map
.end(); I
!= E
; ++I
) {
266 if (I
->second
== Resolver
)
272 /// This needs to be static so that a lazy call stub can access it with no
273 /// context except the address of the stub.
274 ManagedStatic
<StubToResolverMapTy
> StubToResolverMap
;
276 /// JITEmitter - The JIT implementation of the MachineCodeEmitter, which is
277 /// used to output functions to memory for execution.
278 class JITEmitter
: public JITCodeEmitter
{
279 JITMemoryManager
*MemMgr
;
281 // When outputting a function stub in the context of some other function, we
282 // save BufferBegin/BufferEnd/CurBufferPtr here.
283 uint8_t *SavedBufferBegin
, *SavedBufferEnd
, *SavedCurBufferPtr
;
285 // When reattempting to JIT a function after running out of space, we store
286 // the estimated size of the function we're trying to JIT here, so we can
287 // ask the memory manager for at least this much space. When we
288 // successfully emit the function, we reset this back to zero.
289 uintptr_t SizeEstimate
;
291 /// Relocations - These are the relocations that the function needs, as
293 std::vector
<MachineRelocation
> Relocations
;
295 /// MBBLocations - This vector is a mapping from MBB ID's to their address.
296 /// It is filled in by the StartMachineBasicBlock callback and queried by
297 /// the getMachineBasicBlockAddress callback.
298 std::vector
<uintptr_t> MBBLocations
;
300 /// ConstantPool - The constant pool for the current function.
302 MachineConstantPool
*ConstantPool
;
304 /// ConstantPoolBase - A pointer to the first entry in the constant pool.
306 void *ConstantPoolBase
;
308 /// ConstPoolAddresses - Addresses of individual constant pool entries.
310 SmallVector
<uintptr_t, 8> ConstPoolAddresses
;
312 /// JumpTable - The jump tables for the current function.
314 MachineJumpTableInfo
*JumpTable
;
316 /// JumpTableBase - A pointer to the first entry in the jump table.
320 /// Resolver - This contains info about the currently resolved functions.
321 JITResolver Resolver
;
323 /// DE - The dwarf emitter for the jit.
324 OwningPtr
<JITDwarfEmitter
> DE
;
326 /// DR - The debug registerer for the jit.
327 OwningPtr
<JITDebugRegisterer
> DR
;
329 /// LabelLocations - This vector is a mapping from Label ID's to their
331 DenseMap
<MCSymbol
*, uintptr_t> LabelLocations
;
333 /// MMI - Machine module info for exception informations
334 MachineModuleInfo
* MMI
;
336 // CurFn - The llvm function being emitted. Only valid during
338 const Function
*CurFn
;
340 /// Information about emitted code, which is passed to the
341 /// JITEventListeners. This is reset in startFunction and used in
343 JITEvent_EmittedFunctionDetails EmissionDetails
;
346 void *FunctionBody
; // Beginning of the function's allocation.
347 void *Code
; // The address the function's code actually starts at.
348 void *ExceptionTable
;
349 EmittedCode() : FunctionBody(0), Code(0), ExceptionTable(0) {}
351 struct EmittedFunctionConfig
: public ValueMapConfig
<const Function
*> {
352 typedef JITEmitter
*ExtraData
;
353 static void onDelete(JITEmitter
*, const Function
*);
354 static void onRAUW(JITEmitter
*, const Function
*, const Function
*);
356 ValueMap
<const Function
*, EmittedCode
,
357 EmittedFunctionConfig
> EmittedFunctions
;
361 /// Instance of the JIT
365 JITEmitter(JIT
&jit
, JITMemoryManager
*JMM
, TargetMachine
&TM
)
366 : SizeEstimate(0), Resolver(jit
, *this), MMI(0), CurFn(0),
367 EmittedFunctions(this), TheJIT(&jit
) {
368 MemMgr
= JMM
? JMM
: JITMemoryManager::CreateDefaultMemManager();
369 if (jit
.getJITInfo().needsGOT()) {
370 MemMgr
->AllocateGOT();
371 DEBUG(dbgs() << "JIT is managing a GOT\n");
374 if (JITExceptionHandling
|| JITEmitDebugInfo
) {
375 DE
.reset(new JITDwarfEmitter(jit
));
377 if (JITEmitDebugInfo
) {
378 DR
.reset(new JITDebugRegisterer(TM
));
385 /// classof - Methods for support type inquiry through isa, cast, and
388 static inline bool classof(const MachineCodeEmitter
*) { return true; }
390 JITResolver
&getJITResolver() { return Resolver
; }
392 virtual void startFunction(MachineFunction
&F
);
393 virtual bool finishFunction(MachineFunction
&F
);
395 void emitConstantPool(MachineConstantPool
*MCP
);
396 void initJumpTableInfo(MachineJumpTableInfo
*MJTI
);
397 void emitJumpTableInfo(MachineJumpTableInfo
*MJTI
);
399 void startGVStub(const GlobalValue
* GV
,
400 unsigned StubSize
, unsigned Alignment
= 1);
401 void startGVStub(void *Buffer
, unsigned StubSize
);
403 virtual void *allocIndirectGV(const GlobalValue
*GV
,
404 const uint8_t *Buffer
, size_t Size
,
407 /// allocateSpace - Reserves space in the current block if any, or
408 /// allocate a new one of the given size.
409 virtual void *allocateSpace(uintptr_t Size
, unsigned Alignment
);
411 /// allocateGlobal - Allocate memory for a global. Unlike allocateSpace,
412 /// this method does not allocate memory in the current output buffer,
413 /// because a global may live longer than the current function.
414 virtual void *allocateGlobal(uintptr_t Size
, unsigned Alignment
);
416 virtual void addRelocation(const MachineRelocation
&MR
) {
417 Relocations
.push_back(MR
);
420 virtual void StartMachineBasicBlock(MachineBasicBlock
*MBB
) {
421 if (MBBLocations
.size() <= (unsigned)MBB
->getNumber())
422 MBBLocations
.resize((MBB
->getNumber()+1)*2);
423 MBBLocations
[MBB
->getNumber()] = getCurrentPCValue();
424 if (MBB
->hasAddressTaken())
425 TheJIT
->addPointerToBasicBlock(MBB
->getBasicBlock(),
426 (void*)getCurrentPCValue());
427 DEBUG(dbgs() << "JIT: Emitting BB" << MBB
->getNumber() << " at ["
428 << (void*) getCurrentPCValue() << "]\n");
431 virtual uintptr_t getConstantPoolEntryAddress(unsigned Entry
) const;
432 virtual uintptr_t getJumpTableEntryAddress(unsigned Entry
) const;
434 virtual uintptr_t getMachineBasicBlockAddress(MachineBasicBlock
*MBB
) const{
435 assert(MBBLocations
.size() > (unsigned)MBB
->getNumber() &&
436 MBBLocations
[MBB
->getNumber()] && "MBB not emitted!");
437 return MBBLocations
[MBB
->getNumber()];
440 /// retryWithMoreMemory - Log a retry and deallocate all memory for the
441 /// given function. Increase the minimum allocation size so that we get
442 /// more memory next time.
443 void retryWithMoreMemory(MachineFunction
&F
);
445 /// deallocateMemForFunction - Deallocate all memory for the specified
447 void deallocateMemForFunction(const Function
*F
);
449 virtual void processDebugLoc(DebugLoc DL
, bool BeforePrintingInsn
);
451 virtual void emitLabel(MCSymbol
*Label
) {
452 LabelLocations
[Label
] = getCurrentPCValue();
455 virtual DenseMap
<MCSymbol
*, uintptr_t> *getLabelLocations() {
456 return &LabelLocations
;
459 virtual uintptr_t getLabelAddress(MCSymbol
*Label
) const {
460 assert(LabelLocations
.count(Label
) && "Label not emitted!");
461 return LabelLocations
.find(Label
)->second
;
464 virtual void setModuleInfo(MachineModuleInfo
* Info
) {
466 if (DE
.get()) DE
->setModuleInfo(Info
);
470 void *getPointerToGlobal(GlobalValue
*GV
, void *Reference
,
471 bool MayNeedFarStub
);
472 void *getPointerToGVIndirectSym(GlobalValue
*V
, void *Reference
);
476 void CallSiteValueMapConfig::onDelete(JITResolverState
*JRS
, Function
*F
) {
477 JRS
->EraseAllCallSitesForPrelocked(F
);
480 void JITResolverState::EraseAllCallSitesForPrelocked(Function
*F
) {
481 FunctionToCallSitesMapTy::iterator F2C
= FunctionToCallSitesMap
.find(F
);
482 if (F2C
== FunctionToCallSitesMap
.end())
484 StubToResolverMapTy
&S2RMap
= *StubToResolverMap
;
485 for (SmallPtrSet
<void*, 1>::const_iterator I
= F2C
->second
.begin(),
486 E
= F2C
->second
.end(); I
!= E
; ++I
) {
487 S2RMap
.UnregisterStubResolver(*I
);
488 bool Erased
= CallSiteToFunctionMap
.erase(*I
);
490 assert(Erased
&& "Missing call site->function mapping");
492 FunctionToCallSitesMap
.erase(F2C
);
495 void JITResolverState::EraseAllCallSitesPrelocked() {
496 StubToResolverMapTy
&S2RMap
= *StubToResolverMap
;
497 for (CallSiteToFunctionMapTy::const_iterator
498 I
= CallSiteToFunctionMap
.begin(),
499 E
= CallSiteToFunctionMap
.end(); I
!= E
; ++I
) {
500 S2RMap
.UnregisterStubResolver(I
->first
);
502 CallSiteToFunctionMap
.clear();
503 FunctionToCallSitesMap
.clear();
506 JITResolver::~JITResolver() {
507 // No need to lock because we're in the destructor, and state isn't shared.
508 state
.EraseAllCallSitesPrelocked();
509 assert(!StubToResolverMap
->ResolverHasStubs(this) &&
510 "Resolver destroyed with stubs still alive.");
513 /// getLazyFunctionStubIfAvailable - This returns a pointer to a function stub
514 /// if it has already been created.
515 void *JITResolver::getLazyFunctionStubIfAvailable(Function
*F
) {
516 MutexGuard
locked(TheJIT
->lock
);
518 // If we already have a stub for this function, recycle it.
519 return state
.getFunctionToLazyStubMap(locked
).lookup(F
);
522 /// getFunctionStub - This returns a pointer to a function stub, creating
523 /// one on demand as needed.
524 void *JITResolver::getLazyFunctionStub(Function
*F
) {
525 MutexGuard
locked(TheJIT
->lock
);
527 // If we already have a lazy stub for this function, recycle it.
528 void *&Stub
= state
.getFunctionToLazyStubMap(locked
)[F
];
529 if (Stub
) return Stub
;
531 // Call the lazy resolver function if we are JIT'ing lazily. Otherwise we
532 // must resolve the symbol now.
533 void *Actual
= TheJIT
->isCompilingLazily()
534 ? (void *)(intptr_t)LazyResolverFn
: (void *)0;
536 // If this is an external declaration, attempt to resolve the address now
537 // to place in the stub.
538 if (isNonGhostDeclaration(F
) || F
->hasAvailableExternallyLinkage()) {
539 Actual
= TheJIT
->getPointerToFunction(F
);
541 // If we resolved the symbol to a null address (eg. a weak external)
542 // don't emit a stub. Return a null pointer to the application.
543 if (!Actual
) return 0;
546 TargetJITInfo::StubLayout SL
= TheJIT
->getJITInfo().getStubLayout();
547 JE
.startGVStub(F
, SL
.Size
, SL
.Alignment
);
548 // Codegen a new stub, calling the lazy resolver or the actual address of the
549 // external function, if it was resolved.
550 Stub
= TheJIT
->getJITInfo().emitFunctionStub(F
, Actual
, JE
);
553 if (Actual
!= (void*)(intptr_t)LazyResolverFn
) {
554 // If we are getting the stub for an external function, we really want the
555 // address of the stub in the GlobalAddressMap for the JIT, not the address
556 // of the external function.
557 TheJIT
->updateGlobalMapping(F
, Stub
);
560 DEBUG(dbgs() << "JIT: Lazy stub emitted at [" << Stub
<< "] for function '"
561 << F
->getName() << "'\n");
563 if (TheJIT
->isCompilingLazily()) {
564 // Register this JITResolver as the one corresponding to this call site so
565 // JITCompilerFn will be able to find it.
566 StubToResolverMap
->RegisterStubResolver(Stub
, this);
568 // Finally, keep track of the stub-to-Function mapping so that the
569 // JITCompilerFn knows which function to compile!
570 state
.AddCallSite(locked
, Stub
, F
);
571 } else if (!Actual
) {
572 // If we are JIT'ing non-lazily but need to call a function that does not
573 // exist yet, add it to the JIT's work list so that we can fill in the
574 // stub address later.
575 assert(!isNonGhostDeclaration(F
) && !F
->hasAvailableExternallyLinkage() &&
576 "'Actual' should have been set above.");
577 TheJIT
->addPendingFunction(F
);
583 /// getGlobalValueIndirectSym - Return a lazy pointer containing the specified
585 void *JITResolver::getGlobalValueIndirectSym(GlobalValue
*GV
, void *GVAddress
) {
586 MutexGuard
locked(TheJIT
->lock
);
588 // If we already have a stub for this global variable, recycle it.
589 void *&IndirectSym
= state
.getGlobalToIndirectSymMap(locked
)[GV
];
590 if (IndirectSym
) return IndirectSym
;
592 // Otherwise, codegen a new indirect symbol.
593 IndirectSym
= TheJIT
->getJITInfo().emitGlobalValueIndirectSym(GV
, GVAddress
,
596 DEBUG(dbgs() << "JIT: Indirect symbol emitted at [" << IndirectSym
597 << "] for GV '" << GV
->getName() << "'\n");
602 /// getExternalFunctionStub - Return a stub for the function at the
603 /// specified address, created lazily on demand.
604 void *JITResolver::getExternalFunctionStub(void *FnAddr
) {
605 // If we already have a stub for this function, recycle it.
606 void *&Stub
= ExternalFnToStubMap
[FnAddr
];
607 if (Stub
) return Stub
;
609 TargetJITInfo::StubLayout SL
= TheJIT
->getJITInfo().getStubLayout();
610 JE
.startGVStub(0, SL
.Size
, SL
.Alignment
);
611 Stub
= TheJIT
->getJITInfo().emitFunctionStub(0, FnAddr
, JE
);
614 DEBUG(dbgs() << "JIT: Stub emitted at [" << Stub
615 << "] for external function at '" << FnAddr
<< "'\n");
619 unsigned JITResolver::getGOTIndexForAddr(void* addr
) {
620 unsigned idx
= revGOTMap
[addr
];
622 idx
= ++nextGOTIndex
;
623 revGOTMap
[addr
] = idx
;
624 DEBUG(dbgs() << "JIT: Adding GOT entry " << idx
<< " for addr ["
630 /// JITCompilerFn - This function is called when a lazy compilation stub has
631 /// been entered. It looks up which function this stub corresponds to, compiles
632 /// it if necessary, then returns the resultant function pointer.
633 void *JITResolver::JITCompilerFn(void *Stub
) {
634 JITResolver
*JR
= StubToResolverMap
->getResolverFromStub(Stub
);
635 assert(JR
&& "Unable to find the corresponding JITResolver to the call site");
641 // Only lock for getting the Function. The call getPointerToFunction made
642 // in this function might trigger function materializing, which requires
643 // JIT lock to be unlocked.
644 MutexGuard
locked(JR
->TheJIT
->lock
);
646 // The address given to us for the stub may not be exactly right, it might
647 // be a little bit after the stub. As such, use upper_bound to find it.
648 pair
<void*, Function
*> I
=
649 JR
->state
.LookupFunctionFromCallSite(locked
, Stub
);
654 // If we have already code generated the function, just return the address.
655 void *Result
= JR
->TheJIT
->getPointerToGlobalIfAvailable(F
);
658 // Otherwise we don't have it, do lazy compilation now.
660 // If lazy compilation is disabled, emit a useful error message and abort.
661 if (!JR
->TheJIT
->isCompilingLazily()) {
662 report_fatal_error("LLVM JIT requested to do lazy compilation of function '"
663 + F
->getName() + "' when lazy compiles are disabled!");
666 DEBUG(dbgs() << "JIT: Lazily resolving function '" << F
->getName()
667 << "' In stub ptr = " << Stub
<< " actual ptr = "
668 << ActualPtr
<< "\n");
670 Result
= JR
->TheJIT
->getPointerToFunction(F
);
673 // Reacquire the lock to update the GOT map.
674 MutexGuard
locked(JR
->TheJIT
->lock
);
676 // We might like to remove the call site from the CallSiteToFunction map, but
677 // we can't do that! Multiple threads could be stuck, waiting to acquire the
678 // lock above. As soon as the 1st function finishes compiling the function,
679 // the next one will be released, and needs to be able to find the function it
682 // FIXME: We could rewrite all references to this stub if we knew them.
684 // What we will do is set the compiled function address to map to the
685 // same GOT entry as the stub so that later clients may update the GOT
686 // if they see it still using the stub address.
687 // Note: this is done so the Resolver doesn't have to manage GOT memory
688 // Do this without allocating map space if the target isn't using a GOT
689 if(JR
->revGOTMap
.find(Stub
) != JR
->revGOTMap
.end())
690 JR
->revGOTMap
[Result
] = JR
->revGOTMap
[Stub
];
695 //===----------------------------------------------------------------------===//
698 void *JITEmitter::getPointerToGlobal(GlobalValue
*V
, void *Reference
,
699 bool MayNeedFarStub
) {
700 if (GlobalVariable
*GV
= dyn_cast
<GlobalVariable
>(V
))
701 return TheJIT
->getOrEmitGlobalVariable(GV
);
703 if (GlobalAlias
*GA
= dyn_cast
<GlobalAlias
>(V
))
704 return TheJIT
->getPointerToGlobal(GA
->resolveAliasedGlobal(false));
706 // If we have already compiled the function, return a pointer to its body.
707 Function
*F
= cast
<Function
>(V
);
709 void *FnStub
= Resolver
.getLazyFunctionStubIfAvailable(F
);
711 // Return the function stub if it's already created. We do this first so
712 // that we're returning the same address for the function as any previous
713 // call. TODO: Yes, this is wrong. The lazy stub isn't guaranteed to be
714 // close enough to call.
718 // If we know the target can handle arbitrary-distance calls, try to
719 // return a direct pointer.
720 if (!MayNeedFarStub
) {
721 // If we have code, go ahead and return that.
722 void *ResultPtr
= TheJIT
->getPointerToGlobalIfAvailable(F
);
723 if (ResultPtr
) return ResultPtr
;
725 // If this is an external function pointer, we can force the JIT to
726 // 'compile' it, which really just adds it to the map.
727 if (isNonGhostDeclaration(F
) || F
->hasAvailableExternallyLinkage())
728 return TheJIT
->getPointerToFunction(F
);
731 // Otherwise, we may need a to emit a stub, and, conservatively, we always do
732 // so. Note that it's possible to return null from getLazyFunctionStub in the
733 // case of a weak extern that fails to resolve.
734 return Resolver
.getLazyFunctionStub(F
);
737 void *JITEmitter::getPointerToGVIndirectSym(GlobalValue
*V
, void *Reference
) {
738 // Make sure GV is emitted first, and create a stub containing the fully
740 void *GVAddress
= getPointerToGlobal(V
, Reference
, false);
741 void *StubAddr
= Resolver
.getGlobalValueIndirectSym(V
, GVAddress
);
745 void JITEmitter::processDebugLoc(DebugLoc DL
, bool BeforePrintingInsn
) {
746 if (DL
.isUnknown()) return;
747 if (!BeforePrintingInsn
) return;
749 const LLVMContext
&Context
= EmissionDetails
.MF
->getFunction()->getContext();
751 if (DL
.getScope(Context
) != 0 && PrevDL
!= DL
) {
752 JITEvent_EmittedFunctionDetails::LineStart NextLine
;
753 NextLine
.Address
= getCurrentPCValue();
755 EmissionDetails
.LineStarts
.push_back(NextLine
);
761 static unsigned GetConstantPoolSizeInBytes(MachineConstantPool
*MCP
,
762 const TargetData
*TD
) {
763 const std::vector
<MachineConstantPoolEntry
> &Constants
= MCP
->getConstants();
764 if (Constants
.empty()) return 0;
767 for (unsigned i
= 0, e
= Constants
.size(); i
!= e
; ++i
) {
768 MachineConstantPoolEntry CPE
= Constants
[i
];
769 unsigned AlignMask
= CPE
.getAlignment() - 1;
770 Size
= (Size
+ AlignMask
) & ~AlignMask
;
771 const Type
*Ty
= CPE
.getType();
772 Size
+= TD
->getTypeAllocSize(Ty
);
777 void JITEmitter::startFunction(MachineFunction
&F
) {
778 DEBUG(dbgs() << "JIT: Starting CodeGen of Function "
779 << F
.getFunction()->getName() << "\n");
781 uintptr_t ActualSize
= 0;
782 // Set the memory writable, if it's not already
783 MemMgr
->setMemoryWritable();
785 if (SizeEstimate
> 0) {
786 // SizeEstimate will be non-zero on reallocation attempts.
787 ActualSize
= SizeEstimate
;
790 BufferBegin
= CurBufferPtr
= MemMgr
->startFunctionBody(F
.getFunction(),
792 BufferEnd
= BufferBegin
+ActualSize
;
793 EmittedFunctions
[F
.getFunction()].FunctionBody
= BufferBegin
;
795 // Ensure the constant pool/jump table info is at least 4-byte aligned.
798 emitConstantPool(F
.getConstantPool());
799 if (MachineJumpTableInfo
*MJTI
= F
.getJumpTableInfo())
800 initJumpTableInfo(MJTI
);
802 // About to start emitting the machine code for the function.
803 emitAlignment(std::max(F
.getFunction()->getAlignment(), 8U));
804 TheJIT
->updateGlobalMapping(F
.getFunction(), CurBufferPtr
);
805 EmittedFunctions
[F
.getFunction()].Code
= CurBufferPtr
;
807 MBBLocations
.clear();
809 EmissionDetails
.MF
= &F
;
810 EmissionDetails
.LineStarts
.clear();
813 bool JITEmitter::finishFunction(MachineFunction
&F
) {
814 if (CurBufferPtr
== BufferEnd
) {
815 // We must call endFunctionBody before retrying, because
816 // deallocateMemForFunction requires it.
817 MemMgr
->endFunctionBody(F
.getFunction(), BufferBegin
, CurBufferPtr
);
818 retryWithMoreMemory(F
);
822 if (MachineJumpTableInfo
*MJTI
= F
.getJumpTableInfo())
823 emitJumpTableInfo(MJTI
);
825 // FnStart is the start of the text, not the start of the constant pool and
826 // other per-function data.
828 (uint8_t *)TheJIT
->getPointerToGlobalIfAvailable(F
.getFunction());
830 // FnEnd is the end of the function's machine code.
831 uint8_t *FnEnd
= CurBufferPtr
;
833 if (!Relocations
.empty()) {
834 CurFn
= F
.getFunction();
835 NumRelos
+= Relocations
.size();
837 // Resolve the relocations to concrete pointers.
838 for (unsigned i
= 0, e
= Relocations
.size(); i
!= e
; ++i
) {
839 MachineRelocation
&MR
= Relocations
[i
];
841 if (!MR
.letTargetResolve()) {
842 if (MR
.isExternalSymbol()) {
843 ResultPtr
= TheJIT
->getPointerToNamedFunction(MR
.getExternalSymbol(),
845 DEBUG(dbgs() << "JIT: Map \'" << MR
.getExternalSymbol() << "\' to ["
846 << ResultPtr
<< "]\n");
848 // If the target REALLY wants a stub for this function, emit it now.
849 if (MR
.mayNeedFarStub()) {
850 ResultPtr
= Resolver
.getExternalFunctionStub(ResultPtr
);
852 } else if (MR
.isGlobalValue()) {
853 ResultPtr
= getPointerToGlobal(MR
.getGlobalValue(),
854 BufferBegin
+MR
.getMachineCodeOffset(),
855 MR
.mayNeedFarStub());
856 } else if (MR
.isIndirectSymbol()) {
857 ResultPtr
= getPointerToGVIndirectSym(
858 MR
.getGlobalValue(), BufferBegin
+MR
.getMachineCodeOffset());
859 } else if (MR
.isBasicBlock()) {
860 ResultPtr
= (void*)getMachineBasicBlockAddress(MR
.getBasicBlock());
861 } else if (MR
.isConstantPoolIndex()) {
862 ResultPtr
= (void*)getConstantPoolEntryAddress(MR
.getConstantPoolIndex());
864 assert(MR
.isJumpTableIndex());
865 ResultPtr
=(void*)getJumpTableEntryAddress(MR
.getJumpTableIndex());
868 MR
.setResultPointer(ResultPtr
);
871 // if we are managing the GOT and the relocation wants an index,
873 if (MR
.isGOTRelative() && MemMgr
->isManagingGOT()) {
874 unsigned idx
= Resolver
.getGOTIndexForAddr(ResultPtr
);
876 if (((void**)MemMgr
->getGOTBase())[idx
] != ResultPtr
) {
877 DEBUG(dbgs() << "JIT: GOT was out of date for " << ResultPtr
878 << " pointing at " << ((void**)MemMgr
->getGOTBase())[idx
]
880 ((void**)MemMgr
->getGOTBase())[idx
] = ResultPtr
;
886 TheJIT
->getJITInfo().relocate(BufferBegin
, &Relocations
[0],
887 Relocations
.size(), MemMgr
->getGOTBase());
890 // Update the GOT entry for F to point to the new code.
891 if (MemMgr
->isManagingGOT()) {
892 unsigned idx
= Resolver
.getGOTIndexForAddr((void*)BufferBegin
);
893 if (((void**)MemMgr
->getGOTBase())[idx
] != (void*)BufferBegin
) {
894 DEBUG(dbgs() << "JIT: GOT was out of date for " << (void*)BufferBegin
895 << " pointing at " << ((void**)MemMgr
->getGOTBase())[idx
]
897 ((void**)MemMgr
->getGOTBase())[idx
] = (void*)BufferBegin
;
901 // CurBufferPtr may have moved beyond FnEnd, due to memory allocation for
902 // global variables that were referenced in the relocations.
903 MemMgr
->endFunctionBody(F
.getFunction(), BufferBegin
, CurBufferPtr
);
905 if (CurBufferPtr
== BufferEnd
) {
906 retryWithMoreMemory(F
);
909 // Now that we've succeeded in emitting the function, reset the
910 // SizeEstimate back down to zero.
914 BufferBegin
= CurBufferPtr
= 0;
915 NumBytes
+= FnEnd
-FnStart
;
917 // Invalidate the icache if necessary.
918 sys::Memory::InvalidateInstructionCache(FnStart
, FnEnd
-FnStart
);
920 TheJIT
->NotifyFunctionEmitted(*F
.getFunction(), FnStart
, FnEnd
-FnStart
,
923 // Reset the previous debug location.
926 DEBUG(dbgs() << "JIT: Finished CodeGen of [" << (void*)FnStart
927 << "] Function: " << F
.getFunction()->getName()
928 << ": " << (FnEnd
-FnStart
) << " bytes of text, "
929 << Relocations
.size() << " relocations\n");
932 ConstPoolAddresses
.clear();
934 // Mark code region readable and executable if it's not so already.
935 MemMgr
->setMemoryExecutable();
938 if (sys::hasDisassembler()) {
939 dbgs() << "JIT: Disassembled code:\n";
940 dbgs() << sys::disassembleBuffer(FnStart
, FnEnd
-FnStart
,
943 dbgs() << "JIT: Binary code:\n";
944 uint8_t* q
= FnStart
;
945 for (int i
= 0; q
< FnEnd
; q
+= 4, ++i
) {
949 dbgs() << "JIT: " << (long)(q
- FnStart
) << ": ";
951 for (int j
= 3; j
>= 0; --j
) {
955 dbgs() << (unsigned short)q
[j
];
967 if (JITExceptionHandling
|| JITEmitDebugInfo
) {
968 uintptr_t ActualSize
= 0;
969 SavedBufferBegin
= BufferBegin
;
970 SavedBufferEnd
= BufferEnd
;
971 SavedCurBufferPtr
= CurBufferPtr
;
973 BufferBegin
= CurBufferPtr
= MemMgr
->startExceptionTable(F
.getFunction(),
975 BufferEnd
= BufferBegin
+ActualSize
;
976 EmittedFunctions
[F
.getFunction()].ExceptionTable
= BufferBegin
;
978 uint8_t *FrameRegister
= DE
->EmitDwarfTable(F
, *this, FnStart
, FnEnd
,
980 MemMgr
->endExceptionTable(F
.getFunction(), BufferBegin
, CurBufferPtr
,
982 uint8_t *EhEnd
= CurBufferPtr
;
983 BufferBegin
= SavedBufferBegin
;
984 BufferEnd
= SavedBufferEnd
;
985 CurBufferPtr
= SavedCurBufferPtr
;
987 if (JITExceptionHandling
) {
988 TheJIT
->RegisterTable(FrameRegister
);
991 if (JITEmitDebugInfo
) {
997 DR
->RegisterFunction(F
.getFunction(), I
);
1007 void JITEmitter::retryWithMoreMemory(MachineFunction
&F
) {
1008 DEBUG(dbgs() << "JIT: Ran out of space for native code. Reattempting.\n");
1009 Relocations
.clear(); // Clear the old relocations or we'll reapply them.
1010 ConstPoolAddresses
.clear();
1012 deallocateMemForFunction(F
.getFunction());
1013 // Try again with at least twice as much free space.
1014 SizeEstimate
= (uintptr_t)(2 * (BufferEnd
- BufferBegin
));
1016 for (MachineFunction::iterator MBB
= F
.begin(), E
= F
.end(); MBB
!= E
; ++MBB
){
1017 if (MBB
->hasAddressTaken())
1018 TheJIT
->clearPointerToBasicBlock(MBB
->getBasicBlock());
1022 /// deallocateMemForFunction - Deallocate all memory for the specified
1023 /// function body. Also drop any references the function has to stubs.
1024 /// May be called while the Function is being destroyed inside ~Value().
1025 void JITEmitter::deallocateMemForFunction(const Function
*F
) {
1026 ValueMap
<const Function
*, EmittedCode
, EmittedFunctionConfig
>::iterator
1027 Emitted
= EmittedFunctions
.find(F
);
1028 if (Emitted
!= EmittedFunctions
.end()) {
1029 MemMgr
->deallocateFunctionBody(Emitted
->second
.FunctionBody
);
1030 MemMgr
->deallocateExceptionTable(Emitted
->second
.ExceptionTable
);
1031 TheJIT
->NotifyFreeingMachineCode(Emitted
->second
.Code
);
1033 EmittedFunctions
.erase(Emitted
);
1036 // TODO: Do we need to unregister exception handling information from libgcc
1039 if (JITEmitDebugInfo
) {
1040 DR
->UnregisterFunction(F
);
1045 void* JITEmitter::allocateSpace(uintptr_t Size
, unsigned Alignment
) {
1047 return JITCodeEmitter::allocateSpace(Size
, Alignment
);
1049 // create a new memory block if there is no active one.
1050 // care must be taken so that BufferBegin is invalidated when a
1052 BufferBegin
= CurBufferPtr
= MemMgr
->allocateSpace(Size
, Alignment
);
1053 BufferEnd
= BufferBegin
+Size
;
1054 return CurBufferPtr
;
1057 void* JITEmitter::allocateGlobal(uintptr_t Size
, unsigned Alignment
) {
1058 // Delegate this call through the memory manager.
1059 return MemMgr
->allocateGlobal(Size
, Alignment
);
1062 void JITEmitter::emitConstantPool(MachineConstantPool
*MCP
) {
1063 if (TheJIT
->getJITInfo().hasCustomConstantPool())
1066 const std::vector
<MachineConstantPoolEntry
> &Constants
= MCP
->getConstants();
1067 if (Constants
.empty()) return;
1069 unsigned Size
= GetConstantPoolSizeInBytes(MCP
, TheJIT
->getTargetData());
1070 unsigned Align
= MCP
->getConstantPoolAlignment();
1071 ConstantPoolBase
= allocateSpace(Size
, Align
);
1074 if (ConstantPoolBase
== 0) return; // Buffer overflow.
1076 DEBUG(dbgs() << "JIT: Emitted constant pool at [" << ConstantPoolBase
1077 << "] (size: " << Size
<< ", alignment: " << Align
<< ")\n");
1079 // Initialize the memory for all of the constant pool entries.
1080 unsigned Offset
= 0;
1081 for (unsigned i
= 0, e
= Constants
.size(); i
!= e
; ++i
) {
1082 MachineConstantPoolEntry CPE
= Constants
[i
];
1083 unsigned AlignMask
= CPE
.getAlignment() - 1;
1084 Offset
= (Offset
+ AlignMask
) & ~AlignMask
;
1086 uintptr_t CAddr
= (uintptr_t)ConstantPoolBase
+ Offset
;
1087 ConstPoolAddresses
.push_back(CAddr
);
1088 if (CPE
.isMachineConstantPoolEntry()) {
1089 // FIXME: add support to lower machine constant pool values into bytes!
1090 report_fatal_error("Initialize memory with machine specific constant pool"
1091 "entry has not been implemented!");
1093 TheJIT
->InitializeMemory(CPE
.Val
.ConstVal
, (void*)CAddr
);
1094 DEBUG(dbgs() << "JIT: CP" << i
<< " at [0x";
1095 dbgs().write_hex(CAddr
) << "]\n");
1097 const Type
*Ty
= CPE
.Val
.ConstVal
->getType();
1098 Offset
+= TheJIT
->getTargetData()->getTypeAllocSize(Ty
);
1102 void JITEmitter::initJumpTableInfo(MachineJumpTableInfo
*MJTI
) {
1103 if (TheJIT
->getJITInfo().hasCustomJumpTables())
1105 if (MJTI
->getEntryKind() == MachineJumpTableInfo::EK_Inline
)
1108 const std::vector
<MachineJumpTableEntry
> &JT
= MJTI
->getJumpTables();
1109 if (JT
.empty()) return;
1111 unsigned NumEntries
= 0;
1112 for (unsigned i
= 0, e
= JT
.size(); i
!= e
; ++i
)
1113 NumEntries
+= JT
[i
].MBBs
.size();
1115 unsigned EntrySize
= MJTI
->getEntrySize(*TheJIT
->getTargetData());
1117 // Just allocate space for all the jump tables now. We will fix up the actual
1118 // MBB entries in the tables after we emit the code for each block, since then
1119 // we will know the final locations of the MBBs in memory.
1121 JumpTableBase
= allocateSpace(NumEntries
* EntrySize
,
1122 MJTI
->getEntryAlignment(*TheJIT
->getTargetData()));
1125 void JITEmitter::emitJumpTableInfo(MachineJumpTableInfo
*MJTI
) {
1126 if (TheJIT
->getJITInfo().hasCustomJumpTables())
1129 const std::vector
<MachineJumpTableEntry
> &JT
= MJTI
->getJumpTables();
1130 if (JT
.empty() || JumpTableBase
== 0) return;
1133 switch (MJTI
->getEntryKind()) {
1134 case MachineJumpTableInfo::EK_Inline
:
1136 case MachineJumpTableInfo::EK_BlockAddress
: {
1137 // EK_BlockAddress - Each entry is a plain address of block, e.g.:
1139 assert(MJTI
->getEntrySize(*TheJIT
->getTargetData()) == sizeof(void*) &&
1142 // For each jump table, map each target in the jump table to the address of
1143 // an emitted MachineBasicBlock.
1144 intptr_t *SlotPtr
= (intptr_t*)JumpTableBase
;
1146 for (unsigned i
= 0, e
= JT
.size(); i
!= e
; ++i
) {
1147 const std::vector
<MachineBasicBlock
*> &MBBs
= JT
[i
].MBBs
;
1148 // Store the address of the basic block for this jump table slot in the
1149 // memory we allocated for the jump table in 'initJumpTableInfo'
1150 for (unsigned mi
= 0, me
= MBBs
.size(); mi
!= me
; ++mi
)
1151 *SlotPtr
++ = getMachineBasicBlockAddress(MBBs
[mi
]);
1156 case MachineJumpTableInfo::EK_Custom32
:
1157 case MachineJumpTableInfo::EK_GPRel32BlockAddress
:
1158 case MachineJumpTableInfo::EK_LabelDifference32
: {
1159 assert(MJTI
->getEntrySize(*TheJIT
->getTargetData()) == 4&&"Cross JIT'ing?");
1160 // For each jump table, place the offset from the beginning of the table
1161 // to the target address.
1162 int *SlotPtr
= (int*)JumpTableBase
;
1164 for (unsigned i
= 0, e
= JT
.size(); i
!= e
; ++i
) {
1165 const std::vector
<MachineBasicBlock
*> &MBBs
= JT
[i
].MBBs
;
1166 // Store the offset of the basic block for this jump table slot in the
1167 // memory we allocated for the jump table in 'initJumpTableInfo'
1168 uintptr_t Base
= (uintptr_t)SlotPtr
;
1169 for (unsigned mi
= 0, me
= MBBs
.size(); mi
!= me
; ++mi
) {
1170 uintptr_t MBBAddr
= getMachineBasicBlockAddress(MBBs
[mi
]);
1171 /// FIXME: USe EntryKind instead of magic "getPICJumpTableEntry" hook.
1172 *SlotPtr
++ = TheJIT
->getJITInfo().getPICJumpTableEntry(MBBAddr
, Base
);
1180 void JITEmitter::startGVStub(const GlobalValue
* GV
,
1181 unsigned StubSize
, unsigned Alignment
) {
1182 SavedBufferBegin
= BufferBegin
;
1183 SavedBufferEnd
= BufferEnd
;
1184 SavedCurBufferPtr
= CurBufferPtr
;
1186 BufferBegin
= CurBufferPtr
= MemMgr
->allocateStub(GV
, StubSize
, Alignment
);
1187 BufferEnd
= BufferBegin
+StubSize
+1;
1190 void JITEmitter::startGVStub(void *Buffer
, unsigned StubSize
) {
1191 SavedBufferBegin
= BufferBegin
;
1192 SavedBufferEnd
= BufferEnd
;
1193 SavedCurBufferPtr
= CurBufferPtr
;
1195 BufferBegin
= CurBufferPtr
= (uint8_t *)Buffer
;
1196 BufferEnd
= BufferBegin
+StubSize
+1;
1199 void JITEmitter::finishGVStub() {
1200 assert(CurBufferPtr
!= BufferEnd
&& "Stub overflowed allocated space.");
1201 NumBytes
+= getCurrentPCOffset();
1202 BufferBegin
= SavedBufferBegin
;
1203 BufferEnd
= SavedBufferEnd
;
1204 CurBufferPtr
= SavedCurBufferPtr
;
1207 void *JITEmitter::allocIndirectGV(const GlobalValue
*GV
,
1208 const uint8_t *Buffer
, size_t Size
,
1209 unsigned Alignment
) {
1210 uint8_t *IndGV
= MemMgr
->allocateStub(GV
, Size
, Alignment
);
1211 memcpy(IndGV
, Buffer
, Size
);
1215 // getConstantPoolEntryAddress - Return the address of the 'ConstantNum' entry
1216 // in the constant pool that was last emitted with the 'emitConstantPool'
1219 uintptr_t JITEmitter::getConstantPoolEntryAddress(unsigned ConstantNum
) const {
1220 assert(ConstantNum
< ConstantPool
->getConstants().size() &&
1221 "Invalid ConstantPoolIndex!");
1222 return ConstPoolAddresses
[ConstantNum
];
1225 // getJumpTableEntryAddress - Return the address of the JumpTable with index
1226 // 'Index' in the jumpp table that was last initialized with 'initJumpTableInfo'
1228 uintptr_t JITEmitter::getJumpTableEntryAddress(unsigned Index
) const {
1229 const std::vector
<MachineJumpTableEntry
> &JT
= JumpTable
->getJumpTables();
1230 assert(Index
< JT
.size() && "Invalid jump table index!");
1232 unsigned EntrySize
= JumpTable
->getEntrySize(*TheJIT
->getTargetData());
1234 unsigned Offset
= 0;
1235 for (unsigned i
= 0; i
< Index
; ++i
)
1236 Offset
+= JT
[i
].MBBs
.size();
1238 Offset
*= EntrySize
;
1240 return (uintptr_t)((char *)JumpTableBase
+ Offset
);
1243 void JITEmitter::EmittedFunctionConfig::onDelete(
1244 JITEmitter
*Emitter
, const Function
*F
) {
1245 Emitter
->deallocateMemForFunction(F
);
1247 void JITEmitter::EmittedFunctionConfig::onRAUW(
1248 JITEmitter
*, const Function
*, const Function
*) {
1249 llvm_unreachable("The JIT doesn't know how to handle a"
1250 " RAUW on a value it has emitted.");
1254 //===----------------------------------------------------------------------===//
1255 // Public interface to this file
1256 //===----------------------------------------------------------------------===//
1258 JITCodeEmitter
*JIT::createEmitter(JIT
&jit
, JITMemoryManager
*JMM
,
1259 TargetMachine
&tm
) {
1260 return new JITEmitter(jit
, JMM
, tm
);
1263 // getPointerToFunctionOrStub - If the specified function has been
1264 // code-gen'd, return a pointer to the function. If not, compile it, or use
1265 // a stub to implement lazy compilation if available.
1267 void *JIT::getPointerToFunctionOrStub(Function
*F
) {
1268 // If we have already code generated the function, just return the address.
1269 if (void *Addr
= getPointerToGlobalIfAvailable(F
))
1272 // Get a stub if the target supports it.
1273 assert(isa
<JITEmitter
>(JCE
) && "Unexpected MCE?");
1274 JITEmitter
*JE
= cast
<JITEmitter
>(getCodeEmitter());
1275 return JE
->getJITResolver().getLazyFunctionStub(F
);
1278 void JIT::updateFunctionStub(Function
*F
) {
1279 // Get the empty stub we generated earlier.
1280 assert(isa
<JITEmitter
>(JCE
) && "Unexpected MCE?");
1281 JITEmitter
*JE
= cast
<JITEmitter
>(getCodeEmitter());
1282 void *Stub
= JE
->getJITResolver().getLazyFunctionStub(F
);
1283 void *Addr
= getPointerToGlobalIfAvailable(F
);
1284 assert(Addr
!= Stub
&& "Function must have non-stub address to be updated.");
1286 // Tell the target jit info to rewrite the stub at the specified address,
1287 // rather than creating a new one.
1288 TargetJITInfo::StubLayout layout
= getJITInfo().getStubLayout();
1289 JE
->startGVStub(Stub
, layout
.Size
);
1290 getJITInfo().emitFunctionStub(F
, Addr
, *getCodeEmitter());
1294 /// freeMachineCodeForFunction - release machine code memory for given Function.
1296 void JIT::freeMachineCodeForFunction(Function
*F
) {
1297 // Delete translation for this from the ExecutionEngine, so it will get
1298 // retranslated next time it is used.
1299 updateGlobalMapping(F
, 0);
1301 // Free the actual memory for the function body and related stuff.
1302 assert(isa
<JITEmitter
>(JCE
) && "Unexpected MCE?");
1303 cast
<JITEmitter
>(JCE
)->deallocateMemForFunction(F
);