LCOV - code coverage report
Current view: top level - include/llvm/MC - MCAsmInfo.h (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 20 122 16.4 %
Date: 2018-10-20 13:21:21 Functions: 4 89 4.5 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===-- llvm/MC/MCAsmInfo.h - Asm info --------------------------*- C++ -*-===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : //
      10             : // This file contains a class to be used as the basis for target specific
      11             : // asm writers.  This class primarily takes care of global printing constants,
      12             : // which are used in very similar ways across all targets.
      13             : //
      14             : //===----------------------------------------------------------------------===//
      15             : 
      16             : #ifndef LLVM_MC_MCASMINFO_H
      17             : #define LLVM_MC_MCASMINFO_H
      18             : 
      19             : #include "llvm/ADT/StringRef.h"
      20             : #include "llvm/MC/MCDirectives.h"
      21             : #include "llvm/MC/MCDwarf.h"
      22             : #include "llvm/MC/MCTargetOptions.h"
      23             : #include <vector>
      24             : 
      25             : namespace llvm {
      26             : 
      27             : class MCContext;
      28             : class MCExpr;
      29             : class MCSection;
      30             : class MCStreamer;
      31             : class MCSymbol;
      32             : 
      33             : namespace WinEH {
      34             : 
      35             : enum class EncodingType {
      36             :   Invalid, /// Invalid
      37             :   Alpha,   /// Windows Alpha
      38             :   Alpha64, /// Windows AXP64
      39             :   ARM,     /// Windows NT (Windows on ARM)
      40             :   CE,      /// Windows CE ARM, PowerPC, SH3, SH4
      41             :   Itanium, /// Windows x64, Windows Itanium (IA-64)
      42             :   X86,     /// Windows x86, uses no CFI, just EH tables
      43             :   MIPS = Alpha,
      44             : };
      45             : 
      46             : } // end namespace WinEH
      47             : 
      48             : namespace LCOMM {
      49             : 
      50             : enum LCOMMType { NoAlignment, ByteAlignment, Log2Alignment };
      51             : 
      52             : } // end namespace LCOMM
      53             : 
      54             : /// This class is intended to be used as a base class for asm
      55             : /// properties and features specific to the target.
      56       45602 : class MCAsmInfo {
      57             : protected:
      58             :   //===------------------------------------------------------------------===//
      59             :   // Properties to be set by the target writer, used to configure asm printer.
      60             :   //
      61             : 
      62             :   /// Code pointer size in bytes.  Default is 4.
      63             :   unsigned CodePointerSize = 4;
      64             : 
      65             :   /// Size of the stack slot reserved for callee-saved registers, in bytes.
      66             :   /// Default is same as pointer size.
      67             :   unsigned CalleeSaveStackSlotSize = 4;
      68             : 
      69             :   /// True if target is little endian.  Default is true.
      70             :   bool IsLittleEndian = true;
      71             : 
      72             :   /// True if target stack grow up.  Default is false.
      73             :   bool StackGrowsUp = false;
      74             : 
      75             :   /// True if this target has the MachO .subsections_via_symbols directive.
      76             :   /// Default is false.
      77             :   bool HasSubsectionsViaSymbols = false;
      78             : 
      79             :   /// True if this is a MachO target that supports the macho-specific .zerofill
      80             :   /// directive for emitting BSS Symbols.  Default is false.
      81             :   bool HasMachoZeroFillDirective = false;
      82             : 
      83             :   /// True if this is a MachO target that supports the macho-specific .tbss
      84             :   /// directive for emitting thread local BSS Symbols.  Default is false.
      85             :   bool HasMachoTBSSDirective = false;
      86             : 
      87             :   /// True if this is a non-GNU COFF target. The COFF port of the GNU linker
      88             :   /// doesn't handle associative comdats in the way that we would like to use
      89             :   /// them.
      90             :   bool HasCOFFAssociativeComdats = false;
      91             : 
      92             :   /// True if this is a non-GNU COFF target. For GNU targets, we don't generate
      93             :   /// constants into comdat sections.
      94             :   bool HasCOFFComdatConstants = false;
      95             : 
      96             :   /// This is the maximum possible length of an instruction, which is needed to
      97             :   /// compute the size of an inline asm.  Defaults to 4.
      98             :   unsigned MaxInstLength = 4;
      99             : 
     100             :   /// Every possible instruction length is a multiple of this value.  Factored
     101             :   /// out in .debug_frame and .debug_line.  Defaults to 1.
     102             :   unsigned MinInstAlignment = 1;
     103             : 
     104             :   /// The '$' token, when not referencing an identifier or constant, refers to
     105             :   /// the current PC.  Defaults to false.
     106             :   bool DollarIsPC = false;
     107             : 
     108             :   /// This string, if specified, is used to separate instructions from each
     109             :   /// other when on the same line.  Defaults to ';'
     110             :   const char *SeparatorString;
     111             : 
     112             :   /// This indicates the comment character used by the assembler.  Defaults to
     113             :   /// "#"
     114             :   StringRef CommentString;
     115             : 
     116             :   /// This is appended to emitted labels.  Defaults to ":"
     117             :   const char *LabelSuffix;
     118             : 
     119             :   // Print the EH begin symbol with an assignment. Defaults to false.
     120             :   bool UseAssignmentForEHBegin = false;
     121             : 
     122             :   // Do we need to create a local symbol for .size?
     123             :   bool NeedsLocalForSize = false;
     124             : 
     125             :   /// This prefix is used for globals like constant pool entries that are
     126             :   /// completely private to the .s file and should not have names in the .o
     127             :   /// file.  Defaults to "L"
     128             :   StringRef PrivateGlobalPrefix;
     129             : 
     130             :   /// This prefix is used for labels for basic blocks. Defaults to the same as
     131             :   /// PrivateGlobalPrefix.
     132             :   StringRef PrivateLabelPrefix;
     133             : 
     134             :   /// This prefix is used for symbols that should be passed through the
     135             :   /// assembler but be removed by the linker.  This is 'l' on Darwin, currently
     136             :   /// used for some ObjC metadata.  The default of "" meast that for this system
     137             :   /// a plain private symbol should be used.  Defaults to "".
     138             :   StringRef LinkerPrivateGlobalPrefix;
     139             : 
     140             :   /// If these are nonempty, they contain a directive to emit before and after
     141             :   /// an inline assembly statement.  Defaults to "#APP\n", "#NO_APP\n"
     142             :   const char *InlineAsmStart;
     143             :   const char *InlineAsmEnd;
     144             : 
     145             :   /// These are assembly directives that tells the assembler to interpret the
     146             :   /// following instructions differently.  Defaults to ".code16", ".code32",
     147             :   /// ".code64".
     148             :   const char *Code16Directive;
     149             :   const char *Code32Directive;
     150             :   const char *Code64Directive;
     151             : 
     152             :   /// Which dialect of an assembler variant to use.  Defaults to 0
     153             :   unsigned AssemblerDialect = 0;
     154             : 
     155             :   /// This is true if the assembler allows @ characters in symbol names.
     156             :   /// Defaults to false.
     157             :   bool AllowAtInName = false;
     158             : 
     159             :   /// If this is true, symbol names with invalid characters will be printed in
     160             :   /// quotes.
     161             :   bool SupportsQuotedNames = true;
     162             : 
     163             :   /// This is true if data region markers should be printed as
     164             :   /// ".data_region/.end_data_region" directives. If false, use "$d/$a" labels
     165             :   /// instead.
     166             :   bool UseDataRegionDirectives = false;
     167             : 
     168             :   //===--- Data Emission Directives -------------------------------------===//
     169             : 
     170             :   /// This should be set to the directive used to get some number of zero bytes
     171             :   /// emitted to the current section.  Common cases are "\t.zero\t" and
     172             :   /// "\t.space\t".  If this is set to null, the Data*bitsDirective's will be
     173             :   /// used to emit zero bytes.  Defaults to "\t.zero\t"
     174             :   const char *ZeroDirective;
     175             : 
     176             :   /// This directive allows emission of an ascii string with the standard C
     177             :   /// escape characters embedded into it.  If a target doesn't support this, it
     178             :   /// can be set to null. Defaults to "\t.ascii\t"
     179             :   const char *AsciiDirective;
     180             : 
     181             :   /// If not null, this allows for special handling of zero terminated strings
     182             :   /// on this target.  This is commonly supported as ".asciz".  If a target
     183             :   /// doesn't support this, it can be set to null.  Defaults to "\t.asciz\t"
     184             :   const char *AscizDirective;
     185             : 
     186             :   /// These directives are used to output some unit of integer data to the
     187             :   /// current section.  If a data directive is set to null, smaller data
     188             :   /// directives will be used to emit the large sizes.  Defaults to "\t.byte\t",
     189             :   /// "\t.short\t", "\t.long\t", "\t.quad\t"
     190             :   const char *Data8bitsDirective;
     191             :   const char *Data16bitsDirective;
     192             :   const char *Data32bitsDirective;
     193             :   const char *Data64bitsDirective;
     194             : 
     195             :   /// If non-null, a directive that is used to emit a word which should be
     196             :   /// relocated as a 64-bit GP-relative offset, e.g. .gpdword on Mips.  Defaults
     197             :   /// to nullptr.
     198             :   const char *GPRel64Directive = nullptr;
     199             : 
     200             :   /// If non-null, a directive that is used to emit a word which should be
     201             :   /// relocated as a 32-bit GP-relative offset, e.g. .gpword on Mips or .gprel32
     202             :   /// on Alpha.  Defaults to nullptr.
     203             :   const char *GPRel32Directive = nullptr;
     204             : 
     205             :   /// If non-null, directives that are used to emit a word/dword which should
     206             :   /// be relocated as a 32/64-bit DTP/TP-relative offset, e.g. .dtprelword/
     207             :   /// .dtpreldword/.tprelword/.tpreldword on Mips.
     208             :   const char *DTPRel32Directive = nullptr;
     209             :   const char *DTPRel64Directive = nullptr;
     210             :   const char *TPRel32Directive = nullptr;
     211             :   const char *TPRel64Directive = nullptr;
     212             : 
     213             :   /// This is true if this target uses "Sun Style" syntax for section switching
     214             :   /// ("#alloc,#write" etc) instead of the normal ELF syntax (,"a,w") in
     215             :   /// .section directives.  Defaults to false.
     216             :   bool SunStyleELFSectionSwitchSyntax = false;
     217             : 
     218             :   /// This is true if this target uses ELF '.section' directive before the
     219             :   /// '.bss' one. It's used for PPC/Linux which doesn't support the '.bss'
     220             :   /// directive only.  Defaults to false.
     221             :   bool UsesELFSectionDirectiveForBSS = false;
     222             : 
     223             :   bool NeedsDwarfSectionOffsetDirective = false;
     224             : 
     225             :   //===--- Alignment Information ----------------------------------------===//
     226             : 
     227             :   /// If this is true (the default) then the asmprinter emits ".align N"
     228             :   /// directives, where N is the number of bytes to align to.  Otherwise, it
     229             :   /// emits ".align log2(N)", e.g. 3 to align to an 8 byte boundary.  Defaults
     230             :   /// to true.
     231             :   bool AlignmentIsInBytes = true;
     232             : 
     233             :   /// If non-zero, this is used to fill the executable space created as the
     234             :   /// result of a alignment directive.  Defaults to 0
     235             :   unsigned TextAlignFillValue = 0;
     236             : 
     237             :   //===--- Global Variable Emission Directives --------------------------===//
     238             : 
     239             :   /// This is the directive used to declare a global entity. Defaults to
     240             :   /// ".globl".
     241             :   const char *GlobalDirective;
     242             : 
     243             :   /// True if the expression
     244             :   ///   .long f - g
     245             :   /// uses a relocation but it can be suppressed by writing
     246             :   ///   a = f - g
     247             :   ///   .long a
     248             :   bool SetDirectiveSuppressesReloc = false;
     249             : 
     250             :   /// False if the assembler requires that we use
     251             :   /// \code
     252             :   ///   Lc = a - b
     253             :   ///   .long Lc
     254             :   /// \endcode
     255             :   //
     256             :   /// instead of
     257             :   //
     258             :   /// \code
     259             :   ///   .long a - b
     260             :   /// \endcode
     261             :   ///
     262             :   ///  Defaults to true.
     263             :   bool HasAggressiveSymbolFolding = true;
     264             : 
     265             :   /// True is .comm's and .lcomms optional alignment is to be specified in bytes
     266             :   /// instead of log2(n).  Defaults to true.
     267             :   bool COMMDirectiveAlignmentIsInBytes = true;
     268             : 
     269             :   /// Describes if the .lcomm directive for the target supports an alignment
     270             :   /// argument and how it is interpreted.  Defaults to NoAlignment.
     271             :   LCOMM::LCOMMType LCOMMDirectiveAlignmentType = LCOMM::NoAlignment;
     272             : 
     273             :   // True if the target allows .align directives on functions. This is true for
     274             :   // most targets, so defaults to true.
     275             :   bool HasFunctionAlignment = true;
     276             : 
     277             :   /// True if the target has .type and .size directives, this is true for most
     278             :   /// ELF targets.  Defaults to true.
     279             :   bool HasDotTypeDotSizeDirective = true;
     280             : 
     281             :   /// True if the target has a single parameter .file directive, this is true
     282             :   /// for ELF targets.  Defaults to true.
     283             :   bool HasSingleParameterDotFile = true;
     284             : 
     285             :   /// True if the target has a .ident directive, this is true for ELF targets.
     286             :   /// Defaults to false.
     287             :   bool HasIdentDirective = false;
     288             : 
     289             :   /// True if this target supports the MachO .no_dead_strip directive.  Defaults
     290             :   /// to false.
     291             :   bool HasNoDeadStrip = false;
     292             : 
     293             :   /// True if this target supports the MachO .alt_entry directive.  Defaults to
     294             :   /// false.
     295             :   bool HasAltEntry = false;
     296             : 
     297             :   /// Used to declare a global as being a weak symbol. Defaults to ".weak".
     298             :   const char *WeakDirective;
     299             : 
     300             :   /// This directive, if non-null, is used to declare a global as being a weak
     301             :   /// undefined symbol.  Defaults to nullptr.
     302             :   const char *WeakRefDirective = nullptr;
     303             : 
     304             :   /// True if we have a directive to declare a global as being a weak defined
     305             :   /// symbol.  Defaults to false.
     306             :   bool HasWeakDefDirective = false;
     307             : 
     308             :   /// True if we have a directive to declare a global as being a weak defined
     309             :   /// symbol that can be hidden (unexported).  Defaults to false.
     310             :   bool HasWeakDefCanBeHiddenDirective = false;
     311             : 
     312             :   /// True if we have a .linkonce directive.  This is used on cygwin/mingw.
     313             :   /// Defaults to false.
     314             :   bool HasLinkOnceDirective = false;
     315             : 
     316             :   /// This attribute, if not MCSA_Invalid, is used to declare a symbol as having
     317             :   /// hidden visibility.  Defaults to MCSA_Hidden.
     318             :   MCSymbolAttr HiddenVisibilityAttr = MCSA_Hidden;
     319             : 
     320             :   /// This attribute, if not MCSA_Invalid, is used to declare an undefined
     321             :   /// symbol as having hidden visibility. Defaults to MCSA_Hidden.
     322             :   MCSymbolAttr HiddenDeclarationVisibilityAttr = MCSA_Hidden;
     323             : 
     324             :   /// This attribute, if not MCSA_Invalid, is used to declare a symbol as having
     325             :   /// protected visibility.  Defaults to MCSA_Protected
     326             :   MCSymbolAttr ProtectedVisibilityAttr = MCSA_Protected;
     327             : 
     328             :   //===--- Dwarf Emission Directives -----------------------------------===//
     329             : 
     330             :   /// True if target supports emission of debugging information.  Defaults to
     331             :   /// false.
     332             :   bool SupportsDebugInformation = false;
     333             : 
     334             :   /// Exception handling format for the target.  Defaults to None.
     335             :   ExceptionHandling ExceptionsType = ExceptionHandling::None;
     336             : 
     337             :   /// Windows exception handling data (.pdata) encoding.  Defaults to Invalid.
     338             :   WinEH::EncodingType WinEHEncodingType = WinEH::EncodingType::Invalid;
     339             : 
     340             :   /// True if Dwarf2 output generally uses relocations for references to other
     341             :   /// .debug_* sections.
     342             :   bool DwarfUsesRelocationsAcrossSections = true;
     343             : 
     344             :   /// True if DWARF FDE symbol reference relocations should be replaced by an
     345             :   /// absolute difference.
     346             :   bool DwarfFDESymbolsUseAbsDiff = false;
     347             : 
     348             :   /// True if dwarf register numbers are printed instead of symbolic register
     349             :   /// names in .cfi_* directives.  Defaults to false.
     350             :   bool DwarfRegNumForCFI = false;
     351             : 
     352             :   /// True if target uses parens to indicate the symbol variant instead of @.
     353             :   /// For example, foo(plt) instead of foo@plt.  Defaults to false.
     354             :   bool UseParensForSymbolVariant = false;
     355             : 
     356             :   /// True if the target supports flags in ".loc" directive, false if only
     357             :   /// location is allowed.
     358             :   bool SupportsExtendedDwarfLocDirective = true;
     359             : 
     360             :   //===--- Prologue State ----------------------------------------------===//
     361             : 
     362             :   std::vector<MCCFIInstruction> InitialFrameState;
     363             : 
     364             :   //===--- Integrated Assembler Information ----------------------------===//
     365             : 
     366             :   /// Should we use the integrated assembler?
     367             :   /// The integrated assembler should be enabled by default (by the
     368             :   /// constructors) when failing to parse a valid piece of assembly (inline
     369             :   /// or otherwise) is considered a bug. It may then be overridden after
     370             :   /// construction (see LLVMTargetMachine::initAsmInfo()).
     371             :   bool UseIntegratedAssembler;
     372             : 
     373             :   /// Preserve Comments in assembly
     374             :   bool PreserveAsmComments;
     375             : 
     376             :   /// Compress DWARF debug sections. Defaults to no compression.
     377             :   DebugCompressionType CompressDebugSections = DebugCompressionType::None;
     378             : 
     379             :   /// True if the integrated assembler should interpret 'a >> b' constant
     380             :   /// expressions as logical rather than arithmetic.
     381             :   bool UseLogicalShr = true;
     382             : 
     383             :   // If true, emit GOTPCRELX/REX_GOTPCRELX instead of GOTPCREL, on
     384             :   // X86_64 ELF.
     385             :   bool RelaxELFRelocations = true;
     386             : 
     387             :   // If true, then the lexer and expression parser will support %neg(),
     388             :   // %hi(), and similar unary operators.
     389             :   bool HasMipsExpressions = false;
     390             : 
     391             : public:
     392             :   explicit MCAsmInfo();
     393             :   virtual ~MCAsmInfo();
     394             : 
     395             :   /// Get the code pointer size in bytes.
     396           0 :   unsigned getCodePointerSize() const { return CodePointerSize; }
     397             : 
     398             :   /// Get the callee-saved register stack slot
     399             :   /// size in bytes.
     400           0 :   unsigned getCalleeSaveStackSlotSize() const {
     401           0 :     return CalleeSaveStackSlotSize;
     402             :   }
     403             : 
     404             :   /// True if the target is little endian.
     405           0 :   bool isLittleEndian() const { return IsLittleEndian; }
     406             : 
     407             :   /// True if target stack grow up.
     408           0 :   bool isStackGrowthDirectionUp() const { return StackGrowsUp; }
     409             : 
     410           0 :   bool hasSubsectionsViaSymbols() const { return HasSubsectionsViaSymbols; }
     411             : 
     412             :   // Data directive accessors.
     413             : 
     414           0 :   const char *getData8bitsDirective() const { return Data8bitsDirective; }
     415           0 :   const char *getData16bitsDirective() const { return Data16bitsDirective; }
     416           0 :   const char *getData32bitsDirective() const { return Data32bitsDirective; }
     417           0 :   const char *getData64bitsDirective() const { return Data64bitsDirective; }
     418           0 :   const char *getGPRel64Directive() const { return GPRel64Directive; }
     419           0 :   const char *getGPRel32Directive() const { return GPRel32Directive; }
     420           0 :   const char *getDTPRel64Directive() const { return DTPRel64Directive; }
     421           0 :   const char *getDTPRel32Directive() const { return DTPRel32Directive; }
     422           0 :   const char *getTPRel64Directive() const { return TPRel64Directive; }
     423           0 :   const char *getTPRel32Directive() const { return TPRel32Directive; }
     424             : 
     425             :   /// Targets can implement this method to specify a section to switch to if the
     426             :   /// translation unit doesn't have any trampolines that require an executable
     427             :   /// stack.
     428        3910 :   virtual MCSection *getNonexecutableStackSection(MCContext &Ctx) const {
     429        3910 :     return nullptr;
     430             :   }
     431             : 
     432             :   /// True if the section is atomized using the symbols in it.
     433             :   /// This is false if the section is not atomized at all (most ELF sections) or
     434             :   /// if it is atomized based on its contents (MachO' __TEXT,__cstring for
     435             :   /// example).
     436             :   virtual bool isSectionAtomizableBySymbols(const MCSection &Section) const;
     437             : 
     438             :   virtual const MCExpr *getExprForPersonalitySymbol(const MCSymbol *Sym,
     439             :                                                     unsigned Encoding,
     440             :                                                     MCStreamer &Streamer) const;
     441             : 
     442             :   virtual const MCExpr *getExprForFDESymbol(const MCSymbol *Sym,
     443             :                                             unsigned Encoding,
     444             :                                             MCStreamer &Streamer) const;
     445             : 
     446             :   /// Return true if the identifier \p Name does not need quotes to be
     447             :   /// syntactically correct.
     448             :   virtual bool isValidUnquotedName(StringRef Name) const;
     449             : 
     450             :   /// Return true if the .section directive should be omitted when
     451             :   /// emitting \p SectionName.  For example:
     452             :   ///
     453             :   /// shouldOmitSectionDirective(".text")
     454             :   ///
     455             :   /// returns false => .section .text,#alloc,#execinstr
     456             :   /// returns true  => .text
     457             :   virtual bool shouldOmitSectionDirective(StringRef SectionName) const;
     458             : 
     459           0 :   bool usesSunStyleELFSectionSwitchSyntax() const {
     460           0 :     return SunStyleELFSectionSwitchSyntax;
     461             :   }
     462             : 
     463           0 :   bool usesELFSectionDirectiveForBSS() const {
     464           0 :     return UsesELFSectionDirectiveForBSS;
     465             :   }
     466             : 
     467           0 :   bool needsDwarfSectionOffsetDirective() const {
     468           0 :     return NeedsDwarfSectionOffsetDirective;
     469             :   }
     470             : 
     471             :   // Accessors.
     472             : 
     473           0 :   bool hasMachoZeroFillDirective() const { return HasMachoZeroFillDirective; }
     474           0 :   bool hasMachoTBSSDirective() const { return HasMachoTBSSDirective; }
     475           0 :   bool hasCOFFAssociativeComdats() const { return HasCOFFAssociativeComdats; }
     476           0 :   bool hasCOFFComdatConstants() const { return HasCOFFComdatConstants; }
     477           0 :   unsigned getMaxInstLength() const { return MaxInstLength; }
     478           0 :   unsigned getMinInstAlignment() const { return MinInstAlignment; }
     479           0 :   bool getDollarIsPC() const { return DollarIsPC; }
     480           0 :   const char *getSeparatorString() const { return SeparatorString; }
     481             : 
     482             :   /// This indicates the column (zero-based) at which asm comments should be
     483             :   /// printed.
     484           0 :   unsigned getCommentColumn() const { return 40; }
     485             : 
     486           0 :   StringRef getCommentString() const { return CommentString; }
     487           0 :   const char *getLabelSuffix() const { return LabelSuffix; }
     488             : 
     489           0 :   bool useAssignmentForEHBegin() const { return UseAssignmentForEHBegin; }
     490           0 :   bool needsLocalForSize() const { return NeedsLocalForSize; }
     491           0 :   StringRef getPrivateGlobalPrefix() const { return PrivateGlobalPrefix; }
     492           0 :   StringRef getPrivateLabelPrefix() const { return PrivateLabelPrefix; }
     493             : 
     494             :   bool hasLinkerPrivateGlobalPrefix() const {
     495          87 :     return LinkerPrivateGlobalPrefix[0] != '\0';
     496             :   }
     497             : 
     498             :   StringRef getLinkerPrivateGlobalPrefix() const {
     499          87 :     if (hasLinkerPrivateGlobalPrefix())
     500          87 :       return LinkerPrivateGlobalPrefix;
     501             :     return getPrivateGlobalPrefix();
     502             :   }
     503             : 
     504           0 :   const char *getInlineAsmStart() const { return InlineAsmStart; }
     505           0 :   const char *getInlineAsmEnd() const { return InlineAsmEnd; }
     506           0 :   const char *getCode16Directive() const { return Code16Directive; }
     507           0 :   const char *getCode32Directive() const { return Code32Directive; }
     508           0 :   const char *getCode64Directive() const { return Code64Directive; }
     509           0 :   unsigned getAssemblerDialect() const { return AssemblerDialect; }
     510           0 :   bool doesAllowAtInName() const { return AllowAtInName; }
     511           0 :   bool supportsNameQuoting() const { return SupportsQuotedNames; }
     512             : 
     513           0 :   bool doesSupportDataRegionDirectives() const {
     514           0 :     return UseDataRegionDirectives;
     515             :   }
     516             : 
     517           0 :   const char *getZeroDirective() const { return ZeroDirective; }
     518           0 :   const char *getAsciiDirective() const { return AsciiDirective; }
     519           0 :   const char *getAscizDirective() const { return AscizDirective; }
     520           0 :   bool getAlignmentIsInBytes() const { return AlignmentIsInBytes; }
     521           0 :   unsigned getTextAlignFillValue() const { return TextAlignFillValue; }
     522           0 :   const char *getGlobalDirective() const { return GlobalDirective; }
     523             : 
     524           0 :   bool doesSetDirectiveSuppressReloc() const {
     525           0 :     return SetDirectiveSuppressesReloc;
     526             :   }
     527             : 
     528           0 :   bool hasAggressiveSymbolFolding() const { return HasAggressiveSymbolFolding; }
     529             : 
     530           0 :   bool getCOMMDirectiveAlignmentIsInBytes() const {
     531           0 :     return COMMDirectiveAlignmentIsInBytes;
     532             :   }
     533             : 
     534           0 :   LCOMM::LCOMMType getLCOMMDirectiveAlignmentType() const {
     535           0 :     return LCOMMDirectiveAlignmentType;
     536             :   }
     537             : 
     538           0 :   bool hasFunctionAlignment() const { return HasFunctionAlignment; }
     539           0 :   bool hasDotTypeDotSizeDirective() const { return HasDotTypeDotSizeDirective; }
     540           0 :   bool hasSingleParameterDotFile() const { return HasSingleParameterDotFile; }
     541           0 :   bool hasIdentDirective() const { return HasIdentDirective; }
     542           0 :   bool hasNoDeadStrip() const { return HasNoDeadStrip; }
     543           0 :   bool hasAltEntry() const { return HasAltEntry; }
     544           0 :   const char *getWeakDirective() const { return WeakDirective; }
     545           0 :   const char *getWeakRefDirective() const { return WeakRefDirective; }
     546           0 :   bool hasWeakDefDirective() const { return HasWeakDefDirective; }
     547             : 
     548           0 :   bool hasWeakDefCanBeHiddenDirective() const {
     549           0 :     return HasWeakDefCanBeHiddenDirective;
     550             :   }
     551             : 
     552           0 :   bool hasLinkOnceDirective() const { return HasLinkOnceDirective; }
     553             : 
     554           0 :   MCSymbolAttr getHiddenVisibilityAttr() const { return HiddenVisibilityAttr; }
     555             : 
     556           0 :   MCSymbolAttr getHiddenDeclarationVisibilityAttr() const {
     557           0 :     return HiddenDeclarationVisibilityAttr;
     558             :   }
     559             : 
     560           0 :   MCSymbolAttr getProtectedVisibilityAttr() const {
     561           0 :     return ProtectedVisibilityAttr;
     562             :   }
     563             : 
     564           0 :   bool doesSupportDebugInformation() const { return SupportsDebugInformation; }
     565             : 
     566           0 :   bool doesSupportExceptionHandling() const {
     567           0 :     return ExceptionsType != ExceptionHandling::None;
     568             :   }
     569             : 
     570           0 :   ExceptionHandling getExceptionHandlingType() const { return ExceptionsType; }
     571           0 :   WinEH::EncodingType getWinEHEncodingType() const { return WinEHEncodingType; }
     572             : 
     573           0 :   void setExceptionsType(ExceptionHandling EH) {
     574          83 :     ExceptionsType = EH;
     575           0 :   }
     576             : 
     577             :   /// Returns true if the exception handling method for the platform uses call
     578             :   /// frame information to unwind.
     579             :   bool usesCFIForEH() const {
     580      550215 :     return (ExceptionsType == ExceptionHandling::DwarfCFI ||
     581      550215 :             ExceptionsType == ExceptionHandling::ARM || usesWindowsCFI());
     582             :   }
     583             : 
     584           0 :   bool usesWindowsCFI() const {
     585    18056178 :     return ExceptionsType == ExceptionHandling::WinEH &&
     586       22306 :            (WinEHEncodingType != WinEH::EncodingType::Invalid &&
     587           0 :             WinEHEncodingType != WinEH::EncodingType::X86);
     588             :   }
     589             : 
     590           0 :   bool doesDwarfUseRelocationsAcrossSections() const {
     591           0 :     return DwarfUsesRelocationsAcrossSections;
     592             :   }
     593             : 
     594           0 :   bool doDwarfFDESymbolsUseAbsDiff() const { return DwarfFDESymbolsUseAbsDiff; }
     595           0 :   bool useDwarfRegNumForCFI() const { return DwarfRegNumForCFI; }
     596           0 :   bool useParensForSymbolVariant() const { return UseParensForSymbolVariant; }
     597           0 :   bool supportsExtendedDwarfLocDirective() const {
     598           0 :     return SupportsExtendedDwarfLocDirective;
     599             :   }
     600             : 
     601             :   void addInitialFrameState(const MCCFIInstruction &Inst) {
     602       75858 :     InitialFrameState.push_back(Inst);
     603             :   }
     604             : 
     605             :   const std::vector<MCCFIInstruction> &getInitialFrameState() const {
     606             :     return InitialFrameState;
     607             :   }
     608             : 
     609             :   /// Return true if assembly (inline or otherwise) should be parsed.
     610           0 :   bool useIntegratedAssembler() const { return UseIntegratedAssembler; }
     611             : 
     612             :   /// Set whether assembly (inline or otherwise) should be parsed.
     613         171 :   virtual void setUseIntegratedAssembler(bool Value) {
     614         171 :     UseIntegratedAssembler = Value;
     615         171 :   }
     616             : 
     617             :   /// Return true if assembly (inline or otherwise) should be parsed.
     618           0 :   bool preserveAsmComments() const { return PreserveAsmComments; }
     619             : 
     620             :   /// Set whether assembly (inline or otherwise) should be parsed.
     621       49061 :   virtual void setPreserveAsmComments(bool Value) {
     622       49061 :     PreserveAsmComments = Value;
     623       49061 :   }
     624             : 
     625           0 :   DebugCompressionType compressDebugSections() const {
     626           0 :     return CompressDebugSections;
     627             :   }
     628             : 
     629           0 :   void setCompressDebugSections(DebugCompressionType CompressDebugSections) {
     630       40988 :     this->CompressDebugSections = CompressDebugSections;
     631           0 :   }
     632             : 
     633           0 :   bool shouldUseLogicalShr() const { return UseLogicalShr; }
     634             : 
     635           0 :   bool canRelaxRelocations() const { return RelaxELFRelocations; }
     636       49075 :   void setRelaxELFRelocations(bool V) { RelaxELFRelocations = V; }
     637           0 :   bool hasMipsExpressions() const { return HasMipsExpressions; }
     638             : };
     639             : 
     640             : } // end namespace llvm
     641             : 
     642             : #endif // LLVM_MC_MCASMINFO_H

Generated by: LCOV version 1.13