~ubuntu-branches/ubuntu/wily/clamav/wily-proposed

« back to all changes in this revision

Viewing changes to libclamav/c++/llvm/lib/ExecutionEngine/JIT/JITEmitter.cpp

  • Committer: Package Import Robot
  • Author(s): Scott Kitterman, Sebastian Andrzej Siewior, Andreas Cadhalpun, Scott Kitterman, Javier Fernández-Sanguino
  • Date: 2015-01-28 00:25:13 UTC
  • mfrom: (0.48.14 sid)
  • Revision ID: package-import@ubuntu.com-20150128002513-lil2oi74cooy4lzr
Tags: 0.98.6+dfsg-1
[ Sebastian Andrzej Siewior ]
* update "fix-ssize_t-size_t-off_t-printf-modifier", include of misc.h was
  missing but was pulled in via the systemd patch.
* Don't leak return codes from libmspack to clamav API. (Closes: #774686).

[ Andreas Cadhalpun ]
* Add patch to avoid emitting incremental progress messages when not
  outputting to a terminal. (Closes: #767350)
* Update lintian-overrides for unused-file-paragraph-in-dep5-copyright.
* clamav-base.postinst: always chown /var/log/clamav and /var/lib/clamav
  to clamav:clamav, not only on fresh installations. (Closes: #775400)
* Adapt the clamav-daemon and clamav-freshclam logrotate scripts,
  so that they correctly work under systemd.
* Move the PidFile variable from the clamd/freshclam configuration files
  to the init scripts. This makes the init scripts more robust against
  misconfiguration and avoids error messages with systemd. (Closes: #767353)
* debian/copyright: drop files from Files-Excluded only present in github
  tarballs
* Drop Workaround-a-bug-in-libc-on-Hurd.patch, because hurd got fixed.
  (see #752237)
* debian/rules: Remove useless --with-system-tommath --without-included-ltdl
  configure options.

[ Scott Kitterman ]
* Stop stripping llvm when repacking the tarball as the system llvm on some
  releases is too old to use
* New upstream bugfix release
  - Library shared object revisions.
  - Includes a patch from Sebastian Andrzej Siewior making ClamAV pid files
    compatible with systemd.
  - Fix a heap out of bounds condition with crafted Yoda's crypter files.
    This issue was discovered by Felix Groebert of the Google Security Team.
  - Fix a heap out of bounds condition with crafted mew packer files. This
    issue was discovered by Felix Groebert of the Google Security Team.
  - Fix a heap out of bounds condition with crafted upx packer files. This
    issue was discovered by Kevin Szkudlapski of Quarkslab.
  - Fix a heap out of bounds condition with crafted upack packer files. This
    issue was discovered by Sebastian Andrzej Siewior. CVE-2014-9328.
  - Compensate a crash due to incorrect compiler optimization when handling
    crafted petite packer files. This issue was discovered by Sebastian
    Andrzej Siewior.
* Update lintian override for embedded zlib to match new so version

[ Javier Fernández-Sanguino ]
* Updated Spanish Debconf template translation (Closes: #773563)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
//===-- JITEmitter.cpp - Write machine code to executable memory ----------===//
 
2
//
 
3
//                     The LLVM Compiler Infrastructure
 
4
//
 
5
// This file is distributed under the University of Illinois Open Source
 
6
// License. See LICENSE.TXT for details.
 
7
//
 
8
//===----------------------------------------------------------------------===//
 
9
//
 
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.
 
12
//
 
13
//===----------------------------------------------------------------------===//
 
14
 
 
15
#define DEBUG_TYPE "jit"
 
16
#include "JIT.h"
 
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"
 
52
#include <algorithm>
 
53
#ifndef NDEBUG
 
54
#include <iomanip>
 
55
#endif
 
56
using namespace llvm;
 
57
 
 
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");
 
61
 
 
62
 
 
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();
 
67
}
 
68
 
 
69
//===----------------------------------------------------------------------===//
 
70
// JIT lazy compilation code.
 
71
//
 
72
namespace {
 
73
  class JITEmitter;
 
74
  class JITResolverState;
 
75
 
 
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.");
 
82
    }
 
83
  };
 
84
 
 
85
  struct CallSiteValueMapConfig : public NoRAUWValueMapConfig<Function*> {
 
86
    typedef JITResolverState *ExtraData;
 
87
    static void onDelete(JITResolverState *JRS, Function *F);
 
88
  };
 
89
 
 
90
  class JITResolverState {
 
91
  public:
 
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;
 
98
  private:
 
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;
 
102
 
 
103
    /// CallSiteToFunctionMap - Keep track of the function that each lazy call
 
104
    /// site corresponds to, and vice versa.
 
105
    CallSiteToFunctionMapTy CallSiteToFunctionMap;
 
106
    FunctionToCallSitesMapTy FunctionToCallSitesMap;
 
107
 
 
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;
 
111
 
 
112
    /// Instance of the JIT this ResolverState serves.
 
113
    JIT *TheJIT;
 
114
 
 
115
  public:
 
116
    JITResolverState(JIT *jit) : FunctionToLazyStubMap(this),
 
117
                                 FunctionToCallSitesMap(this),
 
118
                                 TheJIT(jit) {}
 
119
 
 
120
    FunctionToLazyStubMapTy& getFunctionToLazyStubMap(
 
121
      const MutexGuard& locked) {
 
122
      assert(locked.holds(TheJIT->lock));
 
123
      return FunctionToLazyStubMap;
 
124
    }
 
125
 
 
126
    GlobalToIndirectSymMapTy& getGlobalToIndirectSymMap(const MutexGuard& locked) {
 
127
      assert(locked.holds(TheJIT->lock));
 
128
      return GlobalToIndirectSymMap;
 
129
    }
 
130
 
 
131
    pair<void *, Function *> LookupFunctionFromCallSite(
 
132
        const MutexGuard &locked, void *CallSite) const {
 
133
      assert(locked.holds(TheJIT->lock));
 
134
 
 
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!");
 
141
      --I;
 
142
      return *I;
 
143
    }
 
144
 
 
145
    void AddCallSite(const MutexGuard &locked, void *CallSite, Function *F) {
 
146
      assert(locked.holds(TheJIT->lock));
 
147
 
 
148
      bool Inserted = CallSiteToFunctionMap.insert(
 
149
          std::make_pair(CallSite, F)).second;
 
150
      (void)Inserted;
 
151
      assert(Inserted && "Pair was already in CallSiteToFunctionMap");
 
152
      FunctionToCallSitesMap[F].insert(CallSite);
 
153
    }
 
154
 
 
155
    void EraseAllCallSitesForPrelocked(Function *F);
 
156
 
 
157
    // Erases _all_ call sites regardless of their function.  This is used to
 
158
    // unregister the stub addresses from the StubToResolverMap in
 
159
    // ~JITResolver().
 
160
    void EraseAllCallSitesPrelocked();
 
161
  };
 
162
 
 
163
  /// JITResolver - Keep track of, and resolve, call sites for functions that
 
164
  /// have not yet been compiled.
 
165
  class JITResolver {
 
166
    typedef JITResolverState::FunctionToLazyStubMapTy FunctionToLazyStubMapTy;
 
167
    typedef JITResolverState::CallSiteToFunctionMapTy CallSiteToFunctionMapTy;
 
168
    typedef JITResolverState::GlobalToIndirectSymMapTy GlobalToIndirectSymMapTy;
 
169
 
 
170
    /// LazyResolverFn - The target lazy resolver function that we actually
 
171
    /// rewrite instructions to use.
 
172
    TargetJITInfo::LazyResolverFn LazyResolverFn;
 
173
 
 
174
    JITResolverState state;
 
175
 
 
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;
 
182
 
 
183
    /// revGOTMap - map addresses to indexes in the GOT
 
184
    std::map<void*, unsigned> revGOTMap;
 
185
    unsigned nextGOTIndex;
 
186
 
 
187
    JITEmitter &JE;
 
188
 
 
189
    /// Instance of JIT corresponding to this Resolver.
 
190
    JIT *TheJIT;
 
191
 
 
192
  public:
 
193
    explicit JITResolver(JIT &jit, JITEmitter &je)
 
194
      : state(&jit), nextGOTIndex(0), JE(je), TheJIT(&jit) {
 
195
      LazyResolverFn = jit.getJITInfo().getLazyResolverFunction(JITCompilerFn);
 
196
    }
 
197
 
 
198
    ~JITResolver();
 
199
 
 
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);
 
203
 
 
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);
 
207
 
 
208
    /// getExternalFunctionStub - Return a stub for the function at the
 
209
    /// specified address, created lazily on demand.
 
210
    void *getExternalFunctionStub(void *FnAddr);
 
211
 
 
212
    /// getGlobalValueIndirectSym - Return an indirect symbol containing the
 
213
    /// specified GV address.
 
214
    void *getGlobalValueIndirectSym(GlobalValue *V, void *GVAddress);
 
215
 
 
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);
 
220
 
 
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);
 
225
  };
 
226
 
 
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.
 
230
    ///
 
231
    /// Guarded by Lock.
 
232
    std::map<void*, JITResolver*> Map;
 
233
 
 
234
    /// Guards Map from concurrent accesses.
 
235
    mutable sys::Mutex Lock;
 
236
 
 
237
  public:
 
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));
 
242
    }
 
243
    /// Unregisters the Stub when it's invalidated.
 
244
    void UnregisterStubResolver(void *Stub) {
 
245
      MutexGuard guard(Lock);
 
246
      Map.erase(Stub);
 
247
    }
 
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
 
254
      // JITResolverState.
 
255
      std::map<void*, JITResolver*>::const_iterator I = Map.upper_bound(Stub);
 
256
      assert(I != Map.begin() && "This is not a known stub!");
 
257
      --I;
 
258
      return I->second;
 
259
    }
 
260
    /// True if any stubs refer to the given resolver. Only used in an assert().
 
261
    /// O(N)
 
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)
 
267
          return true;
 
268
      }
 
269
      return false;
 
270
    }
 
271
  };
 
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;
 
275
 
 
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;
 
280
 
 
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;
 
284
 
 
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;
 
290
 
 
291
    /// Relocations - These are the relocations that the function needs, as
 
292
    /// emitted.
 
293
    std::vector<MachineRelocation> Relocations;
 
294
 
 
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;
 
299
 
 
300
    /// ConstantPool - The constant pool for the current function.
 
301
    ///
 
302
    MachineConstantPool *ConstantPool;
 
303
 
 
304
    /// ConstantPoolBase - A pointer to the first entry in the constant pool.
 
305
    ///
 
306
    void *ConstantPoolBase;
 
307
 
 
308
    /// ConstPoolAddresses - Addresses of individual constant pool entries.
 
309
    ///
 
310
    SmallVector<uintptr_t, 8> ConstPoolAddresses;
 
311
 
 
312
    /// JumpTable - The jump tables for the current function.
 
313
    ///
 
314
    MachineJumpTableInfo *JumpTable;
 
315
 
 
316
    /// JumpTableBase - A pointer to the first entry in the jump table.
 
317
    ///
 
318
    void *JumpTableBase;
 
319
 
 
320
    /// Resolver - This contains info about the currently resolved functions.
 
321
    JITResolver Resolver;
 
322
 
 
323
    /// DE - The dwarf emitter for the jit.
 
324
    OwningPtr<JITDwarfEmitter> DE;
 
325
 
 
326
    /// DR - The debug registerer for the jit.
 
327
    OwningPtr<JITDebugRegisterer> DR;
 
328
 
 
329
    /// LabelLocations - This vector is a mapping from Label ID's to their
 
330
    /// address.
 
331
    DenseMap<MCSymbol*, uintptr_t> LabelLocations;
 
332
 
 
333
    /// MMI - Machine module info for exception informations
 
334
    MachineModuleInfo* MMI;
 
335
 
 
336
    // CurFn - The llvm function being emitted.  Only valid during
 
337
    // finishFunction().
 
338
    const Function *CurFn;
 
339
 
 
340
    /// Information about emitted code, which is passed to the
 
341
    /// JITEventListeners.  This is reset in startFunction and used in
 
342
    /// finishFunction.
 
343
    JITEvent_EmittedFunctionDetails EmissionDetails;
 
344
 
 
345
    struct EmittedCode {
 
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) {}
 
350
    };
 
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*);
 
355
    };
 
356
    ValueMap<const Function *, EmittedCode,
 
357
             EmittedFunctionConfig> EmittedFunctions;
 
358
 
 
359
    DebugLoc PrevDL;
 
360
 
 
361
    /// Instance of the JIT
 
362
    JIT *TheJIT;
 
363
 
 
364
  public:
 
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");
 
372
      }
 
373
 
 
374
      if (JITExceptionHandling || JITEmitDebugInfo) {
 
375
        DE.reset(new JITDwarfEmitter(jit));
 
376
      }
 
377
      if (JITEmitDebugInfo) {
 
378
        DR.reset(new JITDebugRegisterer(TM));
 
379
      }
 
380
    }
 
381
    ~JITEmitter() {
 
382
      delete MemMgr;
 
383
    }
 
384
 
 
385
    /// classof - Methods for support type inquiry through isa, cast, and
 
386
    /// dyn_cast:
 
387
    ///
 
388
    static inline bool classof(const MachineCodeEmitter*) { return true; }
 
389
 
 
390
    JITResolver &getJITResolver() { return Resolver; }
 
391
 
 
392
    virtual void startFunction(MachineFunction &F);
 
393
    virtual bool finishFunction(MachineFunction &F);
 
394
 
 
395
    void emitConstantPool(MachineConstantPool *MCP);
 
396
    void initJumpTableInfo(MachineJumpTableInfo *MJTI);
 
397
    void emitJumpTableInfo(MachineJumpTableInfo *MJTI);
 
398
 
 
399
    void startGVStub(const GlobalValue* GV,
 
400
                     unsigned StubSize, unsigned Alignment = 1);
 
401
    void startGVStub(void *Buffer, unsigned StubSize);
 
402
    void finishGVStub();
 
403
    virtual void *allocIndirectGV(const GlobalValue *GV,
 
404
                                  const uint8_t *Buffer, size_t Size,
 
405
                                  unsigned Alignment);
 
406
 
 
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);
 
410
 
 
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);
 
415
 
 
416
    virtual void addRelocation(const MachineRelocation &MR) {
 
417
      Relocations.push_back(MR);
 
418
    }
 
419
 
 
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");
 
429
    }
 
430
 
 
431
    virtual uintptr_t getConstantPoolEntryAddress(unsigned Entry) const;
 
432
    virtual uintptr_t getJumpTableEntryAddress(unsigned Entry) const;
 
433
 
 
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()];
 
438
    }
 
439
 
 
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);
 
444
 
 
445
    /// deallocateMemForFunction - Deallocate all memory for the specified
 
446
    /// function body.
 
447
    void deallocateMemForFunction(const Function *F);
 
448
 
 
449
    virtual void processDebugLoc(DebugLoc DL, bool BeforePrintingInsn);
 
450
 
 
451
    virtual void emitLabel(MCSymbol *Label) {
 
452
      LabelLocations[Label] = getCurrentPCValue();
 
453
    }
 
454
 
 
455
    virtual DenseMap<MCSymbol*, uintptr_t> *getLabelLocations() {
 
456
      return &LabelLocations;
 
457
    }
 
458
 
 
459
    virtual uintptr_t getLabelAddress(MCSymbol *Label) const {
 
460
      assert(LabelLocations.count(Label) && "Label not emitted!");
 
461
      return LabelLocations.find(Label)->second;
 
462
    }
 
463
 
 
464
    virtual void setModuleInfo(MachineModuleInfo* Info) {
 
465
      MMI = Info;
 
466
      if (DE.get()) DE->setModuleInfo(Info);
 
467
    }
 
468
 
 
469
  private:
 
470
    void *getPointerToGlobal(GlobalValue *GV, void *Reference,
 
471
                             bool MayNeedFarStub);
 
472
    void *getPointerToGVIndirectSym(GlobalValue *V, void *Reference);
 
473
  };
 
474
}
 
475
 
 
476
void CallSiteValueMapConfig::onDelete(JITResolverState *JRS, Function *F) {
 
477
  JRS->EraseAllCallSitesForPrelocked(F);
 
478
}
 
479
 
 
480
void JITResolverState::EraseAllCallSitesForPrelocked(Function *F) {
 
481
  FunctionToCallSitesMapTy::iterator F2C = FunctionToCallSitesMap.find(F);
 
482
  if (F2C == FunctionToCallSitesMap.end())
 
483
    return;
 
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);
 
489
    (void)Erased;
 
490
    assert(Erased && "Missing call site->function mapping");
 
491
  }
 
492
  FunctionToCallSitesMap.erase(F2C);
 
493
}
 
494
 
 
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);
 
501
  }
 
502
  CallSiteToFunctionMap.clear();
 
503
  FunctionToCallSitesMap.clear();
 
504
}
 
505
 
 
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.");
 
511
}
 
512
 
 
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);
 
517
 
 
518
  // If we already have a stub for this function, recycle it.
 
519
  return state.getFunctionToLazyStubMap(locked).lookup(F);
 
520
}
 
521
 
 
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);
 
526
 
 
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;
 
530
 
 
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;
 
535
 
 
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);
 
540
 
 
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;
 
544
  }
 
545
 
 
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);
 
551
  JE.finishGVStub();
 
552
 
 
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);
 
558
  }
 
559
 
 
560
  DEBUG(dbgs() << "JIT: Lazy stub emitted at [" << Stub << "] for function '"
 
561
        << F->getName() << "'\n");
 
562
 
 
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);
 
567
 
 
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);
 
578
  }
 
579
 
 
580
  return Stub;
 
581
}
 
582
 
 
583
/// getGlobalValueIndirectSym - Return a lazy pointer containing the specified
 
584
/// GV address.
 
585
void *JITResolver::getGlobalValueIndirectSym(GlobalValue *GV, void *GVAddress) {
 
586
  MutexGuard locked(TheJIT->lock);
 
587
 
 
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;
 
591
 
 
592
  // Otherwise, codegen a new indirect symbol.
 
593
  IndirectSym = TheJIT->getJITInfo().emitGlobalValueIndirectSym(GV, GVAddress,
 
594
                                                                JE);
 
595
 
 
596
  DEBUG(dbgs() << "JIT: Indirect symbol emitted at [" << IndirectSym
 
597
        << "] for GV '" << GV->getName() << "'\n");
 
598
 
 
599
  return IndirectSym;
 
600
}
 
601
 
 
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;
 
608
 
 
609
  TargetJITInfo::StubLayout SL = TheJIT->getJITInfo().getStubLayout();
 
610
  JE.startGVStub(0, SL.Size, SL.Alignment);
 
611
  Stub = TheJIT->getJITInfo().emitFunctionStub(0, FnAddr, JE);
 
612
  JE.finishGVStub();
 
613
 
 
614
  DEBUG(dbgs() << "JIT: Stub emitted at [" << Stub
 
615
               << "] for external function at '" << FnAddr << "'\n");
 
616
  return Stub;
 
617
}
 
618
 
 
619
unsigned JITResolver::getGOTIndexForAddr(void* addr) {
 
620
  unsigned idx = revGOTMap[addr];
 
621
  if (!idx) {
 
622
    idx = ++nextGOTIndex;
 
623
    revGOTMap[addr] = idx;
 
624
    DEBUG(dbgs() << "JIT: Adding GOT entry " << idx << " for addr ["
 
625
                 << addr << "]\n");
 
626
  }
 
627
  return idx;
 
628
}
 
629
 
 
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");
 
636
 
 
637
  Function* F = 0;
 
638
  void* ActualPtr = 0;
 
639
 
 
640
  {
 
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);
 
645
 
 
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);
 
650
    F = I.second;
 
651
    ActualPtr = I.first;
 
652
  }
 
653
 
 
654
  // If we have already code generated the function, just return the address.
 
655
  void *Result = JR->TheJIT->getPointerToGlobalIfAvailable(F);
 
656
 
 
657
  if (!Result) {
 
658
    // Otherwise we don't have it, do lazy compilation now.
 
659
 
 
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!");
 
664
    }
 
665
 
 
666
    DEBUG(dbgs() << "JIT: Lazily resolving function '" << F->getName()
 
667
          << "' In stub ptr = " << Stub << " actual ptr = "
 
668
          << ActualPtr << "\n");
 
669
 
 
670
    Result = JR->TheJIT->getPointerToFunction(F);
 
671
  }
 
672
 
 
673
  // Reacquire the lock to update the GOT map.
 
674
  MutexGuard locked(JR->TheJIT->lock);
 
675
 
 
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
 
680
  // needs to call.
 
681
 
 
682
  // FIXME: We could rewrite all references to this stub if we knew them.
 
683
 
 
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];
 
691
 
 
692
  return Result;
 
693
}
 
694
 
 
695
//===----------------------------------------------------------------------===//
 
696
// JITEmitter code.
 
697
//
 
698
void *JITEmitter::getPointerToGlobal(GlobalValue *V, void *Reference,
 
699
                                     bool MayNeedFarStub) {
 
700
  if (GlobalVariable *GV = dyn_cast<GlobalVariable>(V))
 
701
    return TheJIT->getOrEmitGlobalVariable(GV);
 
702
 
 
703
  if (GlobalAlias *GA = dyn_cast<GlobalAlias>(V))
 
704
    return TheJIT->getPointerToGlobal(GA->resolveAliasedGlobal(false));
 
705
 
 
706
  // If we have already compiled the function, return a pointer to its body.
 
707
  Function *F = cast<Function>(V);
 
708
 
 
709
  void *FnStub = Resolver.getLazyFunctionStubIfAvailable(F);
 
710
  if (FnStub) {
 
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.
 
715
    return FnStub;
 
716
  }
 
717
 
 
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;
 
724
 
 
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);
 
729
  }
 
730
 
 
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);
 
735
}
 
736
 
 
737
void *JITEmitter::getPointerToGVIndirectSym(GlobalValue *V, void *Reference) {
 
738
  // Make sure GV is emitted first, and create a stub containing the fully
 
739
  // resolved address.
 
740
  void *GVAddress = getPointerToGlobal(V, Reference, false);
 
741
  void *StubAddr = Resolver.getGlobalValueIndirectSym(V, GVAddress);
 
742
  return StubAddr;
 
743
}
 
744
 
 
745
void JITEmitter::processDebugLoc(DebugLoc DL, bool BeforePrintingInsn) {
 
746
  if (DL.isUnknown()) return;
 
747
  if (!BeforePrintingInsn) return;
 
748
  
 
749
  const LLVMContext &Context = EmissionDetails.MF->getFunction()->getContext();
 
750
 
 
751
  if (DL.getScope(Context) != 0 && PrevDL != DL) {
 
752
    JITEvent_EmittedFunctionDetails::LineStart NextLine;
 
753
    NextLine.Address = getCurrentPCValue();
 
754
    NextLine.Loc = DL;
 
755
    EmissionDetails.LineStarts.push_back(NextLine);
 
756
  }
 
757
 
 
758
  PrevDL = DL;
 
759
}
 
760
 
 
761
static unsigned GetConstantPoolSizeInBytes(MachineConstantPool *MCP,
 
762
                                           const TargetData *TD) {
 
763
  const std::vector<MachineConstantPoolEntry> &Constants = MCP->getConstants();
 
764
  if (Constants.empty()) return 0;
 
765
 
 
766
  unsigned Size = 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);
 
773
  }
 
774
  return Size;
 
775
}
 
776
 
 
777
void JITEmitter::startFunction(MachineFunction &F) {
 
778
  DEBUG(dbgs() << "JIT: Starting CodeGen of Function "
 
779
        << F.getFunction()->getName() << "\n");
 
780
 
 
781
  uintptr_t ActualSize = 0;
 
782
  // Set the memory writable, if it's not already
 
783
  MemMgr->setMemoryWritable();
 
784
  
 
785
  if (SizeEstimate > 0) {
 
786
    // SizeEstimate will be non-zero on reallocation attempts.
 
787
    ActualSize = SizeEstimate;
 
788
  }
 
789
 
 
790
  BufferBegin = CurBufferPtr = MemMgr->startFunctionBody(F.getFunction(),
 
791
                                                         ActualSize);
 
792
  BufferEnd = BufferBegin+ActualSize;
 
793
  EmittedFunctions[F.getFunction()].FunctionBody = BufferBegin;
 
794
 
 
795
  // Ensure the constant pool/jump table info is at least 4-byte aligned.
 
796
  emitAlignment(16);
 
797
 
 
798
  emitConstantPool(F.getConstantPool());
 
799
  if (MachineJumpTableInfo *MJTI = F.getJumpTableInfo())
 
800
    initJumpTableInfo(MJTI);
 
801
 
 
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;
 
806
 
 
807
  MBBLocations.clear();
 
808
 
 
809
  EmissionDetails.MF = &F;
 
810
  EmissionDetails.LineStarts.clear();
 
811
}
 
812
 
 
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);
 
819
    return true;
 
820
  }
 
821
 
 
822
  if (MachineJumpTableInfo *MJTI = F.getJumpTableInfo())
 
823
    emitJumpTableInfo(MJTI);
 
824
 
 
825
  // FnStart is the start of the text, not the start of the constant pool and
 
826
  // other per-function data.
 
827
  uint8_t *FnStart =
 
828
    (uint8_t *)TheJIT->getPointerToGlobalIfAvailable(F.getFunction());
 
829
 
 
830
  // FnEnd is the end of the function's machine code.
 
831
  uint8_t *FnEnd = CurBufferPtr;
 
832
 
 
833
  if (!Relocations.empty()) {
 
834
    CurFn = F.getFunction();
 
835
    NumRelos += Relocations.size();
 
836
 
 
837
    // Resolve the relocations to concrete pointers.
 
838
    for (unsigned i = 0, e = Relocations.size(); i != e; ++i) {
 
839
      MachineRelocation &MR = Relocations[i];
 
840
      void *ResultPtr = 0;
 
841
      if (!MR.letTargetResolve()) {
 
842
        if (MR.isExternalSymbol()) {
 
843
          ResultPtr = TheJIT->getPointerToNamedFunction(MR.getExternalSymbol(),
 
844
                                                        false);
 
845
          DEBUG(dbgs() << "JIT: Map \'" << MR.getExternalSymbol() << "\' to ["
 
846
                       << ResultPtr << "]\n");
 
847
 
 
848
          // If the target REALLY wants a stub for this function, emit it now.
 
849
          if (MR.mayNeedFarStub()) {
 
850
            ResultPtr = Resolver.getExternalFunctionStub(ResultPtr);
 
851
          }
 
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());
 
863
        } else {
 
864
          assert(MR.isJumpTableIndex());
 
865
          ResultPtr=(void*)getJumpTableEntryAddress(MR.getJumpTableIndex());
 
866
        }
 
867
 
 
868
        MR.setResultPointer(ResultPtr);
 
869
      }
 
870
 
 
871
      // if we are managing the GOT and the relocation wants an index,
 
872
      // give it one
 
873
      if (MR.isGOTRelative() && MemMgr->isManagingGOT()) {
 
874
        unsigned idx = Resolver.getGOTIndexForAddr(ResultPtr);
 
875
        MR.setGOTIndex(idx);
 
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]
 
879
                       << "\n");
 
880
          ((void**)MemMgr->getGOTBase())[idx] = ResultPtr;
 
881
        }
 
882
      }
 
883
    }
 
884
 
 
885
    CurFn = 0;
 
886
    TheJIT->getJITInfo().relocate(BufferBegin, &Relocations[0],
 
887
                                  Relocations.size(), MemMgr->getGOTBase());
 
888
  }
 
889
 
 
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]
 
896
                   << "\n");
 
897
      ((void**)MemMgr->getGOTBase())[idx] = (void*)BufferBegin;
 
898
    }
 
899
  }
 
900
 
 
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);
 
904
 
 
905
  if (CurBufferPtr == BufferEnd) {
 
906
    retryWithMoreMemory(F);
 
907
    return true;
 
908
  } else {
 
909
    // Now that we've succeeded in emitting the function, reset the
 
910
    // SizeEstimate back down to zero.
 
911
    SizeEstimate = 0;
 
912
  }
 
913
 
 
914
  BufferBegin = CurBufferPtr = 0;
 
915
  NumBytes += FnEnd-FnStart;
 
916
 
 
917
  // Invalidate the icache if necessary.
 
918
  sys::Memory::InvalidateInstructionCache(FnStart, FnEnd-FnStart);
 
919
 
 
920
  TheJIT->NotifyFunctionEmitted(*F.getFunction(), FnStart, FnEnd-FnStart,
 
921
                                EmissionDetails);
 
922
 
 
923
  // Reset the previous debug location.
 
924
  PrevDL = DebugLoc();
 
925
 
 
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");
 
930
 
 
931
  Relocations.clear();
 
932
  ConstPoolAddresses.clear();
 
933
 
 
934
  // Mark code region readable and executable if it's not so already.
 
935
  MemMgr->setMemoryExecutable();
 
936
 
 
937
  DEBUG({
 
938
      if (sys::hasDisassembler()) {
 
939
        dbgs() << "JIT: Disassembled code:\n";
 
940
        dbgs() << sys::disassembleBuffer(FnStart, FnEnd-FnStart,
 
941
                                         (uintptr_t)FnStart);
 
942
      } else {
 
943
        dbgs() << "JIT: Binary code:\n";
 
944
        uint8_t* q = FnStart;
 
945
        for (int i = 0; q < FnEnd; q += 4, ++i) {
 
946
          if (i == 4)
 
947
            i = 0;
 
948
          if (i == 0)
 
949
            dbgs() << "JIT: " << (long)(q - FnStart) << ": ";
 
950
          bool Done = false;
 
951
          for (int j = 3; j >= 0; --j) {
 
952
            if (q + j >= FnEnd)
 
953
              Done = true;
 
954
            else
 
955
              dbgs() << (unsigned short)q[j];
 
956
          }
 
957
          if (Done)
 
958
            break;
 
959
          dbgs() << ' ';
 
960
          if (i == 3)
 
961
            dbgs() << '\n';
 
962
        }
 
963
        dbgs()<< '\n';
 
964
      }
 
965
    });
 
966
 
 
967
  if (JITExceptionHandling || JITEmitDebugInfo) {
 
968
    uintptr_t ActualSize = 0;
 
969
    SavedBufferBegin = BufferBegin;
 
970
    SavedBufferEnd = BufferEnd;
 
971
    SavedCurBufferPtr = CurBufferPtr;
 
972
 
 
973
    BufferBegin = CurBufferPtr = MemMgr->startExceptionTable(F.getFunction(),
 
974
                                                             ActualSize);
 
975
    BufferEnd = BufferBegin+ActualSize;
 
976
    EmittedFunctions[F.getFunction()].ExceptionTable = BufferBegin;
 
977
    uint8_t *EhStart;
 
978
    uint8_t *FrameRegister = DE->EmitDwarfTable(F, *this, FnStart, FnEnd,
 
979
                                                EhStart);
 
980
    MemMgr->endExceptionTable(F.getFunction(), BufferBegin, CurBufferPtr,
 
981
                              FrameRegister);
 
982
    uint8_t *EhEnd = CurBufferPtr;
 
983
    BufferBegin = SavedBufferBegin;
 
984
    BufferEnd = SavedBufferEnd;
 
985
    CurBufferPtr = SavedCurBufferPtr;
 
986
 
 
987
    if (JITExceptionHandling) {
 
988
      TheJIT->RegisterTable(FrameRegister);
 
989
    }
 
990
 
 
991
    if (JITEmitDebugInfo) {
 
992
      DebugInfo I;
 
993
      I.FnStart = FnStart;
 
994
      I.FnEnd = FnEnd;
 
995
      I.EhStart = EhStart;
 
996
      I.EhEnd = EhEnd;
 
997
      DR->RegisterFunction(F.getFunction(), I);
 
998
    }
 
999
  }
 
1000
 
 
1001
  if (MMI)
 
1002
    MMI->EndFunction();
 
1003
 
 
1004
  return false;
 
1005
}
 
1006
 
 
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();
 
1011
  ++NumRetries;
 
1012
  deallocateMemForFunction(F.getFunction());
 
1013
  // Try again with at least twice as much free space.
 
1014
  SizeEstimate = (uintptr_t)(2 * (BufferEnd - BufferBegin));
 
1015
 
 
1016
  for (MachineFunction::iterator MBB = F.begin(), E = F.end(); MBB != E; ++MBB){
 
1017
    if (MBB->hasAddressTaken())
 
1018
      TheJIT->clearPointerToBasicBlock(MBB->getBasicBlock());
 
1019
  }
 
1020
}
 
1021
 
 
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);
 
1032
 
 
1033
    EmittedFunctions.erase(Emitted);
 
1034
  }
 
1035
 
 
1036
  // TODO: Do we need to unregister exception handling information from libgcc
 
1037
  // here?
 
1038
 
 
1039
  if (JITEmitDebugInfo) {
 
1040
    DR->UnregisterFunction(F);
 
1041
  }
 
1042
}
 
1043
 
 
1044
 
 
1045
void* JITEmitter::allocateSpace(uintptr_t Size, unsigned Alignment) {
 
1046
  if (BufferBegin)
 
1047
    return JITCodeEmitter::allocateSpace(Size, Alignment);
 
1048
 
 
1049
  // create a new memory block if there is no active one.
 
1050
  // care must be taken so that BufferBegin is invalidated when a
 
1051
  // block is trimmed
 
1052
  BufferBegin = CurBufferPtr = MemMgr->allocateSpace(Size, Alignment);
 
1053
  BufferEnd = BufferBegin+Size;
 
1054
  return CurBufferPtr;
 
1055
}
 
1056
 
 
1057
void* JITEmitter::allocateGlobal(uintptr_t Size, unsigned Alignment) {
 
1058
  // Delegate this call through the memory manager.
 
1059
  return MemMgr->allocateGlobal(Size, Alignment);
 
1060
}
 
1061
 
 
1062
void JITEmitter::emitConstantPool(MachineConstantPool *MCP) {
 
1063
  if (TheJIT->getJITInfo().hasCustomConstantPool())
 
1064
    return;
 
1065
 
 
1066
  const std::vector<MachineConstantPoolEntry> &Constants = MCP->getConstants();
 
1067
  if (Constants.empty()) return;
 
1068
 
 
1069
  unsigned Size = GetConstantPoolSizeInBytes(MCP, TheJIT->getTargetData());
 
1070
  unsigned Align = MCP->getConstantPoolAlignment();
 
1071
  ConstantPoolBase = allocateSpace(Size, Align);
 
1072
  ConstantPool = MCP;
 
1073
 
 
1074
  if (ConstantPoolBase == 0) return;  // Buffer overflow.
 
1075
 
 
1076
  DEBUG(dbgs() << "JIT: Emitted constant pool at [" << ConstantPoolBase
 
1077
               << "] (size: " << Size << ", alignment: " << Align << ")\n");
 
1078
 
 
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;
 
1085
 
 
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!");
 
1092
    }
 
1093
    TheJIT->InitializeMemory(CPE.Val.ConstVal, (void*)CAddr);
 
1094
    DEBUG(dbgs() << "JIT:   CP" << i << " at [0x";
 
1095
          dbgs().write_hex(CAddr) << "]\n");
 
1096
 
 
1097
    const Type *Ty = CPE.Val.ConstVal->getType();
 
1098
    Offset += TheJIT->getTargetData()->getTypeAllocSize(Ty);
 
1099
  }
 
1100
}
 
1101
 
 
1102
void JITEmitter::initJumpTableInfo(MachineJumpTableInfo *MJTI) {
 
1103
  if (TheJIT->getJITInfo().hasCustomJumpTables())
 
1104
    return;
 
1105
  if (MJTI->getEntryKind() == MachineJumpTableInfo::EK_Inline)
 
1106
    return;
 
1107
 
 
1108
  const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();
 
1109
  if (JT.empty()) return;
 
1110
 
 
1111
  unsigned NumEntries = 0;
 
1112
  for (unsigned i = 0, e = JT.size(); i != e; ++i)
 
1113
    NumEntries += JT[i].MBBs.size();
 
1114
 
 
1115
  unsigned EntrySize = MJTI->getEntrySize(*TheJIT->getTargetData());
 
1116
 
 
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.
 
1120
  JumpTable = MJTI;
 
1121
  JumpTableBase = allocateSpace(NumEntries * EntrySize,
 
1122
                             MJTI->getEntryAlignment(*TheJIT->getTargetData()));
 
1123
}
 
1124
 
 
1125
void JITEmitter::emitJumpTableInfo(MachineJumpTableInfo *MJTI) {
 
1126
  if (TheJIT->getJITInfo().hasCustomJumpTables())
 
1127
    return;
 
1128
 
 
1129
  const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();
 
1130
  if (JT.empty() || JumpTableBase == 0) return;
 
1131
 
 
1132
  
 
1133
  switch (MJTI->getEntryKind()) {
 
1134
  case MachineJumpTableInfo::EK_Inline:
 
1135
    return;
 
1136
  case MachineJumpTableInfo::EK_BlockAddress: {
 
1137
    // EK_BlockAddress - Each entry is a plain address of block, e.g.:
 
1138
    //     .word LBB123
 
1139
    assert(MJTI->getEntrySize(*TheJIT->getTargetData()) == sizeof(void*) &&
 
1140
           "Cross JIT'ing?");
 
1141
    
 
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;
 
1145
    
 
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]);
 
1152
    }
 
1153
    break;
 
1154
  }
 
1155
      
 
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;
 
1163
 
 
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);
 
1173
      }
 
1174
    }
 
1175
    break;
 
1176
  }
 
1177
  }
 
1178
}
 
1179
 
 
1180
void JITEmitter::startGVStub(const GlobalValue* GV,
 
1181
                             unsigned StubSize, unsigned Alignment) {
 
1182
  SavedBufferBegin = BufferBegin;
 
1183
  SavedBufferEnd = BufferEnd;
 
1184
  SavedCurBufferPtr = CurBufferPtr;
 
1185
 
 
1186
  BufferBegin = CurBufferPtr = MemMgr->allocateStub(GV, StubSize, Alignment);
 
1187
  BufferEnd = BufferBegin+StubSize+1;
 
1188
}
 
1189
 
 
1190
void JITEmitter::startGVStub(void *Buffer, unsigned StubSize) {
 
1191
  SavedBufferBegin = BufferBegin;
 
1192
  SavedBufferEnd = BufferEnd;
 
1193
  SavedCurBufferPtr = CurBufferPtr;
 
1194
 
 
1195
  BufferBegin = CurBufferPtr = (uint8_t *)Buffer;
 
1196
  BufferEnd = BufferBegin+StubSize+1;
 
1197
}
 
1198
 
 
1199
void JITEmitter::finishGVStub() {
 
1200
  assert(CurBufferPtr != BufferEnd && "Stub overflowed allocated space.");
 
1201
  NumBytes += getCurrentPCOffset();
 
1202
  BufferBegin = SavedBufferBegin;
 
1203
  BufferEnd = SavedBufferEnd;
 
1204
  CurBufferPtr = SavedCurBufferPtr;
 
1205
}
 
1206
 
 
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);
 
1212
  return IndGV;
 
1213
}
 
1214
 
 
1215
// getConstantPoolEntryAddress - Return the address of the 'ConstantNum' entry
 
1216
// in the constant pool that was last emitted with the 'emitConstantPool'
 
1217
// method.
 
1218
//
 
1219
uintptr_t JITEmitter::getConstantPoolEntryAddress(unsigned ConstantNum) const {
 
1220
  assert(ConstantNum < ConstantPool->getConstants().size() &&
 
1221
         "Invalid ConstantPoolIndex!");
 
1222
  return ConstPoolAddresses[ConstantNum];
 
1223
}
 
1224
 
 
1225
// getJumpTableEntryAddress - Return the address of the JumpTable with index
 
1226
// 'Index' in the jumpp table that was last initialized with 'initJumpTableInfo'
 
1227
//
 
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!");
 
1231
 
 
1232
  unsigned EntrySize = JumpTable->getEntrySize(*TheJIT->getTargetData());
 
1233
 
 
1234
  unsigned Offset = 0;
 
1235
  for (unsigned i = 0; i < Index; ++i)
 
1236
    Offset += JT[i].MBBs.size();
 
1237
 
 
1238
   Offset *= EntrySize;
 
1239
 
 
1240
  return (uintptr_t)((char *)JumpTableBase + Offset);
 
1241
}
 
1242
 
 
1243
void JITEmitter::EmittedFunctionConfig::onDelete(
 
1244
  JITEmitter *Emitter, const Function *F) {
 
1245
  Emitter->deallocateMemForFunction(F);
 
1246
}
 
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.");
 
1251
}
 
1252
 
 
1253
 
 
1254
//===----------------------------------------------------------------------===//
 
1255
//  Public interface to this file
 
1256
//===----------------------------------------------------------------------===//
 
1257
 
 
1258
JITCodeEmitter *JIT::createEmitter(JIT &jit, JITMemoryManager *JMM,
 
1259
                                   TargetMachine &tm) {
 
1260
  return new JITEmitter(jit, JMM, tm);
 
1261
}
 
1262
 
 
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.
 
1266
//
 
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))
 
1270
    return Addr;
 
1271
 
 
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);
 
1276
}
 
1277
 
 
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.");
 
1285
 
 
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());
 
1291
  JE->finishGVStub();
 
1292
}
 
1293
 
 
1294
/// freeMachineCodeForFunction - release machine code memory for given Function.
 
1295
///
 
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);
 
1300
 
 
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);
 
1304
}