mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-12 14:06:36 +00:00
b4c145253b
numbers should be printed instead of symbolic register names in MCAsmStreamer::EmitRegisterName. This is necessary because some versions of GNU assembler won't accept code in which symbolic register names are used in cfi directives. There is no change in behavior unless the flag is explicitly set to true by a backend. llvm-svn: 134635
135 lines
3.9 KiB
C++
135 lines
3.9 KiB
C++
//===-- 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() {
|
|
HasSubsectionsViaSymbols = false;
|
|
HasMachoZeroFillDirective = false;
|
|
HasMachoTBSSDirective = false;
|
|
HasStaticCtorDtorReferenceInStaticMode = false;
|
|
LinkerRequiresNonEmptyDwarfLines = false;
|
|
MaxInstLength = 4;
|
|
PCSymbol = "$";
|
|
SeparatorString = ";";
|
|
CommentColumn = 40;
|
|
CommentString = "#";
|
|
LabelSuffix = ":";
|
|
GlobalPrefix = "";
|
|
PrivateGlobalPrefix = ".";
|
|
LinkerPrivateGlobalPrefix = "";
|
|
InlineAsmStart = "APP";
|
|
InlineAsmEnd = "NO_APP";
|
|
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";
|
|
SunStyleELFSectionSwitchSyntax = false;
|
|
UsesELFSectionDirectiveForBSS = false;
|
|
AlignDirective = "\t.align\t";
|
|
AlignmentIsInBytes = true;
|
|
TextAlignFillValue = 0;
|
|
GPRel32Directive = 0;
|
|
GlobalDirective = "\t.globl\t";
|
|
HasSetDirective = true;
|
|
HasAggressiveSymbolFolding = true;
|
|
HasLCOMMDirective = false;
|
|
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);
|
|
}
|