Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(89)

Side by Side Diff: include/llvm/MC/MCAsmStreamer.h

Issue 1181263004: subclassed MCAsmStreamer (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-llvm.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | include/llvm/Support/TargetRegistry.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 //===- lib/MC/MCAsmStreamer.cpp - Text Assembly Output --------------------===//
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 #ifndef LLVM_MC_ASM_STREAMER_H
10 #define LLVM_MC_ASM_STREAMER_H
11
12 #include "llvm/MC/MCStreamer.h"
13 #include "llvm/ADT/STLExtras.h"
14 #include "llvm/ADT/SmallString.h"
15 #include "llvm/ADT/StringExtras.h"
16 #include "llvm/ADT/Twine.h"
17 #include "llvm/MC/MCAsmBackend.h"
18 #include "llvm/MC/MCAsmInfo.h"
19 #include "llvm/MC/MCCodeEmitter.h"
20 #include "llvm/MC/MCContext.h"
21 #include "llvm/MC/MCExpr.h"
22 #include "llvm/MC/MCFixupKindInfo.h"
23 #include "llvm/MC/MCInst.h"
24 #include "llvm/MC/MCInstPrinter.h"
25 #include "llvm/MC/MCObjectFileInfo.h"
26 #include "llvm/MC/MCRegisterInfo.h"
27 #include "llvm/MC/MCSectionCOFF.h"
28 #include "llvm/MC/MCSectionMachO.h"
29 #include "llvm/MC/MCSymbol.h"
30 #include "llvm/Support/CommandLine.h"
31 #include "llvm/Support/ErrorHandling.h"
32 #include "llvm/Support/Format.h"
33 #include "llvm/Support/FormattedStream.h"
34 #include "llvm/Support/MathExtras.h"
35 #include "llvm/Support/Path.h"
36 #include <cctype>
37 using namespace llvm;
38
39 class MCAsmStreamer : public MCStreamer {
40 std::unique_ptr<formatted_raw_ostream> OSOwner;
41 formatted_raw_ostream &OS;
42 const MCAsmInfo *MAI;
43 std::unique_ptr<MCInstPrinter> InstPrinter;
44 std::unique_ptr<MCCodeEmitter> Emitter;
45 std::unique_ptr<MCAsmBackend> AsmBackend;
46
47 SmallString<128> CommentToEmit;
48 raw_svector_ostream CommentStream;
49
50 unsigned IsVerboseAsm : 1;
51 unsigned ShowInst : 1;
52 unsigned UseDwarfDirectory : 1;
53 // @LOCALMOD: we don't have an MCAssembler object here, so we can't ask it
54 // if bundle alignment is enabled. Instead, just track the alignment here.
55 unsigned BundleAlignmentEnabled : 1;
56
57 void EmitRegisterName(int64_t Register);
58 void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) override;
59 void EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame) override;
60
61 public:
62 MCAsmStreamer(MCContext &Context, std::unique_ptr<formatted_raw_ostream> os,
63 bool isVerboseAsm, bool useDwarfDirectory,
64 MCInstPrinter *printer, MCCodeEmitter *emitter,
65 MCAsmBackend *asmbackend, bool showInst)
66 : MCStreamer(Context), OSOwner(std::move(os)), OS(*OSOwner),
67 MAI(Context.getAsmInfo()), InstPrinter(printer), Emitter(emitter),
68 AsmBackend(asmbackend), CommentStream(CommentToEmit),
69 IsVerboseAsm(isVerboseAsm), ShowInst(showInst),
70 UseDwarfDirectory(useDwarfDirectory),
71 BundleAlignmentEnabled(0) {
72 if (InstPrinter && IsVerboseAsm)
73 InstPrinter->setCommentStream(CommentStream);
74 }
75
76 inline void EmitEOL() {
77 // If we don't have any comments, just emit a \n.
78 if (!IsVerboseAsm) {
79 OS << '\n';
80 return;
81 }
82 EmitCommentsAndEOL();
83 }
84 void EmitCommentsAndEOL();
85
86 /// isVerboseAsm - Return true if this streamer supports verbose assembly at
87 /// all.
88 bool isVerboseAsm() const override { return IsVerboseAsm; }
89
90 /// hasRawTextSupport - We support EmitRawText.
91 bool hasRawTextSupport() const override { return true; }
92
93 /// AddComment - Add a comment that can be emitted to the generated .s
94 /// file if applicable as a QoI issue to make the output of the compiler
95 /// more readable. This only affects the MCAsmStreamer, and only when
96 /// verbose assembly output is enabled.
97 void AddComment(const Twine &T) override;
98
99 /// AddEncodingComment - Add a comment showing the encoding of an instruction.
100 void AddEncodingComment(const MCInst &Inst, const MCSubtargetInfo &);
101
102 /// GetCommentOS - Return a raw_ostream that comments can be written to.
103 /// Unlike AddComment, you are required to terminate comments with \n if you
104 /// use this method.
105 raw_ostream &GetCommentOS() override {
106 if (!IsVerboseAsm)
107 return nulls(); // Discard comments unless in verbose asm mode.
108 return CommentStream;
109 }
110
111 void emitRawComment(const Twine &T, bool TabPrefix = true) override;
112
113 /// AddBlankLine - Emit a blank line to a .s file to pretty it up.
114 void AddBlankLine() override {
115 EmitEOL();
116 }
117
118 /// @name MCStreamer Interface
119 /// @{
120
121 void ChangeSection(const MCSection *Section,
122 const MCExpr *Subsection) override;
123
124 void EmitLOHDirective(MCLOHType Kind, const MCLOHArgs &Args) override;
125 void EmitLabel(MCSymbol *Symbol) override;
126
127 void EmitAssemblerFlag(MCAssemblerFlag Flag) override;
128 void EmitLinkerOptions(ArrayRef<std::string> Options) override;
129 void EmitDataRegion(MCDataRegionType Kind) override;
130 void EmitVersionMin(MCVersionMinType Kind, unsigned Major, unsigned Minor,
131 unsigned Update) override;
132 void EmitThumbFunc(MCSymbol *Func) override;
133
134 void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;
135 void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override;
136 bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
137
138 void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;
139 void BeginCOFFSymbolDef(const MCSymbol *Symbol) override;
140 void EmitCOFFSymbolStorageClass(int StorageClass) override;
141 void EmitCOFFSymbolType(int Type) override;
142 void EndCOFFSymbolDef() override;
143 void EmitCOFFSectionIndex(MCSymbol const *Symbol) override;
144 void EmitCOFFSecRel32(MCSymbol const *Symbol) override;
145 void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value) override;
146 void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
147 unsigned ByteAlignment) override;
148
149 /// EmitLocalCommonSymbol - Emit a local common (.lcomm) symbol.
150 ///
151 /// @param Symbol - The common symbol to emit.
152 /// @param Size - The size of the common symbol.
153 /// @param ByteAlignment - The alignment of the common symbol in bytes.
154 void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size,
155 unsigned ByteAlignment) override;
156
157 void EmitZerofill(const MCSection *Section, MCSymbol *Symbol = nullptr,
158 uint64_t Size = 0, unsigned ByteAlignment = 0) override;
159
160 void EmitTBSSSymbol (const MCSection *Section, MCSymbol *Symbol,
161 uint64_t Size, unsigned ByteAlignment = 0) override;
162
163 void EmitBytes(StringRef Data) override;
164
165 void EmitValueImpl(const MCExpr *Value, unsigned Size,
166 const SMLoc &Loc = SMLoc()) override;
167 void EmitIntValue(uint64_t Value, unsigned Size) override;
168
169 void EmitULEB128Value(const MCExpr *Value) override;
170
171 void EmitSLEB128Value(const MCExpr *Value) override;
172
173 void EmitGPRel64Value(const MCExpr *Value) override;
174
175 void EmitGPRel32Value(const MCExpr *Value) override;
176
177
178 void EmitFill(uint64_t NumBytes, uint8_t FillValue) override;
179
180 void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0,
181 unsigned ValueSize = 1,
182 unsigned MaxBytesToEmit = 0) override;
183
184 void EmitCodeAlignment(unsigned ByteAlignment,
185 unsigned MaxBytesToEmit = 0) override;
186
187 bool EmitValueToOffset(const MCExpr *Offset,
188 unsigned char Value = 0) override;
189
190 void EmitFileDirective(StringRef Filename) override;
191 unsigned EmitDwarfFileDirective(unsigned FileNo, StringRef Directory,
192 StringRef Filename,
193 unsigned CUID = 0) override;
194 void EmitDwarfLocDirective(unsigned FileNo, unsigned Line,
195 unsigned Column, unsigned Flags,
196 unsigned Isa, unsigned Discriminator,
197 StringRef FileName) override;
198 MCSymbol *getDwarfLineTableSymbol(unsigned CUID) override;
199
200 void EmitIdent(StringRef IdentString) override;
201 void EmitCFISections(bool EH, bool Debug) override;
202 void EmitCFIDefCfa(int64_t Register, int64_t Offset) override;
203 void EmitCFIDefCfaOffset(int64_t Offset) override;
204 void EmitCFIDefCfaRegister(int64_t Register) override;
205 void EmitCFIOffset(int64_t Register, int64_t Offset) override;
206 void EmitCFIPersonality(const MCSymbol *Sym, unsigned Encoding) override;
207 void EmitCFILsda(const MCSymbol *Sym, unsigned Encoding) override;
208 void EmitCFIRememberState() override;
209 void EmitCFIRestoreState() override;
210 void EmitCFISameValue(int64_t Register) override;
211 void EmitCFIRelOffset(int64_t Register, int64_t Offset) override;
212 void EmitCFIAdjustCfaOffset(int64_t Adjustment) override;
213 void EmitCFISignalFrame() override;
214 void EmitCFIUndefined(int64_t Register) override;
215 void EmitCFIRegister(int64_t Register1, int64_t Register2) override;
216 void EmitCFIWindowSave() override;
217
218 void EmitWinCFIStartProc(const MCSymbol *Symbol) override;
219 void EmitWinCFIEndProc() override;
220 void EmitWinCFIStartChained() override;
221 void EmitWinCFIEndChained() override;
222 void EmitWinCFIPushReg(unsigned Register) override;
223 void EmitWinCFISetFrame(unsigned Register, unsigned Offset) override;
224 void EmitWinCFIAllocStack(unsigned Size) override;
225 void EmitWinCFISaveReg(unsigned Register, unsigned Offset) override;
226 void EmitWinCFISaveXMM(unsigned Register, unsigned Offset) override;
227 void EmitWinCFIPushFrame(bool Code) override;
228 void EmitWinCFIEndProlog() override;
229
230 void EmitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except) override;
231 void EmitWinEHHandlerData() override;
232
233 void EmitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override;
234
235 void EmitBundleAlignMode(unsigned AlignPow2) override;
236 void EmitBundleLock(bool AlignToEnd) override;
237 void EmitBundleUnlock() override;
238
239 /// EmitRawText - If this file is backed by an assembly streamer, this dumps
240 /// the specified string in the output .s file. This capability is
241 /// indicated by the hasRawTextSupport() predicate.
242 void EmitRawTextImpl(StringRef String) override;
243
244 void FinishImpl() override;
245 };
246 #endif
OLDNEW
« no previous file with comments | « no previous file | include/llvm/Support/TargetRegistry.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698