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