MCAsmInfo.cpp revision 221345
12116Sjkh//===-- MCAsmInfo.cpp - Asm Info -------------------------------------------==// 22116Sjkh// 32116Sjkh// The LLVM Compiler Infrastructure 42116Sjkh// 52116Sjkh// This file is distributed under the University of Illinois Open Source 62116Sjkh// License. See LICENSE.TXT for details. 72116Sjkh// 82116Sjkh//===----------------------------------------------------------------------===// 92116Sjkh// 102116Sjkh// This file defines target asm properties related what form asm statements 118870Srgrimes// should take. 122116Sjkh// 132116Sjkh//===----------------------------------------------------------------------===// 142116Sjkh 152116Sjkh#include "llvm/MC/MCAsmInfo.h" 162116Sjkh#include "llvm/MC/MCContext.h" 178870Srgrimes#include "llvm/MC/MCExpr.h" 182116Sjkh#include "llvm/MC/MCStreamer.h" 192116Sjkh#include "llvm/Support/DataTypes.h" 202116Sjkh#include "llvm/Support/Dwarf.h" 212116Sjkh#include <cctype> 222116Sjkh#include <cstring> 232116Sjkhusing namespace llvm; 242116Sjkh 252116SjkhMCAsmInfo::MCAsmInfo() { 262116Sjkh HasSubsectionsViaSymbols = false; 272116Sjkh HasMachoZeroFillDirective = false; 282116Sjkh HasMachoTBSSDirective = false; 292116Sjkh HasStaticCtorDtorReferenceInStaticMode = false; 302116Sjkh LinkerRequiresNonEmptyDwarfLines = false; 312116Sjkh MaxInstLength = 4; 322116Sjkh PCSymbol = "$"; 332116Sjkh SeparatorString = ";"; 342116Sjkh CommentColumn = 40; 352116Sjkh CommentString = "#"; 362116Sjkh LabelSuffix = ":"; 372116Sjkh GlobalPrefix = ""; 382116Sjkh PrivateGlobalPrefix = "."; 392116Sjkh LinkerPrivateGlobalPrefix = ""; 402116Sjkh InlineAsmStart = "APP"; 412116Sjkh InlineAsmEnd = "NO_APP"; 422116Sjkh AssemblerDialect = 0; 432116Sjkh AllowQuotesInName = false; 442116Sjkh AllowNameToStartWithDigit = false; 452116Sjkh AllowPeriodsInName = true; 462116Sjkh ZeroDirective = "\t.zero\t"; 472116Sjkh AsciiDirective = "\t.ascii\t"; 482116Sjkh AscizDirective = "\t.asciz\t"; 492116Sjkh Data8bitsDirective = "\t.byte\t"; 502116Sjkh Data16bitsDirective = "\t.short\t"; 512116Sjkh Data32bitsDirective = "\t.long\t"; 522116Sjkh Data64bitsDirective = "\t.quad\t"; 532116Sjkh SunStyleELFSectionSwitchSyntax = false; 542116Sjkh UsesELFSectionDirectiveForBSS = false; 552116Sjkh AlignDirective = "\t.align\t"; 568870Srgrimes AlignmentIsInBytes = true; 572116Sjkh TextAlignFillValue = 0; 582116Sjkh GPRel32Directive = 0; 592116Sjkh GlobalDirective = "\t.globl\t"; 602116Sjkh HasSetDirective = true; 612116Sjkh HasAggressiveSymbolFolding = true; 622116Sjkh HasLCOMMDirective = false; 632116Sjkh COMMDirectiveAlignmentIsInBytes = true; 642116Sjkh HasDotTypeDotSizeDirective = true; 652116Sjkh HasSingleParameterDotFile = true; 662116Sjkh HasNoDeadStrip = false; 678870Srgrimes HasSymbolResolver = false; 682116Sjkh WeakRefDirective = 0; 692116Sjkh WeakDefDirective = 0; 702116Sjkh LinkOnceDirective = 0; 712116Sjkh HiddenVisibilityAttr = MCSA_Hidden; 722116Sjkh HiddenDeclarationVisibilityAttr = MCSA_Hidden; 732116Sjkh ProtectedVisibilityAttr = MCSA_Protected; 742116Sjkh HasLEB128 = false; 752116Sjkh SupportsDebugInformation = false; 762116Sjkh ExceptionsType = ExceptionHandling::None; 772116Sjkh DwarfRequiresFrameSection = true; 788870Srgrimes DwarfUsesInlineInfoSection = false; 792116Sjkh DwarfUsesAbsoluteLabelForStmtList = true; 802116Sjkh DwarfSectionOffsetDirective = 0; 812116Sjkh DwarfUsesLabelOffsetForRanges = true; 822116Sjkh HasMicrosoftFastStdCallMangling = false; 832116Sjkh 842116Sjkh AsmTransCBE = 0; 852116Sjkh} 862116Sjkh 872116SjkhMCAsmInfo::~MCAsmInfo() { 882116Sjkh} 892116Sjkh 902116Sjkh 912116Sjkhunsigned MCAsmInfo::getULEB128Size(unsigned Value) { 922116Sjkh unsigned Size = 0; 938870Srgrimes do { 942116Sjkh Value >>= 7; 952116Sjkh Size += sizeof(int8_t); 962116Sjkh } while (Value); 978870Srgrimes return Size; 982116Sjkh} 992116Sjkh 1008870Srgrimesunsigned MCAsmInfo::getSLEB128Size(int Value) { 1012116Sjkh unsigned Size = 0; 1022116Sjkh int Sign = Value >> (8 * sizeof(Value) - 1); 1032116Sjkh bool IsMore; 1042116Sjkh 1052116Sjkh do { 1062116Sjkh unsigned Byte = Value & 0x7f; 1072116Sjkh Value >>= 7; 1082116Sjkh IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0; 1092116Sjkh Size += sizeof(int8_t); 1102116Sjkh } while (IsMore); 1112116Sjkh return Size; 1122116Sjkh} 1132116Sjkh 1142116Sjkhconst MCExpr * 1152116SjkhMCAsmInfo::getExprForPersonalitySymbol(const MCSymbol *Sym, 1168870Srgrimes unsigned Encoding, 1178870Srgrimes MCStreamer &Streamer) const { 1188870Srgrimes return getExprForFDESymbol(Sym, Encoding, Streamer); 1192116Sjkh} 1202116Sjkh 1212116Sjkhconst MCExpr * 1222116SjkhMCAsmInfo::getExprForFDESymbol(const MCSymbol *Sym, 1232116Sjkh unsigned Encoding, 1242116Sjkh MCStreamer &Streamer) const { 1252116Sjkh if (!(Encoding & dwarf::DW_EH_PE_pcrel)) 1262116Sjkh return MCSymbolRefExpr::Create(Sym, Streamer.getContext()); 1272116Sjkh 1282116Sjkh MCContext &Context = Streamer.getContext(); 1292116Sjkh const MCExpr *Res = MCSymbolRefExpr::Create(Sym, Context); 1302116Sjkh MCSymbol *PCSym = Context.CreateTempSymbol(); 1312116Sjkh Streamer.EmitLabel(PCSym); 1322116Sjkh const MCExpr *PC = MCSymbolRefExpr::Create(PCSym, Context); 1332116Sjkh return MCBinaryExpr::CreateSub(Res, PC, Context); 1342116Sjkh} 1352116Sjkh