MCMachOStreamer.cpp revision 8906ff1b9dfde28f1ff00706643ca10843b26e01
1fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//===- lib/MC/MCMachOStreamer.cpp - Mach-O Object Output ------------===//
2fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//
3fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//                     The LLVM Compiler Infrastructure
4fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//
5fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// This file is distributed under the University of Illinois Open Source
6fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// License. See LICENSE.TXT for details.
7fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//
8fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//===----------------------------------------------------------------------===//
9fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
10fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/MC/MCStreamer.h"
11fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
12fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/ADT/DenseMap.h"
13fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/MC/MCAssembler.h"
14fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/MC/MCContext.h"
15fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/MC/MCSection.h"
16fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/MC/MCSymbol.h"
17fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/MC/MCValue.h"
18fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/Support/ErrorHandling.h"
19fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarusing namespace llvm;
20fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
21fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarnamespace {
22fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
23fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarclass MCMachOStreamer : public MCStreamer {
24fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  MCAssembler Assembler;
25fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
26fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  MCSectionData *CurSectionData;
27fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
28fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  DenseMap<const MCSection*, MCSectionData*> SectionMap;
29fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
30fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarpublic:
31fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  MCMachOStreamer(MCContext &Context, raw_ostream &_OS)
32fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar    : MCStreamer(Context), Assembler(_OS), CurSectionData(0) {}
33fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  ~MCMachOStreamer() {}
34fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
35fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  /// @name MCStreamer Interface
36fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  /// @{
37fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
38fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  virtual void SwitchSection(const MCSection *Section);
39fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
40fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  virtual void EmitLabel(MCSymbol *Symbol);
41fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
42fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  virtual void EmitAssemblerFlag(AssemblerFlag Flag);
43fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
44fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  virtual void EmitAssignment(MCSymbol *Symbol, const MCValue &Value,
45fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar                              bool MakeAbsolute = false);
46fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
47fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  virtual void EmitSymbolAttribute(MCSymbol *Symbol, SymbolAttr Attribute);
48fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
49fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue);
50fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
51fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  virtual void EmitLocalSymbol(MCSymbol *Symbol, const MCValue &Value);
52fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
53fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  virtual void EmitCommonSymbol(MCSymbol *Symbol, unsigned Size,
54fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar                                unsigned Pow2Alignment, bool IsLocal);
55fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
56fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  virtual void EmitZerofill(MCSection *Section, MCSymbol *Symbol = NULL,
57fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar                            unsigned Size = 0, unsigned Pow2Alignment = 0);
58fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
59fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  virtual void EmitBytes(const StringRef &Data);
60fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
61fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  virtual void EmitValue(const MCValue &Value, unsigned Size);
62fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
63fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0,
64fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar                                    unsigned ValueSize = 1,
65fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar                                    unsigned MaxBytesToEmit = 0);
66fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
67fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  virtual void EmitValueToOffset(const MCValue &Offset,
68fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar                                 unsigned char Value = 0);
69fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
70fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  virtual void EmitInstruction(const MCInst &Inst);
71fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
72fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  virtual void Finish();
73fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
74fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  /// @}
75fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar};
76fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
77fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar} // end anonymous namespace.
78fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
79fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::SwitchSection(const MCSection *Section) {
80fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  assert(Section && "Cannot switch to a null section!");
81fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
82fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  if (Section != CurSection) {
83fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar    CurSection = Section;
84fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar    MCSectionData *&Entry = SectionMap[Section];
85fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
86fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar    if (!Entry)
87fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar      Entry = new MCSectionData(*Section, &Assembler);
88fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
89fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar    CurSectionData = Entry;
90fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  }
91fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
92fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
93fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitLabel(MCSymbol *Symbol) {
948906ff1b9dfde28f1ff00706643ca10843b26e01Daniel Dunbar  assert(Symbol->isUndefined() && "Cannot define a symbol twice!");
95fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  assert(CurSection && "Cannot emit before setting section!");
96fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
97fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  llvm_unreachable("FIXME: Not yet implemented!");
98fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
998906ff1b9dfde28f1ff00706643ca10843b26e01Daniel Dunbar  Symbol->setSection(*CurSection);
100fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
101fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
102fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitAssemblerFlag(AssemblerFlag Flag) {
103fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  llvm_unreachable("FIXME: Not yet implemented!");
104fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
105fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
106fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitAssignment(MCSymbol *Symbol,
107fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar                                     const MCValue &Value,
108fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar                                     bool MakeAbsolute) {
1098906ff1b9dfde28f1ff00706643ca10843b26e01Daniel Dunbar  // Only absolute symbols can be redefined.
1108906ff1b9dfde28f1ff00706643ca10843b26e01Daniel Dunbar  assert((Symbol->isUndefined() || Symbol->isAbsolute()) &&
1118906ff1b9dfde28f1ff00706643ca10843b26e01Daniel Dunbar         "Cannot define a symbol twice!");
112fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
113fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  llvm_unreachable("FIXME: Not yet implemented!");
114fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
115fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
116fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
117fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar                                          SymbolAttr Attribute) {
118fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  llvm_unreachable("FIXME: Not yet implemented!");
119fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
120fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
121fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
122fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  llvm_unreachable("FIXME: Not yet implemented!");
123fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
124fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
125fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitLocalSymbol(MCSymbol *Symbol, const MCValue &Value) {
126fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  llvm_unreachable("FIXME: Not yet implemented!");
127fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
128fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
129fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitCommonSymbol(MCSymbol *Symbol, unsigned Size,
130fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar                                       unsigned Pow2Alignment,
131fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar                                       bool IsLocal) {
132fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  llvm_unreachable("FIXME: Not yet implemented!");
133fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
134fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
135fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitZerofill(MCSection *Section, MCSymbol *Symbol,
136fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar                                   unsigned Size, unsigned Pow2Alignment) {
137fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  llvm_unreachable("FIXME: Not yet implemented!");
138fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
139fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
140fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitBytes(const StringRef &Data) {
1410705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  MCDataFragment *DF = new MCDataFragment(CurSectionData);
1420705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  DF->getContents().append(Data.begin(), Data.end());
143fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
144fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
145fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitValue(const MCValue &Value, unsigned Size) {
1460705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  new MCFillFragment(Value, Size, 1, CurSectionData);
147fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
148fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
149fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitValueToAlignment(unsigned ByteAlignment,
150fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar                                           int64_t Value, unsigned ValueSize,
151fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar                                           unsigned MaxBytesToEmit) {
152d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  if (MaxBytesToEmit == 0)
153d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    MaxBytesToEmit = ByteAlignment;
1540705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  new MCAlignFragment(ByteAlignment, Value, ValueSize, MaxBytesToEmit,
1550705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar                      CurSectionData);
1560705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1570705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  // Update the maximum alignment on the current section if necessary
1580705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  if (ByteAlignment > CurSectionData->getAlignment())
1590705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    CurSectionData->setAlignment(ByteAlignment);
160fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
161fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
162fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitValueToOffset(const MCValue &Offset,
163fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar                                        unsigned char Value) {
164d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  new MCOrgFragment(Offset, Value, CurSectionData);
165fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
166fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
167fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitInstruction(const MCInst &Inst) {
168fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  llvm_unreachable("FIXME: Not yet implemented!");
169fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
170fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
171fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::Finish() {
172fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  Assembler.Finish();
173fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
174fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
175fb4a6b397665df011348ade24a8e38d2219f095aDaniel DunbarMCStreamer *llvm::createMachOStreamer(MCContext &Context, raw_ostream &OS) {
176fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  return new MCMachOStreamer(Context, OS);
177fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
178