|  | //===-- MCAsmInfo.cpp - Asm Info -------------------------------------------==// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file defines target asm properties related what form asm statements | 
|  | // should take. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "llvm/MC/MCAsmInfo.h" | 
|  | #include "llvm/MC/MCContext.h" | 
|  | #include "llvm/MC/MCExpr.h" | 
|  | #include "llvm/MC/MCStreamer.h" | 
|  | #include "llvm/Support/DataTypes.h" | 
|  | #include "llvm/Support/Dwarf.h" | 
|  | #include <cctype> | 
|  | #include <cstring> | 
|  | using namespace llvm; | 
|  |  | 
|  | MCAsmInfo::MCAsmInfo() { | 
|  | PointerSize = 4; | 
|  | IsLittleEndian = true; | 
|  | StackGrowsUp = false; | 
|  | HasSubsectionsViaSymbols = false; | 
|  | HasMachoZeroFillDirective = false; | 
|  | HasMachoTBSSDirective = false; | 
|  | StructorOutputOrder = Structors::ReversePriorityOrder; | 
|  | HasStaticCtorDtorReferenceInStaticMode = false; | 
|  | LinkerRequiresNonEmptyDwarfLines = false; | 
|  | MaxInstLength = 4; | 
|  | PCSymbol = "$"; | 
|  | SeparatorString = ";"; | 
|  | CommentColumn = 40; | 
|  | CommentString = "#"; | 
|  | LabelSuffix = ":"; | 
|  | GlobalPrefix = ""; | 
|  | PrivateGlobalPrefix = "."; | 
|  | LinkerPrivateGlobalPrefix = ""; | 
|  | InlineAsmStart = "APP"; | 
|  | InlineAsmEnd = "NO_APP"; | 
|  | Code16Directive = ".code16"; | 
|  | Code32Directive = ".code32"; | 
|  | Code64Directive = ".code64"; | 
|  | AssemblerDialect = 0; | 
|  | AllowQuotesInName = false; | 
|  | AllowNameToStartWithDigit = false; | 
|  | AllowPeriodsInName = true; | 
|  | ZeroDirective = "\t.zero\t"; | 
|  | AsciiDirective = "\t.ascii\t"; | 
|  | AscizDirective = "\t.asciz\t"; | 
|  | Data8bitsDirective = "\t.byte\t"; | 
|  | Data16bitsDirective = "\t.short\t"; | 
|  | Data32bitsDirective = "\t.long\t"; | 
|  | Data64bitsDirective = "\t.quad\t"; | 
|  | DataBegin = "$d."; | 
|  | CodeBegin = "$a."; | 
|  | JT8Begin = "$d."; | 
|  | JT16Begin = "$d."; | 
|  | JT32Begin = "$d."; | 
|  | SupportsDataRegions = false; | 
|  | SunStyleELFSectionSwitchSyntax = false; | 
|  | UsesELFSectionDirectiveForBSS = false; | 
|  | AlignDirective = "\t.align\t"; | 
|  | AlignmentIsInBytes = true; | 
|  | TextAlignFillValue = 0; | 
|  | GPRel32Directive = 0; | 
|  | GlobalDirective = "\t.globl\t"; | 
|  | HasSetDirective = true; | 
|  | HasAggressiveSymbolFolding = true; | 
|  | LCOMMDirectiveType = LCOMM::None; | 
|  | COMMDirectiveAlignmentIsInBytes = true; | 
|  | HasDotTypeDotSizeDirective = true; | 
|  | HasSingleParameterDotFile = true; | 
|  | HasNoDeadStrip = false; | 
|  | HasSymbolResolver = false; | 
|  | WeakRefDirective = 0; | 
|  | WeakDefDirective = 0; | 
|  | LinkOnceDirective = 0; | 
|  | HiddenVisibilityAttr = MCSA_Hidden; | 
|  | HiddenDeclarationVisibilityAttr = MCSA_Hidden; | 
|  | ProtectedVisibilityAttr = MCSA_Protected; | 
|  | HasLEB128 = false; | 
|  | SupportsDebugInformation = false; | 
|  | ExceptionsType = ExceptionHandling::None; | 
|  | DwarfUsesInlineInfoSection = false; | 
|  | DwarfRequiresRelocationForSectionOffset = true; | 
|  | DwarfSectionOffsetDirective = 0; | 
|  | DwarfUsesLabelOffsetForRanges = true; | 
|  | DwarfRegNumForCFI = false; | 
|  | HasMicrosoftFastStdCallMangling = false; | 
|  |  | 
|  | AsmTransCBE = 0; | 
|  | } | 
|  |  | 
|  | MCAsmInfo::~MCAsmInfo() { | 
|  | } | 
|  |  | 
|  |  | 
|  | unsigned MCAsmInfo::getULEB128Size(unsigned Value) { | 
|  | unsigned Size = 0; | 
|  | do { | 
|  | Value >>= 7; | 
|  | Size += sizeof(int8_t); | 
|  | } while (Value); | 
|  | return Size; | 
|  | } | 
|  |  | 
|  | unsigned MCAsmInfo::getSLEB128Size(int Value) { | 
|  | unsigned Size = 0; | 
|  | int Sign = Value >> (8 * sizeof(Value) - 1); | 
|  | bool IsMore; | 
|  |  | 
|  | do { | 
|  | unsigned Byte = Value & 0x7f; | 
|  | Value >>= 7; | 
|  | IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0; | 
|  | Size += sizeof(int8_t); | 
|  | } while (IsMore); | 
|  | return Size; | 
|  | } | 
|  |  | 
|  | const MCExpr * | 
|  | MCAsmInfo::getExprForPersonalitySymbol(const MCSymbol *Sym, | 
|  | unsigned Encoding, | 
|  | MCStreamer &Streamer) const { | 
|  | return getExprForFDESymbol(Sym, Encoding, Streamer); | 
|  | } | 
|  |  | 
|  | const MCExpr * | 
|  | MCAsmInfo::getExprForFDESymbol(const MCSymbol *Sym, | 
|  | unsigned Encoding, | 
|  | MCStreamer &Streamer) const { | 
|  | if (!(Encoding & dwarf::DW_EH_PE_pcrel)) | 
|  | return MCSymbolRefExpr::Create(Sym, Streamer.getContext()); | 
|  |  | 
|  | MCContext &Context = Streamer.getContext(); | 
|  | const MCExpr *Res = MCSymbolRefExpr::Create(Sym, Context); | 
|  | MCSymbol *PCSym = Context.CreateTempSymbol(); | 
|  | Streamer.EmitLabel(PCSym); | 
|  | const MCExpr *PC = MCSymbolRefExpr::Create(PCSym, Context); | 
|  | return MCBinaryExpr::CreateSub(Res, PC, Context); | 
|  | } |