182d748d55c549dd055528ed10dbb534618ca8115Chris Lattner//===-- llvm/MC/MCAsmInfo.h - Asm info --------------------------*- C++ -*-===//
282d748d55c549dd055528ed10dbb534618ca8115Chris Lattner//
382d748d55c549dd055528ed10dbb534618ca8115Chris Lattner//                     The LLVM Compiler Infrastructure
482d748d55c549dd055528ed10dbb534618ca8115Chris Lattner//
582d748d55c549dd055528ed10dbb534618ca8115Chris Lattner// This file is distributed under the University of Illinois Open Source
682d748d55c549dd055528ed10dbb534618ca8115Chris Lattner// License. See LICENSE.TXT for details.
782d748d55c549dd055528ed10dbb534618ca8115Chris Lattner//
882d748d55c549dd055528ed10dbb534618ca8115Chris Lattner//===----------------------------------------------------------------------===//
982d748d55c549dd055528ed10dbb534618ca8115Chris Lattner//
1082d748d55c549dd055528ed10dbb534618ca8115Chris Lattner// This file contains a class to be used as the basis for target specific
1182d748d55c549dd055528ed10dbb534618ca8115Chris Lattner// asm writers.  This class primarily takes care of global printing constants,
1282d748d55c549dd055528ed10dbb534618ca8115Chris Lattner// which are used in very similar ways across all targets.
1382d748d55c549dd055528ed10dbb534618ca8115Chris Lattner//
1482d748d55c549dd055528ed10dbb534618ca8115Chris Lattner//===----------------------------------------------------------------------===//
15af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner
16674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_MC_MCASMINFO_H
17674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_MC_MCASMINFO_H
18af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner
19152a29bfa6fa505182658d046bc75626e10d67c3Chris Lattner#include "llvm/MC/MCDirectives.h"
204a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola#include "llvm/MC/MCDwarf.h"
21255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/MC/MachineLocation.h"
2282d748d55c549dd055528ed10dbb534618ca8115Chris Lattner#include <cassert>
232d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng#include <vector>
2482d748d55c549dd055528ed10dbb534618ca8115Chris Lattner
2582d748d55c549dd055528ed10dbb534618ca8115Chris Lattnernamespace llvm {
26cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesclass MCExpr;
27cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesclass MCSection;
28cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesclass MCStreamer;
29cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesclass MCSymbol;
30cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesclass MCContext;
31cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
32cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesnamespace WinEH {
33cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesenum class EncodingType {
34cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  ET_Invalid, /// Invalid
35cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  ET_Alpha,   /// Windows Alpha
36cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  ET_Alpha64, /// Windows AXP64
37cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  ET_ARM,     /// Windows NT (Windows on ARM)
38cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  ET_CE,      /// Windows CE ARM, PowerPC, SH3, SH4
39cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  ET_Itanium, /// Windows x64, Windows Itanium (IA-64)
40cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  ET_MIPS = ET_Alpha,
41cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines};
42cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
43cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
44cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesenum class ExceptionHandling {
45cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  None,     /// No exception support
46cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  DwarfCFI, /// DWARF-like instruction based exceptions
47cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  SjLj,     /// setjmp/longjmp based exceptions
48cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  ARM,      /// ARM EHABI
49cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  WinEH,    /// Windows Exception Handling
50cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines};
51cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
52cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesnamespace LCOMM {
53cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesenum LCOMMType { NoAlignment, ByteAlignment, Log2Alignment };
54cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
55cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
56cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines/// This class is intended to be used as a base class for asm
57cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines/// properties and features specific to the target.
58cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesclass MCAsmInfo {
59cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesprotected:
60cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //===------------------------------------------------------------------===//
61cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Properties to be set by the target writer, used to configure asm printer.
62cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
63cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
64cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// Pointer size in bytes.  Default is 4.
65cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  unsigned PointerSize;
66cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
67cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// Size of the stack slot reserved for callee-saved registers, in bytes.
68cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// Default is same as pointer size.
69cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  unsigned CalleeSaveStackSlotSize;
70cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
71cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True if target is little endian.  Default is true.
72cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool IsLittleEndian;
73cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
74cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True if target stack grow up.  Default is false.
75cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool StackGrowsUp;
76cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
77cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True if this target has the MachO .subsections_via_symbols directive.
78cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// Default is false.
79cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool HasSubsectionsViaSymbols;
80cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
81cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True if this is a MachO target that supports the macho-specific .zerofill
82cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// directive for emitting BSS Symbols.  Default is false.
83cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool HasMachoZeroFillDirective;
84cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
85cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True if this is a MachO target that supports the macho-specific .tbss
86cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// directive for emitting thread local BSS Symbols.  Default is false.
87cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool HasMachoTBSSDirective;
88cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
89cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True if the compiler should emit a ".reference .constructors_used" or
90cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// ".reference .destructors_used" directive after the a static ctor/dtor
91cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// list.  This directive is only emitted in Static relocation model.  Default
92cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// is false.
93cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool HasStaticCtorDtorReferenceInStaticMode;
94cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
95cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True if the linker has a bug and requires that the debug_line section be
96cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// of a minimum size. In practice such a linker requires a non-empty line
97cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// sequence if a file is present.  Default to false.
98cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool LinkerRequiresNonEmptyDwarfLines;
99cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
100cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// This is the maximum possible length of an instruction, which is needed to
101cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// compute the size of an inline asm.  Defaults to 4.
102cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  unsigned MaxInstLength;
103cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
104cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// Every possible instruction length is a multiple of this value.  Factored
105cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// out in .debug_frame and .debug_line.  Defaults to 1.
106cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  unsigned MinInstAlignment;
107cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
108cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// The '$' token, when not referencing an identifier or constant, refers to
109cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// the current PC.  Defaults to false.
110cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool DollarIsPC;
111cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
112cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// This string, if specified, is used to separate instructions from each
113cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// other when on the same line.  Defaults to ';'
114cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *SeparatorString;
115cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
116cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// This indicates the comment character used by the assembler.  Defaults to
117cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// "#"
118cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *CommentString;
119cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
120cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// This is appended to emitted labels.  Defaults to ":"
121cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *LabelSuffix;
122cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
123cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Print the EH begin symbol with an assignment. Defaults to false.
124cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool UseAssignmentForEHBegin;
125cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
126cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// This prefix is used for globals like constant pool entries that are
127cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// completely private to the .s file and should not have names in the .o
128cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// file.  Defaults to "L"
129cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *PrivateGlobalPrefix;
130cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
131cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// This prefix is used for symbols that should be passed through the
132cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// assembler but be removed by the linker.  This is 'l' on Darwin, currently
133cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// used for some ObjC metadata.  The default of "" meast that for this system
134cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// a plain private symbol should be used.  Defaults to "".
135cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *LinkerPrivateGlobalPrefix;
136cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
137cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// If these are nonempty, they contain a directive to emit before and after
138cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// an inline assembly statement.  Defaults to "#APP\n", "#NO_APP\n"
139cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *InlineAsmStart;
140cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *InlineAsmEnd;
141cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
142cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// These are assembly directives that tells the assembler to interpret the
143cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// following instructions differently.  Defaults to ".code16", ".code32",
144cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// ".code64".
145cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *Code16Directive;
146cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *Code32Directive;
147cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *Code64Directive;
148cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
149cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// Which dialect of an assembler variant to use.  Defaults to 0
150cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  unsigned AssemblerDialect;
151cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
152cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// This is true if the assembler allows @ characters in symbol names.
153cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// Defaults to false.
154cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool AllowAtInName;
155cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
156cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// This is true if data region markers should be printed as
157cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// ".data_region/.end_data_region" directives. If false, use "$d/$a" labels
158cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// instead.
159cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool UseDataRegionDirectives;
160cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
161cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //===--- Data Emission Directives -------------------------------------===//
162cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
163cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// This should be set to the directive used to get some number of zero bytes
164cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// emitted to the current section.  Common cases are "\t.zero\t" and
165cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// "\t.space\t".  If this is set to null, the Data*bitsDirective's will be
166cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// used to emit zero bytes.  Defaults to "\t.zero\t"
167cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *ZeroDirective;
168cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
169cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// This directive allows emission of an ascii string with the standard C
170cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// escape characters embedded into it.  Defaults to "\t.ascii\t"
171cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *AsciiDirective;
172cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
173cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// If not null, this allows for special handling of zero terminated strings
174cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// on this target.  This is commonly supported as ".asciz".  If a target
175cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// doesn't support this, it can be set to null.  Defaults to "\t.asciz\t"
176cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *AscizDirective;
177cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
178cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// These directives are used to output some unit of integer data to the
179cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// current section.  If a data directive is set to null, smaller data
180cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// directives will be used to emit the large sizes.  Defaults to "\t.byte\t",
181cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// "\t.short\t", "\t.long\t", "\t.quad\t"
182cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *Data8bitsDirective;
183cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *Data16bitsDirective;
184cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *Data32bitsDirective;
185cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *Data64bitsDirective;
186cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
187cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// If non-null, a directive that is used to emit a word which should be
188cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// relocated as a 64-bit GP-relative offset, e.g. .gpdword on Mips.  Defaults
189cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// to NULL.
190cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *GPRel64Directive;
191cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
192cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// If non-null, a directive that is used to emit a word which should be
193cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// relocated as a 32-bit GP-relative offset, e.g. .gpword on Mips or .gprel32
194cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// on Alpha.  Defaults to NULL.
195cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *GPRel32Directive;
196cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
197cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// This is true if this target uses "Sun Style" syntax for section switching
198cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// ("#alloc,#write" etc) instead of the normal ELF syntax (,"a,w") in
199cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// .section directives.  Defaults to false.
200cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool SunStyleELFSectionSwitchSyntax;
201cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
202cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// This is true if this target uses ELF '.section' directive before the
203cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// '.bss' one. It's used for PPC/Linux which doesn't support the '.bss'
204cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// directive only.  Defaults to false.
205cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool UsesELFSectionDirectiveForBSS;
206cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
207cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool NeedsDwarfSectionOffsetDirective;
208cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
209cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //===--- Alignment Information ----------------------------------------===//
210cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
211cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// If this is true (the default) then the asmprinter emits ".align N"
212cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// directives, where N is the number of bytes to align to.  Otherwise, it
213cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// emits ".align log2(N)", e.g. 3 to align to an 8 byte boundary.  Defaults
214cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// to true.
215cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool AlignmentIsInBytes;
216cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
217cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// If non-zero, this is used to fill the executable space created as the
218cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// result of a alignment directive.  Defaults to 0
219cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  unsigned TextAlignFillValue;
220cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
221cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //===--- Global Variable Emission Directives --------------------------===//
222cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
223cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// This is the directive used to declare a global entity.  Defaults to NULL.
224cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *GlobalDirective;
225cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
226cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True if the assembler supports the .set directive.  Defaults to true.
227cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool HasSetDirective;
228cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
229cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// False if the assembler requires that we use
230cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// \code
231cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  ///   Lc = a - b
232cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  ///   .long Lc
233cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// \endcode
234cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
235cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// instead of
236cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //
237cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// \code
238cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  ///   .long a - b
239cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// \endcode
240cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  ///
241cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  ///  Defaults to true.
242cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool HasAggressiveSymbolFolding;
243cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
244cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True is .comm's and .lcomms optional alignment is to be specified in bytes
245cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// instead of log2(n).  Defaults to true.
246cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool COMMDirectiveAlignmentIsInBytes;
247cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
248cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// Describes if the .lcomm directive for the target supports an alignment
249cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// argument and how it is interpreted.  Defaults to NoAlignment.
250cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  LCOMM::LCOMMType LCOMMDirectiveAlignmentType;
251cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
252cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True if the target has .type and .size directives, this is true for most
253cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// ELF targets.  Defaults to true.
254cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool HasDotTypeDotSizeDirective;
255cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
256cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True if the target has a single parameter .file directive, this is true
257cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// for ELF targets.  Defaults to true.
258cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool HasSingleParameterDotFile;
259cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
260cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True if the target has a .ident directive, this is true for ELF targets.
261cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// Defaults to false.
262cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool HasIdentDirective;
263cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
264cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True if this target supports the MachO .no_dead_strip directive.  Defaults
265cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// to false.
266cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool HasNoDeadStrip;
267cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
268cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// This directive, if non-null, is used to declare a global as being a weak
269cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// undefined symbol.  Defaults to NULL.
270cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *WeakRefDirective;
271cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
272cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True if we have a directive to declare a global as being a weak defined
273cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// symbol.  Defaults to false.
274cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool HasWeakDefDirective;
275cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
276cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True if we have a directive to declare a global as being a weak defined
277cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// symbol that can be hidden (unexported).  Defaults to false.
278cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool HasWeakDefCanBeHiddenDirective;
279cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
280cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True if we have a .linkonce directive.  This is used on cygwin/mingw.
281cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// Defaults to false.
282cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool HasLinkOnceDirective;
283cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
284cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// This attribute, if not MCSA_Invalid, is used to declare a symbol as having
285cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// hidden visibility.  Defaults to MCSA_Hidden.
286cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  MCSymbolAttr HiddenVisibilityAttr;
287cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
288cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// This attribute, if not MCSA_Invalid, is used to declare an undefined
289cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// symbol as having hidden visibility. Defaults to MCSA_Hidden.
290cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  MCSymbolAttr HiddenDeclarationVisibilityAttr;
291cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
292cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// This attribute, if not MCSA_Invalid, is used to declare a symbol as having
293cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// protected visibility.  Defaults to MCSA_Protected
294cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  MCSymbolAttr ProtectedVisibilityAttr;
295cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
296cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //===--- Dwarf Emission Directives -----------------------------------===//
297cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
298cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True if target asm supports leb128 directives.  Defaults to false.
299cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool HasLEB128;
300cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
301cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True if target supports emission of debugging information.  Defaults to
302cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// false.
303cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool SupportsDebugInformation;
304cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
305cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// Exception handling format for the target.  Defaults to None.
306cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  ExceptionHandling ExceptionsType;
307cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
308cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// Windows exception handling data (.pdata) encoding.  Defaults to Invalid.
309cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  WinEH::EncodingType WinEHEncodingType;
310cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
311cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True if Dwarf2 output generally uses relocations for references to other
312cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// .debug_* sections.
313cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool DwarfUsesRelocationsAcrossSections;
314cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
315cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True if DWARF FDE symbol reference relocations should be replaced by an
316cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// absolute difference.
317cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool DwarfFDESymbolsUseAbsDiff;
318cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
319cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True if dwarf register numbers are printed instead of symbolic register
320cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// names in .cfi_* directives.  Defaults to false.
321cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool DwarfRegNumForCFI;
322cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
323cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True if target uses parens to indicate the symbol variant instead of @.
324cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// For example, foo(plt) instead of foo@plt.  Defaults to false.
325cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool UseParensForSymbolVariant;
326cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
327cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //===--- Prologue State ----------------------------------------------===//
328cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
329cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::vector<MCCFIInstruction> InitialFrameState;
330cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
331cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  //===--- Integrated Assembler State ----------------------------------===//
332cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
333cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// Should we use the integrated assembler?
334cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// The integrated assembler should be enabled by default (by the
335cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// constructors) when failing to parse a valid piece of assembly (inline
336cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// or otherwise) is considered a bug. It may then be overridden after
337cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// construction (see LLVMTargetMachine::initAsmInfo()).
338cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool UseIntegratedAssembler;
339cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
340cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// Compress DWARF debug sections. Defaults to false.
341cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool CompressDebugSections;
342cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
343cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinespublic:
344cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  explicit MCAsmInfo();
345cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  virtual ~MCAsmInfo();
346cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
347cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// Get the pointer size in bytes.
348cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  unsigned getPointerSize() const { return PointerSize; }
349cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
350cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// Get the callee-saved register stack slot
351cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// size in bytes.
352cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  unsigned getCalleeSaveStackSlotSize() const {
353cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return CalleeSaveStackSlotSize;
3543965b5e974d57f3e56a2c7f37d76d73e572dfb20Anton Korobeynikov  }
35582d748d55c549dd055528ed10dbb534618ca8115Chris Lattner
356cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True if the target is little endian.
357cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool isLittleEndian() const { return IsLittleEndian; }
358cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
359cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// True if target stack grow up.
360cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool isStackGrowthDirectionUp() const { return StackGrowsUp; }
361cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
362cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool hasSubsectionsViaSymbols() const { return HasSubsectionsViaSymbols; }
363cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
364cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Data directive accessors.
365cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
366cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *getData8bitsDirective() const { return Data8bitsDirective; }
367cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *getData16bitsDirective() const { return Data16bitsDirective; }
368cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *getData32bitsDirective() const { return Data32bitsDirective; }
369cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *getData64bitsDirective() const { return Data64bitsDirective; }
370cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *getGPRel64Directive() const { return GPRel64Directive; }
371cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *getGPRel32Directive() const { return GPRel32Directive; }
372cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
373cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// Targets can implement this method to specify a section to switch to if the
374cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// translation unit doesn't have any trampolines that require an executable
375cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// stack.
376cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  virtual const MCSection *getNonexecutableStackSection(MCContext &Ctx) const {
377cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return nullptr;
378a9e37c5eaf79c3a32f2921536fb7e12514e86fb2Benjamin Kramer  }
379a9e37c5eaf79c3a32f2921536fb7e12514e86fb2Benjamin Kramer
380cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  virtual const MCExpr *getExprForPersonalitySymbol(const MCSymbol *Sym,
381cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                                    unsigned Encoding,
382cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                                    MCStreamer &Streamer) const;
383cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
384cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  virtual const MCExpr *getExprForFDESymbol(const MCSymbol *Sym,
385cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                            unsigned Encoding,
386cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                            MCStreamer &Streamer) const;
387cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
388cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool usesSunStyleELFSectionSwitchSyntax() const {
389cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return SunStyleELFSectionSwitchSyntax;
390cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
39182d748d55c549dd055528ed10dbb534618ca8115Chris Lattner
392cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool usesELFSectionDirectiveForBSS() const {
393cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return UsesELFSectionDirectiveForBSS;
394cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
395cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
396cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool needsDwarfSectionOffsetDirective() const {
397cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return NeedsDwarfSectionOffsetDirective;
398cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
399cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
400cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Accessors.
401cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
402cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool hasMachoZeroFillDirective() const { return HasMachoZeroFillDirective; }
403cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool hasMachoTBSSDirective() const { return HasMachoTBSSDirective; }
404cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool hasStaticCtorDtorReferenceInStaticMode() const {
405cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return HasStaticCtorDtorReferenceInStaticMode;
406cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
407cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool getLinkerRequiresNonEmptyDwarfLines() const {
408cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return LinkerRequiresNonEmptyDwarfLines;
409cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
410cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  unsigned getMaxInstLength() const { return MaxInstLength; }
411cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  unsigned getMinInstAlignment() const { return MinInstAlignment; }
412cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool getDollarIsPC() const { return DollarIsPC; }
413cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *getSeparatorString() const { return SeparatorString; }
414cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
415cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// This indicates the column (zero-based) at which asm comments should be
416cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// printed.
417cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  unsigned getCommentColumn() const { return 40; }
418cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
419cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *getCommentString() const { return CommentString; }
420cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *getLabelSuffix() const { return LabelSuffix; }
421cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
422cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool useAssignmentForEHBegin() const { return UseAssignmentForEHBegin; }
423cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *getPrivateGlobalPrefix() const { return PrivateGlobalPrefix; }
424cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool hasLinkerPrivateGlobalPrefix() const {
425cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return LinkerPrivateGlobalPrefix[0] != '\0';
426cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
427cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *getLinkerPrivateGlobalPrefix() const {
428cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (hasLinkerPrivateGlobalPrefix())
429cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      return LinkerPrivateGlobalPrefix;
430cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return getPrivateGlobalPrefix();
431cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
432cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *getInlineAsmStart() const { return InlineAsmStart; }
433cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *getInlineAsmEnd() const { return InlineAsmEnd; }
434cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *getCode16Directive() const { return Code16Directive; }
435cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *getCode32Directive() const { return Code32Directive; }
436cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *getCode64Directive() const { return Code64Directive; }
437cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  unsigned getAssemblerDialect() const { return AssemblerDialect; }
438cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool doesAllowAtInName() const { return AllowAtInName; }
439cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool doesSupportDataRegionDirectives() const {
440cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return UseDataRegionDirectives;
441cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
442cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *getZeroDirective() const { return ZeroDirective; }
443cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *getAsciiDirective() const { return AsciiDirective; }
444cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *getAscizDirective() const { return AscizDirective; }
445cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool getAlignmentIsInBytes() const { return AlignmentIsInBytes; }
446cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  unsigned getTextAlignFillValue() const { return TextAlignFillValue; }
447cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *getGlobalDirective() const { return GlobalDirective; }
448cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool hasSetDirective() const { return HasSetDirective; }
449cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool hasAggressiveSymbolFolding() const { return HasAggressiveSymbolFolding; }
450cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool getCOMMDirectiveAlignmentIsInBytes() const {
451cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return COMMDirectiveAlignmentIsInBytes;
452cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
453cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  LCOMM::LCOMMType getLCOMMDirectiveAlignmentType() const {
454cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return LCOMMDirectiveAlignmentType;
455cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
456cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool hasDotTypeDotSizeDirective() const { return HasDotTypeDotSizeDirective; }
457cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool hasSingleParameterDotFile() const { return HasSingleParameterDotFile; }
458cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool hasIdentDirective() const { return HasIdentDirective; }
459cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool hasNoDeadStrip() const { return HasNoDeadStrip; }
460cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *getWeakRefDirective() const { return WeakRefDirective; }
461cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool hasWeakDefDirective() const { return HasWeakDefDirective; }
462cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool hasWeakDefCanBeHiddenDirective() const {
463cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return HasWeakDefCanBeHiddenDirective;
464cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
465cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool hasLinkOnceDirective() const { return HasLinkOnceDirective; }
466f10dfa910def9cdca566edbd6d2089b075a57b21Jim Grosbach
467cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  MCSymbolAttr getHiddenVisibilityAttr() const { return HiddenVisibilityAttr; }
468cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  MCSymbolAttr getHiddenDeclarationVisibilityAttr() const {
469cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return HiddenDeclarationVisibilityAttr;
470cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
471cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  MCSymbolAttr getProtectedVisibilityAttr() const {
472cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return ProtectedVisibilityAttr;
473cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
474cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool hasLEB128() const { return HasLEB128; }
475cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool doesSupportDebugInformation() const { return SupportsDebugInformation; }
476cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool doesSupportExceptionHandling() const {
477cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return ExceptionsType != ExceptionHandling::None;
478cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
479cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  ExceptionHandling getExceptionHandlingType() const { return ExceptionsType; }
480cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  WinEH::EncodingType getWinEHEncodingType() const { return WinEHEncodingType; }
481cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool isExceptionHandlingDwarf() const {
482cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return (ExceptionsType == ExceptionHandling::DwarfCFI ||
483cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            ExceptionsType == ExceptionHandling::ARM ||
484cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            // Windows handler data still uses DWARF LSDA encoding.
485cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            ExceptionsType == ExceptionHandling::WinEH);
486cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
487cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool doesDwarfUseRelocationsAcrossSections() const {
488cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return DwarfUsesRelocationsAcrossSections;
489cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
490cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool doDwarfFDESymbolsUseAbsDiff() const { return DwarfFDESymbolsUseAbsDiff; }
491cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool useDwarfRegNumForCFI() const { return DwarfRegNumForCFI; }
492cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool useParensForSymbolVariant() const { return UseParensForSymbolVariant; }
4935d4918dbd116b0b5e561c431b1ea527ee1b9302aRafael Espindola
494cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  void addInitialFrameState(const MCCFIInstruction &Inst) {
495cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    InitialFrameState.push_back(Inst);
496cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
497f10dfa910def9cdca566edbd6d2089b075a57b21Jim Grosbach
498cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const std::vector<MCCFIInstruction> &getInitialFrameState() const {
499cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return InitialFrameState;
500cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
50182d748d55c549dd055528ed10dbb534618ca8115Chris Lattner
502cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// Return true if assembly (inline or otherwise) should be parsed.
503cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool useIntegratedAssembler() const { return UseIntegratedAssembler; }
50482d748d55c549dd055528ed10dbb534618ca8115Chris Lattner
505cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// Set whether assembly (inline or otherwise) should be parsed.
506cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  virtual void setUseIntegratedAssembler(bool Value) {
507cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    UseIntegratedAssembler = Value;
508cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
509c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola
510cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool compressDebugSections() const { return CompressDebugSections; }
51182d748d55c549dd055528ed10dbb534618ca8115Chris Lattner
512cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  void setCompressDebugSections(bool CompressDebugSections) {
513cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    this->CompressDebugSections = CompressDebugSections;
514cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
515cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines};
51682d748d55c549dd055528ed10dbb534618ca8115Chris Lattner}
51782d748d55c549dd055528ed10dbb534618ca8115Chris Lattner
51882d748d55c549dd055528ed10dbb534618ca8115Chris Lattner#endif
519