1198090Srdivacky//===-- MCAsmInfo.cpp - Asm Info -------------------------------------------==// 2198090Srdivacky// 3198090Srdivacky// The LLVM Compiler Infrastructure 4198090Srdivacky// 5198090Srdivacky// This file is distributed under the University of Illinois Open Source 6198090Srdivacky// License. See LICENSE.TXT for details. 7198090Srdivacky// 8198090Srdivacky//===----------------------------------------------------------------------===// 9198090Srdivacky// 10198090Srdivacky// This file defines target asm properties related what form asm statements 11198090Srdivacky// should take. 12198090Srdivacky// 13198090Srdivacky//===----------------------------------------------------------------------===// 14198090Srdivacky 15198090Srdivacky#include "llvm/MC/MCAsmInfo.h" 16221345Sdim#include "llvm/MC/MCContext.h" 17221345Sdim#include "llvm/MC/MCExpr.h" 18221345Sdim#include "llvm/MC/MCStreamer.h" 19218893Sdim#include "llvm/Support/DataTypes.h" 20221345Sdim#include "llvm/Support/Dwarf.h" 21198090Srdivacky#include <cctype> 22198090Srdivacky#include <cstring> 23198090Srdivackyusing namespace llvm; 24198090Srdivacky 25198090SrdivackyMCAsmInfo::MCAsmInfo() { 26224145Sdim PointerSize = 4; 27249423Sdim CalleeSaveStackSlotSize = 4; 28249423Sdim 29224145Sdim IsLittleEndian = true; 30224145Sdim StackGrowsUp = false; 31202878Srdivacky HasSubsectionsViaSymbols = false; 32202878Srdivacky HasMachoZeroFillDirective = false; 33208599Srdivacky HasMachoTBSSDirective = false; 34202878Srdivacky HasStaticCtorDtorReferenceInStaticMode = false; 35218893Sdim LinkerRequiresNonEmptyDwarfLines = false; 36198090Srdivacky MaxInstLength = 4; 37263508Sdim MinInstAlignment = 1; 38263508Sdim DollarIsPC = false; 39221345Sdim SeparatorString = ";"; 40203954Srdivacky CommentColumn = 40; 41198090Srdivacky CommentString = "#"; 42218893Sdim LabelSuffix = ":"; 43249423Sdim DebugLabelSuffix = ":"; 44198090Srdivacky GlobalPrefix = ""; 45198090Srdivacky PrivateGlobalPrefix = "."; 46198090Srdivacky LinkerPrivateGlobalPrefix = ""; 47198090Srdivacky InlineAsmStart = "APP"; 48198090Srdivacky InlineAsmEnd = "NO_APP"; 49226633Sdim Code16Directive = ".code16"; 50226633Sdim Code32Directive = ".code32"; 51226633Sdim Code64Directive = ".code64"; 52198090Srdivacky AssemblerDialect = 0; 53263508Sdim AllowAtInName = false; 54239462Sdim UseDataRegionDirectives = false; 55198090Srdivacky ZeroDirective = "\t.zero\t"; 56198090Srdivacky AsciiDirective = "\t.ascii\t"; 57198090Srdivacky AscizDirective = "\t.asciz\t"; 58198090Srdivacky Data8bitsDirective = "\t.byte\t"; 59198090Srdivacky Data16bitsDirective = "\t.short\t"; 60198090Srdivacky Data32bitsDirective = "\t.long\t"; 61198090Srdivacky Data64bitsDirective = "\t.quad\t"; 62198090Srdivacky SunStyleELFSectionSwitchSyntax = false; 63198090Srdivacky UsesELFSectionDirectiveForBSS = false; 64198090Srdivacky AlignDirective = "\t.align\t"; 65198090Srdivacky AlignmentIsInBytes = true; 66198090Srdivacky TextAlignFillValue = 0; 67234353Sdim GPRel64Directive = 0; 68203954Srdivacky GPRel32Directive = 0; 69198090Srdivacky GlobalDirective = "\t.globl\t"; 70203954Srdivacky HasSetDirective = true; 71218893Sdim HasAggressiveSymbolFolding = true; 72203954Srdivacky COMMDirectiveAlignmentIsInBytes = true; 73243830Sdim LCOMMDirectiveAlignmentType = LCOMM::NoAlignment; 74198090Srdivacky HasDotTypeDotSizeDirective = true; 75198090Srdivacky HasSingleParameterDotFile = true; 76263508Sdim HasIdentDirective = false; 77202878Srdivacky HasNoDeadStrip = false; 78198090Srdivacky WeakRefDirective = 0; 79266715Sdim HasWeakDefDirective = false; 80266715Sdim HasWeakDefCanBeHiddenDirective = false; 81266715Sdim HasLinkOnceDirective = false; 82202878Srdivacky HiddenVisibilityAttr = MCSA_Hidden; 83219077Sdim HiddenDeclarationVisibilityAttr = MCSA_Hidden; 84202878Srdivacky ProtectedVisibilityAttr = MCSA_Protected; 85198090Srdivacky HasLEB128 = false; 86198090Srdivacky SupportsDebugInformation = false; 87198090Srdivacky ExceptionsType = ExceptionHandling::None; 88239462Sdim DwarfUsesRelocationsAcrossSections = true; 89266715Sdim DwarfFDESymbolsUseAbsDiff = false; 90224145Sdim DwarfRegNumForCFI = false; 91205218Srdivacky HasMicrosoftFastStdCallMangling = false; 92251662Sdim NeedsDwarfSectionOffsetDirective = false; 93198090Srdivacky} 94198090Srdivacky 95198090SrdivackyMCAsmInfo::~MCAsmInfo() { 96198090Srdivacky} 97198090Srdivacky 98198090Srdivacky 99263508Sdimunsigned MCAsmInfo::getULEB128Size(uint64_t Value) { 100198090Srdivacky unsigned Size = 0; 101198090Srdivacky do { 102198090Srdivacky Value >>= 7; 103198090Srdivacky Size += sizeof(int8_t); 104198090Srdivacky } while (Value); 105198090Srdivacky return Size; 106198090Srdivacky} 107198090Srdivacky 108263508Sdimunsigned MCAsmInfo::getSLEB128Size(int64_t Value) { 109198090Srdivacky unsigned Size = 0; 110198090Srdivacky int Sign = Value >> (8 * sizeof(Value) - 1); 111198090Srdivacky bool IsMore; 112198090Srdivacky 113198090Srdivacky do { 114198090Srdivacky unsigned Byte = Value & 0x7f; 115198090Srdivacky Value >>= 7; 116198090Srdivacky IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0; 117198090Srdivacky Size += sizeof(int8_t); 118198090Srdivacky } while (IsMore); 119198090Srdivacky return Size; 120198090Srdivacky} 121221345Sdim 122221345Sdimconst MCExpr * 123221345SdimMCAsmInfo::getExprForPersonalitySymbol(const MCSymbol *Sym, 124221345Sdim unsigned Encoding, 125221345Sdim MCStreamer &Streamer) const { 126221345Sdim return getExprForFDESymbol(Sym, Encoding, Streamer); 127221345Sdim} 128221345Sdim 129221345Sdimconst MCExpr * 130221345SdimMCAsmInfo::getExprForFDESymbol(const MCSymbol *Sym, 131221345Sdim unsigned Encoding, 132221345Sdim MCStreamer &Streamer) const { 133221345Sdim if (!(Encoding & dwarf::DW_EH_PE_pcrel)) 134221345Sdim return MCSymbolRefExpr::Create(Sym, Streamer.getContext()); 135221345Sdim 136221345Sdim MCContext &Context = Streamer.getContext(); 137221345Sdim const MCExpr *Res = MCSymbolRefExpr::Create(Sym, Context); 138221345Sdim MCSymbol *PCSym = Context.CreateTempSymbol(); 139221345Sdim Streamer.EmitLabel(PCSym); 140221345Sdim const MCExpr *PC = MCSymbolRefExpr::Create(PCSym, Context); 141221345Sdim return MCBinaryExpr::CreateSub(Res, PC, Context); 142221345Sdim} 143