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