Rename the file name (looks more similar to LLVM).
diff --git a/lib/bcc/CodeEmitter.h b/lib/bcc/CodeEmitter.h
new file mode 100644
index 0000000..90e95ca
--- /dev/null
+++ b/lib/bcc/CodeEmitter.h
@@ -0,0 +1,354 @@
+/*
+ * Copyright 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef BCC_CODEEMITTER_H
+#define BCC_CODEEMITTER_H
+
+#include <bcc/bcc.h>
+#include <bcc/bcc_cache.h>
+
+#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/CodeGen/MachineRelocation.h"
+#include "llvm/CodeGen/JITCodeEmitter.h"
+#include "llvm/Support/ValueHandle.h"
+
+#include <map>
+#include <vector>
+#include <set>
+
+#include <assert.h>
+#include <stdint.h>
+
+namespace llvm {
+  class Constant;
+  class GenericValue;
+  class GlobalVariable;
+  class GlobalValue;
+  class Function;
+  class MachineBasicBlock;
+  class MachineConstantPool;
+  class MachineFunction;
+  class MachineJumpTableInfo;
+  class MachineModuleInfo;
+#if defined(USE_DISASSEMBLER)
+  class MCAsmInfo;
+  class MCDisassembler;
+  class MCInstPrinter;
+#endif
+  class MCSymbol;
+  class Target;
+  class TargetData;
+  class TargetJITInfo;
+  class TargetMachine;
+  class Type;
+}
+
+namespace bcc {
+  class CodeMemoryManager;
+  class EmittedFuncEntry;
+
+  class CodeEmitter : public llvm::JITCodeEmitter {
+  public:
+    typedef llvm::DenseMap<const llvm::GlobalValue*, void*> GlobalAddressMapTy;
+    typedef GlobalAddressMapTy::const_iterator global_addresses_const_iterator;
+
+    GlobalAddressMapTy mGlobalAddressMap;
+
+  private:
+    CodeMemoryManager *mpMemMgr;
+
+    // The JITInfo for the target we are compiling to
+    const llvm::Target *mpTarget;
+
+    llvm::TargetJITInfo *mpTJI;
+
+    const llvm::TargetData *mpTD;
+
+    EmittedFuncEntry *mpCurEmitFunction;
+
+    typedef std::map<const std::string,
+                     EmittedFuncEntry *> EmittedFunctionsMapTy;
+    EmittedFunctionsMapTy mEmittedFunctions;
+
+    // This vector is a mapping from MBB ID's to their address. It is filled in
+    // by the StartMachineBasicBlock callback and queried by the
+    // getMachineBasicBlockAddress callback.
+    std::vector<uintptr_t> mMBBLocations;
+
+    // The constant pool for the current function.
+    llvm::MachineConstantPool *mpConstantPool;
+
+    // A pointer to the first entry in the constant pool.
+    void *mpConstantPoolBase;
+
+    // Addresses of individual constant pool entries.
+    llvm::SmallVector<uintptr_t, 8> mConstPoolAddresses;
+
+    // The jump tables for the current function.
+    llvm::MachineJumpTableInfo *mpJumpTable;
+
+    // A pointer to the first entry in the jump table.
+    void *mpJumpTableBase;
+
+    // When outputting a function stub in the context of some other function, we
+    // save BufferBegin/BufferEnd/CurBufferPtr here.
+    uint8_t *mpSavedBufferBegin, *mpSavedBufferEnd, *mpSavedCurBufferPtr;
+
+    // These are the relocations that the function needs, as emitted.
+    std::vector<llvm::MachineRelocation> mRelocations;
+
+    std::vector<oBCCRelocEntry> mCachingRelocations;
+
+    // This vector is a mapping from Label ID's to their address.
+    llvm::DenseMap<llvm::MCSymbol*, uintptr_t> mLabelLocations;
+
+    // Machine module info for exception informations
+    llvm::MachineModuleInfo *mpMMI;
+
+    // Replace an existing mapping for GV with a new address. This updates both
+    // maps as required. If Addr is null, the entry for the global is removed
+    // from the mappings.
+    void *UpdateGlobalMapping(const llvm::GlobalValue *GV, void *Addr);
+
+    // Tell the execution engine that the specified global is at the specified
+    // location. This is used internally as functions are JIT'd and as global
+    // variables are laid out in memory.
+    void AddGlobalMapping(const llvm::GlobalValue *GV, void *Addr) {
+       void *&CurVal = mGlobalAddressMap[GV];
+       assert((CurVal == 0 || Addr == 0) && "GlobalMapping already established!");
+       CurVal = Addr;
+    }
+
+    // This returns the address of the specified global value if it is has
+    // already been codegen'd, otherwise it returns null.
+    void *GetPointerToGlobalIfAvailable(const llvm::GlobalValue *GV) {
+      GlobalAddressMapTy::iterator I = mGlobalAddressMap.find(GV);
+      return ((I != mGlobalAddressMap.end()) ? I->second : NULL);
+    }
+
+    unsigned int GetConstantPoolSizeInBytes(llvm::MachineConstantPool *MCP);
+
+    // This function converts a Constant* into a GenericValue. The interesting
+    // part is if C is a ConstantExpr.
+    void GetConstantValue(const llvm::Constant *C, llvm::GenericValue &Result);
+
+    // Stores the data in @Val of type @Ty at address @Addr.
+    void StoreValueToMemory(const llvm::GenericValue &Val, void *Addr,
+                            const llvm::Type *Ty);
+
+    // Recursive function to apply a @Constant value into the specified memory
+    // location @Addr.
+    void InitializeConstantToMemory(const llvm::Constant *C, void *Addr);
+
+    void emitConstantPool(llvm::MachineConstantPool *MCP);
+
+    void initJumpTableInfo(llvm::MachineJumpTableInfo *MJTI);
+
+    void emitJumpTableInfo(llvm::MachineJumpTableInfo *MJTI);
+
+    void *GetPointerToGlobal(llvm::GlobalValue *V,
+                             void *Reference,
+                             bool MayNeedFarStub);
+
+    // If the specified function has been code-gen'd, return a pointer to the
+    // function. If not, compile it, or use a stub to implement lazy compilation
+    // if available.
+    void *GetPointerToFunctionOrStub(llvm::Function *F);
+
+    typedef llvm::DenseMap<const llvm::Function*,
+                           void*> FunctionToLazyStubMapTy;
+    FunctionToLazyStubMapTy mFunctionToLazyStubMap;
+
+    void *GetLazyFunctionStubIfAvailable(llvm::Function *F) {
+      return mFunctionToLazyStubMap.lookup(F);
+    }
+
+    std::set<const llvm::Function*> PendingFunctions;
+    void *GetLazyFunctionStub(llvm::Function *F);
+
+    void *GetPointerToFunction(const llvm::Function *F, bool AbortOnFailure);
+
+    void *GetPointerToNamedSymbol(const std::string &Name,
+                                  bool AbortOnFailure);
+
+    // Return the address of the specified global variable, possibly emitting it
+    // to memory if needed. This is used by the Emitter.
+    void *GetOrEmitGlobalVariable(const llvm::GlobalVariable *GV);
+
+    // This method abstracts memory allocation of global variable so that the
+    // JIT can allocate thread local variables depending on the target.
+    void *GetMemoryForGV(const llvm::GlobalVariable *GV);
+
+    void EmitGlobalVariable(const llvm::GlobalVariable *GV);
+
+    typedef std::map<llvm::AssertingVH<llvm::GlobalValue>,
+                     void *> GlobalToIndirectSymMapTy;
+
+    GlobalToIndirectSymMapTy GlobalToIndirectSymMap;
+
+    void *GetPointerToGVIndirectSym(llvm::GlobalValue *V, void *Reference);
+
+    // This is the equivalent of FunctionToLazyStubMap for external functions.
+    //
+    // TODO(llvm.org): Of course, external functions don't need a lazy stub.
+    //                 It's actually here to make it more likely that far calls
+    //                 succeed, but no single stub can guarantee that. I'll
+    //                 remove this in a subsequent checkin when I actually fix
+    //                 far calls.
+    std::map<void*, void*> ExternalFnToStubMap;
+
+    // Return a stub for the function at the specified address.
+    void *GetExternalFunctionStub(void *FnAddr);
+
+#if defined(USE_DISASSEMBLER)
+    const llvm::MCAsmInfo *mpAsmInfo;
+    const llvm::MCDisassembler *mpDisassmbler;
+    llvm::MCInstPrinter *mpIP;
+#endif
+
+  public:
+    void Disassemble(const llvm::StringRef &Name, uint8_t *Start,
+                     size_t Length, bool IsStub);
+
+  private:
+    // Resolver to undefined symbol in CodeEmitter
+    BCCSymbolLookupFn mpSymbolLookupFn;
+    void *mpSymbolLookupContext;
+
+  public:
+    // Will take the ownership of @MemMgr
+    explicit CodeEmitter(CodeMemoryManager *pMemMgr);
+
+    virtual ~CodeEmitter();
+
+    global_addresses_const_iterator global_address_begin() const {
+      return mGlobalAddressMap.begin();
+    }
+
+    global_addresses_const_iterator global_address_end() const {
+      return mGlobalAddressMap.end();
+    }
+
+    std::vector<oBCCRelocEntry> const &getCachingRelocations() const {
+      return mCachingRelocations;
+    }
+
+    void registerSymbolCallback(BCCSymbolLookupFn pFn, BCCvoid *pContext) {
+      mpSymbolLookupFn = pFn;
+      mpSymbolLookupContext = pContext;
+    }
+
+    void setTargetMachine(llvm::TargetMachine &TM);
+
+    // This callback is invoked when the specified function is about to be code
+    // generated.  This initializes the BufferBegin/End/Ptr fields.
+    virtual void startFunction(llvm::MachineFunction &F);
+
+    // This callback is invoked when the specified function has finished code
+    // generation. If a buffer overflow has occurred, this method returns true
+    // (the callee is required to try again).
+    virtual bool finishFunction(llvm::MachineFunction &F);
+
+    void startGVStub(const llvm::GlobalValue *GV, unsigned StubSize,
+                     unsigned Alignment);
+
+    void startGVStub(void *Buffer, unsigned StubSize);
+
+    void finishGVStub();
+
+    // Allocates and fills storage for an indirect GlobalValue, and returns the
+    // address.
+    virtual void *allocIndirectGV(const llvm::GlobalValue *GV,
+                                  const uint8_t *Buffer, size_t Size,
+                                  unsigned Alignment);
+
+    // Emits a label
+    void emitLabel(llvm::MCSymbol *Label) {
+      mLabelLocations[Label] = getCurrentPCValue();
+    }
+
+    // Allocate memory for a global. Unlike allocateSpace, this method does not
+    // allocate memory in the current output buffer, because a global may live
+    // longer than the current function.
+    virtual void *allocateGlobal(uintptr_t Size, unsigned Alignment);
+
+    // This should be called by the target when a new basic block is about to be
+    // emitted. This way the MCE knows where the start of the block is, and can
+    // implement getMachineBasicBlockAddress.
+    virtual void StartMachineBasicBlock(llvm::MachineBasicBlock *MBB);
+
+    // Whenever a relocatable address is needed, it should be noted with this
+    // interface.
+    virtual void addRelocation(const llvm::MachineRelocation &MR) {
+      mRelocations.push_back(MR);
+    }
+
+    // Return the address of the @Index entry in the constant pool that was
+    // last emitted with the emitConstantPool method.
+    virtual uintptr_t getConstantPoolEntryAddress(unsigned Index) const {
+      assert(Index < mpConstantPool->getConstants().size() &&
+             "Invalid constant pool index!");
+      return mConstPoolAddresses[Index];
+    }
+
+    // Return the address of the jump table with index @Index in the function
+    // that last called initJumpTableInfo.
+    virtual uintptr_t getJumpTableEntryAddress(unsigned Index) const;
+
+    // Return the address of the specified MachineBasicBlock, only usable after
+    // the label for the MBB has been emitted.
+    virtual uintptr_t getMachineBasicBlockAddress(
+                                        llvm::MachineBasicBlock *MBB) const;
+
+    // Return the address of the specified LabelID, only usable after the
+    // LabelID has been emitted.
+    virtual uintptr_t getLabelAddress(llvm::MCSymbol *Label) const {
+      assert(mLabelLocations.count(Label) && "Label not emitted!");
+      return mLabelLocations.find(Label)->second;
+    }
+
+    // Specifies the MachineModuleInfo object. This is used for exception
+    // handling purposes.
+    virtual void setModuleInfo(llvm::MachineModuleInfo *Info) {
+      mpMMI = Info;
+    }
+
+    void updateFunctionStub(const llvm::Function *F);
+
+    void releaseUnnecessary();
+
+    void reset();
+
+    void *lookup(const char *Name) {
+      return lookup( llvm::StringRef(Name) );
+    }
+
+    void *lookup(const llvm::StringRef &Name);
+
+    void getFunctionNames(BCCsizei *actualFunctionCount,
+                          BCCsizei maxFunctionCount,
+                          BCCchar **functions);
+
+    void getFunctionBinary(BCCchar *label,
+                           BCCvoid **base,
+                           BCCsizei *length);
+  };
+
+} // namespace bcc
+
+#endif // BCC_CODEEMITTER_H