MCStreamer.h revision d814b2150950114a44b607c90ea7a0725c40a8e6
1//===- MCStreamer.h - High-level Streaming Machine Code Output --*- 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 LLVM_MC_MCSTREAMER_H 11#define LLVM_MC_MCSTREAMER_H 12 13namespace llvm { 14 class MCAtom; 15 class MCContext; 16 class MCValue; 17 class MCInst; 18 class MCSection; 19 class MCSymbol; 20 class raw_ostream; 21 22 /// MCStreamer - Streaming machine code generation interface. 23 class MCStreamer { 24 public: 25 enum SymbolAttr { 26 Global, /// .globl 27 Hidden, /// .hidden (ELF) 28 IndirectSymbol, /// .indirect_symbol (Apple) 29 Internal, /// .internal (ELF) 30 LazyReference, /// .lazy_reference (Apple) 31 NoDeadStrip, /// .no_dead_strip (Apple) 32 PrivateExtern, /// .private_extern (Apple) 33 Protected, /// .protected (ELF) 34 Reference, /// .reference (Apple) 35 Weak, /// .weak 36 WeakDefinition, /// .weak_definition (Apple) 37 WeakReference, /// .weak_reference (Apple) 38 39 SymbolAttrFirst = Global, 40 SymbolAttrLast = WeakReference 41 }; 42 43 private: 44 MCContext &Context; 45 46 MCStreamer(const MCStreamer&); // DO NOT IMPLEMENT 47 MCStreamer &operator=(const MCStreamer&); // DO NOT IMPLEMENT 48 49 protected: 50 MCStreamer(MCContext &Ctx); 51 52 public: 53 virtual ~MCStreamer(); 54 55 MCContext &getContext() const { return Context; } 56 57 /// SwitchSection - Set the current section where code is being emitted to 58 /// @param Section. 59 /// 60 /// This corresponds to assembler directives like .section, .text, etc. 61 virtual void SwitchSection(MCSection *Section) = 0; 62 63 /// EmitLabel - Emit a label for @param Symbol into the current section. 64 /// 65 /// This corresponds to an assembler statement such as: 66 /// foo: 67 /// 68 /// @param Symbol - The symbol to emit. A given symbol should only be 69 /// emitted as a label once, and symbols emitted as a label should never be 70 /// used in an assignment. 71 // 72 // FIXME: What to do about the current section? Should we get rid of the 73 // symbol section in the constructor and initialize it here? 74 virtual void EmitLabel(MCSymbol *Symbol) = 0; 75 76 /// EmitAssignment - Emit an assignment of @param Value to @param Symbol. 77 /// 78 /// This corresponds to an assembler statement such as: 79 /// symbol = value 80 /// 81 /// The assignment generates no code, but has the side effect of binding the 82 /// value in the current context. For the assembly streamer, this prints the 83 /// binding into the .s file. 84 /// 85 /// @param Symbol - The symbol being assigned to. 86 /// @param Value - The value for the symbol. 87 /// @param MakeAbsolute - If true, then the symbol should be given the 88 /// absolute value of @param Value, even if @param Value would be 89 /// relocatable expression. This corresponds to the ".set" directive. 90 virtual void EmitAssignment(MCSymbol *Symbol, const MCValue &Value, 91 bool MakeAbsolute = false) = 0; 92 93 /// EmitSymbolAttribute - Add the given @param Attribute to @param Symbol. 94 // 95 // FIXME: This doesn't make much sense, could we just have attributes be on 96 // the symbol and make the printer smart enough to add the right symbols? 97 // This should work as long as the order of attributes in the file doesn't 98 // matter. 99 virtual void EmitSymbolAttribute(MCSymbol *Symbol, 100 SymbolAttr Attribute) = 0; 101 102 /// EmitBytes - Emit @param Length bytes starting at @param Data into the 103 /// output. 104 /// 105 /// This is used to implement assembler directives such as .byte, .ascii, 106 /// etc. 107 virtual void EmitBytes(const char *Data, unsigned Length) = 0; 108 109 /// EmitValue - Emit the expression @param Value into the output as a native 110 /// integer of the given @param Size bytes. 111 /// 112 /// This is used to implement assembler directives such as .word, .quad, 113 /// etc. 114 /// 115 /// @param Value - The value to emit. 116 /// @param Size - The size of the integer (in bytes) to emit. This must 117 /// match a native machine width. 118 virtual void EmitValue(const MCValue &Value, unsigned Size) = 0; 119 120 /// EmitInstruction - Emit the given @param Instruction into the current 121 /// section. 122 virtual void EmitInstruction(const MCInst &Inst) = 0; 123 124 /// Finish - Finish emission of machine code and flush any output. 125 virtual void Finish() = 0; 126 }; 127 128 /// createAsmStreamer - Create a machine code streamer which will print out 129 /// assembly for the native target, suitable for compiling with a native 130 /// assembler. 131 MCStreamer *createAsmStreamer(MCContext &Ctx, raw_ostream &OS); 132 133 // FIXME: These two may end up getting rolled into a single 134 // createObjectStreamer interface, which implements the assembler backend, and 135 // is parameterized on an output object file writer. 136 137 /// createMachOStream - Create a machine code streamer which will generative 138 /// Mach-O format object files. 139 MCStreamer *createMachOStreamer(MCContext &Ctx, raw_ostream &OS); 140 141 /// createELFStreamer - Create a machine code streamer which will generative 142 /// ELF format object files. 143 MCStreamer *createELFStreamer(MCContext &Ctx, raw_ostream &OS); 144 145} // end namespace llvm 146 147#endif 148