MCAsmInfo.cpp revision debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2be
1af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner//===-- MCAsmInfo.cpp - Asm Info -------------------------------------------==//
2ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey//
3ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey//                     The LLVM Compiler Infrastructure
4ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey//
8ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey//===----------------------------------------------------------------------===//
9ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey//
10ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey// This file defines target asm properties related what form asm statements
11ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey// should take.
12ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey//
13ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey//===----------------------------------------------------------------------===//
14ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey
15af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner#include "llvm/MC/MCAsmInfo.h"
16debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola#include "llvm/MC/MCContext.h"
17bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola#include "llvm/MC/MCExpr.h"
18bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola#include "llvm/MC/MCStreamer.h"
191f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DataTypes.h"
20debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola#include "llvm/Support/Dwarf.h"
213bb6283eead6813e87e018879e7cedde3955ea83Dale Johannesen#include <cctype>
223bb6283eead6813e87e018879e7cedde3955ea83Dale Johannesen#include <cstring>
23ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskeyusing namespace llvm;
24ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey
258eeba35babf3114966fc4e6e8522057e46b610dbChris LattnerMCAsmInfo::MCAsmInfo() {
26f9f93e4388962b678fd59b7af5212d4cc0d38be2Chris Lattner  HasSubsectionsViaSymbols = false;
27aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner  HasMachoZeroFillDirective = false;
28c1a887d76d95100e7e05aa76e077710bc4e0b1cfEric Christopher  HasMachoTBSSDirective = false;
2971eae713153e564ec743c5c4162ff258c255de78Chris Lattner  HasStaticCtorDtorReferenceInStaticMode = false;
30767b1be3900bdc693aa0ad3e554ba034845f67f7Rafael Espindola  LinkerRequiresNonEmptyDwarfLines = false;
3132b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  MaxInstLength = 4;
3232b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  PCSymbol = "$";
33d31d304f83f9c8df6870057509414b8d004bc8daJim Grosbach  SeparatorString = ";";
3473163f875ad7e5d56aa7d0d29509eb1e04542742Daniel Dunbar  CommentColumn = 40;
3532b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  CommentString = "#";
36e07b75e069969558c3fbb2f5bfb9a652f6ea1d6bChris Lattner  LabelSuffix = ":";
3732b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  GlobalPrefix = "";
3832b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  PrivateGlobalPrefix = ".";
3990f8b7073dd472afb21bc33be0f24391e7a4505bChris Lattner  LinkerPrivateGlobalPrefix = "";
40e2b060161c92ddf60b5d020f981451e9e34a3f02Chris Lattner  InlineAsmStart = "APP";
41e2b060161c92ddf60b5d020f981451e9e34a3f02Chris Lattner  InlineAsmEnd = "NO_APP";
4232b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  AssemblerDialect = 0;
43a93ca92379129e87e0130609ac78422fcf6dd21eChris Lattner  AllowQuotesInName = false;
44c6f729ed5519cdf398ca4039dbdbea4f81433ec0Anton Korobeynikov  AllowNameToStartWithDigit = false;
45b9a01bcf486814a44098745920d43daaf9f7c260Mon P Wang  AllowPeriodsInName = true;
4632b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  ZeroDirective = "\t.zero\t";
4732b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  AsciiDirective = "\t.ascii\t";
4832b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  AscizDirective = "\t.asciz\t";
4932b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  Data8bitsDirective = "\t.byte\t";
5032b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  Data16bitsDirective = "\t.short\t";
5132b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  Data32bitsDirective = "\t.long\t";
5232b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  Data64bitsDirective = "\t.quad\t";
535277b22687d3513dd29d5a9c8510cac740f933f6Chris Lattner  SunStyleELFSectionSwitchSyntax = false;
54fdf229eda95a542fc34d5182e1a91a22789ba122Bruno Cardoso Lopes  UsesELFSectionDirectiveForBSS = false;
5532b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  AlignDirective = "\t.align\t";
5632b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  AlignmentIsInBytes = true;
5732b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  TextAlignFillValue = 0;
5878f485afb723121eedf4b6907ae6eb53da8af03cChris Lattner  GPRel32Directive = 0;
5932b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  GlobalDirective = "\t.globl\t";
60cee63322eaccc2f1067bdf5eab506e440f867da1Chris Lattner  HasSetDirective = true;
6190a5a0cd7c353651c953020b1e41b4c6e2f21883Rafael Espindola  HasAggressiveSymbolFolding = true;
629eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner  HasLCOMMDirective = false;
632e2563bf8e0f0a7f8c923000c0206855f16968b2Rafael Espindola  COMMDirectiveAlignmentIsInBytes = true;
6432b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  HasDotTypeDotSizeDirective = true;
65952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola  HasSingleParameterDotFile = true;
663a9be0ee36fe2143f514d28315f3dc1bda132b2eChris Lattner  HasNoDeadStrip = false;
67e8e98d7f2eaa0613442ce21ab6a040c0f04f5b4dKevin Enderby  HasSymbolResolver = false;
6832b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  WeakRefDirective = 0;
6932b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  WeakDefDirective = 0;
7041eb8b47717e1fe1a6d0e99ec1b4e890091f77aaChris Lattner  LinkOnceDirective = 0;
71152a29bfa6fa505182658d046bc75626e10d67c3Chris Lattner  HiddenVisibilityAttr = MCSA_Hidden;
725129bdecd87c518713765acd6998c80f9eef36a2Stuart Hastings  HiddenDeclarationVisibilityAttr = MCSA_Hidden;
73152a29bfa6fa505182658d046bc75626e10d67c3Chris Lattner  ProtectedVisibilityAttr = MCSA_Protected;
7432b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  HasLEB128 = false;
7532b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  SupportsDebugInformation = false;
761b747ad8a0694b86e8d98a8b9a05ddfe74ec0cd3Jim Grosbach  ExceptionsType = ExceptionHandling::None;
7732b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  DwarfRequiresFrameSection = true;
780f7fef3872a37d09c806f52f1d03d74ebc73c171Devang Patel  DwarfUsesInlineInfoSection = false;
79ae84d5b9bafd1ba88aa12e8398e5385f229fa306Devang Patel  DwarfUsesAbsoluteLabelForStmtList = true;
8032b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  DwarfSectionOffsetDirective = 0;
81b1fcfbe89bd155fb88485b2a3a995adba3994003Devang Patel  DwarfUsesLabelOffsetForRanges = true;
828a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner  HasMicrosoftFastStdCallMangling = false;
8318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner
8432b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  AsmTransCBE = 0;
854c7b07a66f3d5c14339a6181fa12d060aeb9b18cChris Lattner}
86f5b10ec509d7e27df12372e53adeda59051dfc30Chris Lattner
87af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris LattnerMCAsmInfo::~MCAsmInfo() {
88f5b10ec509d7e27df12372e53adeda59051dfc30Chris Lattner}
894c7b07a66f3d5c14339a6181fa12d060aeb9b18cChris Lattner
90a6199c87c293d937b1e57549864345e64e6c6e8bAnton Korobeynikov
91af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattnerunsigned MCAsmInfo::getULEB128Size(unsigned Value) {
92ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov  unsigned Size = 0;
93ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov  do {
94ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov    Value >>= 7;
95ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov    Size += sizeof(int8_t);
96ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov  } while (Value);
97ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov  return Size;
98ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov}
99ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov
100af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattnerunsigned MCAsmInfo::getSLEB128Size(int Value) {
101ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov  unsigned Size = 0;
102ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov  int Sign = Value >> (8 * sizeof(Value) - 1);
103ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov  bool IsMore;
104ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov
105ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov  do {
106ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov    unsigned Byte = Value & 0x7f;
107ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov    Value >>= 7;
108ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov    IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0;
109ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov    Size += sizeof(int8_t);
110ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov  } while (IsMore);
111ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov  return Size;
112ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov}
113bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola
114bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindolaconst MCExpr *
115bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael EspindolaMCAsmInfo::getExprForPersonalitySymbol(const MCSymbol *Sym,
116debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola                                       unsigned Encoding,
117bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola                                       MCStreamer &Streamer) const {
118debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola  return getExprForFDESymbol(Sym, Encoding, Streamer);
119a0057ca13f06b8de08483c3e3a143a7236c67097Rafael Espindola}
120a0057ca13f06b8de08483c3e3a143a7236c67097Rafael Espindola
121a0057ca13f06b8de08483c3e3a143a7236c67097Rafael Espindolaconst MCExpr *
122a0057ca13f06b8de08483c3e3a143a7236c67097Rafael EspindolaMCAsmInfo::getExprForFDESymbol(const MCSymbol *Sym,
123debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola                               unsigned Encoding,
124a0057ca13f06b8de08483c3e3a143a7236c67097Rafael Espindola                               MCStreamer &Streamer) const {
125debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola  if (!(Encoding & dwarf::DW_EH_PE_pcrel))
126debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola    return MCSymbolRefExpr::Create(Sym, Streamer.getContext());
127debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola
128debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola  MCContext &Context = Streamer.getContext();
129debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola  const MCExpr *Res = MCSymbolRefExpr::Create(Sym, Context);
130debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola  MCSymbol *PCSym = Context.CreateTempSymbol();
131debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola  Streamer.EmitLabel(PCSym);
132debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola  const MCExpr *PC = MCSymbolRefExpr::Create(PCSym, Context);
133debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola  return MCBinaryExpr::CreateSub(Res, PC, Context);
134bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola}
135