MCAsmInfo.cpp revision dce4a407a24b04eebc6a376f8e62b41aaa7b071f
1//===-- MCAsmInfo.cpp - Asm Info -------------------------------------------==// 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 defines target asm properties related what form asm statements 11// should take. 12// 13//===----------------------------------------------------------------------===// 14 15#include "llvm/MC/MCAsmInfo.h" 16#include "llvm/MC/MCContext.h" 17#include "llvm/MC/MCExpr.h" 18#include "llvm/MC/MCStreamer.h" 19#include "llvm/Support/DataTypes.h" 20#include "llvm/Support/Dwarf.h" 21#include <cctype> 22#include <cstring> 23using namespace llvm; 24 25MCAsmInfo::MCAsmInfo() { 26 PointerSize = 4; 27 CalleeSaveStackSlotSize = 4; 28 29 IsLittleEndian = true; 30 StackGrowsUp = false; 31 HasSubsectionsViaSymbols = false; 32 HasMachoZeroFillDirective = false; 33 HasMachoTBSSDirective = false; 34 HasStaticCtorDtorReferenceInStaticMode = false; 35 LinkerRequiresNonEmptyDwarfLines = false; 36 MaxInstLength = 4; 37 MinInstAlignment = 1; 38 DollarIsPC = false; 39 SeparatorString = ";"; 40 CommentString = "#"; 41 LabelSuffix = ":"; 42 DebugLabelSuffix = ":"; 43 PrivateGlobalPrefix = "L"; 44 LinkerPrivateGlobalPrefix = ""; 45 InlineAsmStart = "APP"; 46 InlineAsmEnd = "NO_APP"; 47 Code16Directive = ".code16"; 48 Code32Directive = ".code32"; 49 Code64Directive = ".code64"; 50 AssemblerDialect = 0; 51 AllowAtInName = false; 52 UseDataRegionDirectives = false; 53 ZeroDirective = "\t.zero\t"; 54 AsciiDirective = "\t.ascii\t"; 55 AscizDirective = "\t.asciz\t"; 56 Data8bitsDirective = "\t.byte\t"; 57 Data16bitsDirective = "\t.short\t"; 58 Data32bitsDirective = "\t.long\t"; 59 Data64bitsDirective = "\t.quad\t"; 60 SunStyleELFSectionSwitchSyntax = false; 61 UsesELFSectionDirectiveForBSS = false; 62 AlignmentIsInBytes = true; 63 TextAlignFillValue = 0; 64 GPRel64Directive = nullptr; 65 GPRel32Directive = nullptr; 66 GlobalDirective = "\t.globl\t"; 67 HasSetDirective = true; 68 HasAggressiveSymbolFolding = true; 69 COMMDirectiveAlignmentIsInBytes = true; 70 LCOMMDirectiveAlignmentType = LCOMM::NoAlignment; 71 HasDotTypeDotSizeDirective = true; 72 HasSingleParameterDotFile = true; 73 HasIdentDirective = false; 74 HasNoDeadStrip = false; 75 WeakRefDirective = nullptr; 76 HasWeakDefDirective = false; 77 HasWeakDefCanBeHiddenDirective = false; 78 HasLinkOnceDirective = false; 79 HiddenVisibilityAttr = MCSA_Hidden; 80 HiddenDeclarationVisibilityAttr = MCSA_Hidden; 81 ProtectedVisibilityAttr = MCSA_Protected; 82 HasLEB128 = false; 83 SupportsDebugInformation = false; 84 ExceptionsType = ExceptionHandling::None; 85 DwarfUsesRelocationsAcrossSections = true; 86 DwarfFDESymbolsUseAbsDiff = false; 87 DwarfRegNumForCFI = false; 88 NeedsDwarfSectionOffsetDirective = false; 89 UseParensForSymbolVariant = false; 90 91 // FIXME: Clang's logic should be synced with the logic used to initialize 92 // this member and the two implementations should be merged. 93 // For reference: 94 // - Solaris always enables the integrated assembler by default 95 // - SparcELFMCAsmInfo and X86ELFMCAsmInfo are handling this case 96 // - Windows always enables the integrated assembler by default 97 // - MCAsmInfoCOFF is handling this case, should it be MCAsmInfoMicrosoft? 98 // - MachO targets always enables the integrated assembler by default 99 // - MCAsmInfoDarwin is handling this case 100 // - Generic_GCC toolchains enable the integrated assembler on a per 101 // architecture basis. 102 // - The target subclasses for AArch64, ARM, and X86 handle these cases 103 UseIntegratedAssembler = false; 104 105 CompressDebugSections = false; 106} 107 108MCAsmInfo::~MCAsmInfo() { 109} 110 111const MCExpr * 112MCAsmInfo::getExprForPersonalitySymbol(const MCSymbol *Sym, 113 unsigned Encoding, 114 MCStreamer &Streamer) const { 115 return getExprForFDESymbol(Sym, Encoding, Streamer); 116} 117 118const MCExpr * 119MCAsmInfo::getExprForFDESymbol(const MCSymbol *Sym, 120 unsigned Encoding, 121 MCStreamer &Streamer) const { 122 if (!(Encoding & dwarf::DW_EH_PE_pcrel)) 123 return MCSymbolRefExpr::Create(Sym, Streamer.getContext()); 124 125 MCContext &Context = Streamer.getContext(); 126 const MCExpr *Res = MCSymbolRefExpr::Create(Sym, Context); 127 MCSymbol *PCSym = Context.CreateTempSymbol(); 128 Streamer.EmitLabel(PCSym); 129 const MCExpr *PC = MCSymbolRefExpr::Create(PCSym, Context); 130 return MCBinaryExpr::CreateSub(Res, PC, Context); 131} 132