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