Move type handling to make sure we get all created types that aren't
[oota-llvm.git] / lib / CodeGen / ELFCodeEmitter.h
1 //===-- lib/CodeGen/ELFCodeEmitter.h ----------------------------*- C++ -*-===//
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 #ifndef ELFCODEEMITTER_H
11 #define ELFCODEEMITTER_H
12
13 #include "llvm/CodeGen/ObjectCodeEmitter.h"
14 #include <vector>
15
16 namespace llvm {
17   class ELFWriter;
18   class ELFSection;
19
20   /// ELFCodeEmitter - This class is used by the ELFWriter to 
21   /// emit the code for functions to the ELF file.
22   class ELFCodeEmitter : public ObjectCodeEmitter {
23     ELFWriter &EW;
24
25     /// Target machine description
26     TargetMachine &TM;
27
28     /// Section containing code for functions
29     ELFSection *ES;
30
31     /// Relocations - Record relocations needed by the current function 
32     std::vector<MachineRelocation> Relocations;
33
34     /// JTRelocations - Record relocations needed by the relocation
35     /// section.
36     std::vector<MachineRelocation> JTRelocations;
37
38     /// FnStartPtr - Function offset from the beginning of ELFSection 'ES'
39     uintptr_t FnStartOff;
40   public:
41     explicit ELFCodeEmitter(ELFWriter &ew) : EW(ew), TM(EW.TM) {}
42
43     /// addRelocation - Register new relocations for this function
44     void addRelocation(const MachineRelocation &MR) {
45       Relocations.push_back(MR);
46     }
47
48     /// emitConstantPool - For each constant pool entry, figure out which
49     /// section the constant should live in and emit data to it
50     void emitConstantPool(MachineConstantPool *MCP);
51
52     /// emitJumpTables - Emit all the jump tables for a given jump table
53     /// info and record them to the appropriate section.
54     void emitJumpTables(MachineJumpTableInfo *MJTI);
55
56     void startFunction(MachineFunction &F);
57     bool finishFunction(MachineFunction &F);
58
59     /// emitLabel - Emits a label
60     virtual void emitLabel(MCSymbol *Label) {
61       assert(0 && "emitLabel not implemented");
62     }
63
64     /// getLabelAddress - Return the address of the specified LabelID, 
65     /// only usable after the LabelID has been emitted.
66     virtual uintptr_t getLabelAddress(MCSymbol *Label) const {
67       assert(0 && "getLabelAddress not implemented");
68       return 0;
69     }
70
71     virtual void setModuleInfo(llvm::MachineModuleInfo* MMI) {}
72
73 };  // end class ELFCodeEmitter
74
75 } // end namespace llvm
76
77 #endif
78