2017-02-11 01:27:28 +01:00
|
|
|
//===- MCAsmInfo.cpp - Asm Info -------------------------------------------===//
|
2006-09-06 20:35:33 +02:00
|
|
|
//
|
2019-01-19 09:50:56 +01:00
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2006-09-06 20:35:33 +02:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// This file defines target asm properties related what form asm statements
|
|
|
|
// should take.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2009-08-22 22:48:53 +02:00
|
|
|
#include "llvm/MC/MCAsmInfo.h"
|
2017-06-07 05:48:56 +02:00
|
|
|
#include "llvm/BinaryFormat/Dwarf.h"
|
2011-05-01 05:50:49 +02:00
|
|
|
#include "llvm/MC/MCContext.h"
|
2011-04-28 18:09:09 +02:00
|
|
|
#include "llvm/MC/MCExpr.h"
|
|
|
|
#include "llvm/MC/MCStreamer.h"
|
2018-04-03 19:28:55 +02:00
|
|
|
#include "llvm/Support/CommandLine.h"
|
2017-02-11 01:27:28 +01:00
|
|
|
|
2006-09-06 20:35:33 +02:00
|
|
|
using namespace llvm;
|
|
|
|
|
2021-05-07 20:15:43 +02:00
|
|
|
namespace {
|
2018-04-03 19:28:55 +02:00
|
|
|
enum DefaultOnOff { Default, Enable, Disable };
|
2021-05-07 20:15:43 +02:00
|
|
|
}
|
2018-04-03 19:28:55 +02:00
|
|
|
static cl::opt<DefaultOnOff> DwarfExtendedLoc(
|
|
|
|
"dwarf-extended-loc", cl::Hidden,
|
|
|
|
cl::desc("Disable emission of the extended flags in .loc directives."),
|
|
|
|
cl::values(clEnumVal(Default, "Default for platform"),
|
|
|
|
clEnumVal(Enable, "Enabled"), clEnumVal(Disable, "Disabled")),
|
|
|
|
cl::init(Default));
|
|
|
|
|
2021-05-07 20:15:43 +02:00
|
|
|
namespace llvm {
|
2020-12-02 19:46:58 +01:00
|
|
|
cl::opt<cl::boolOrDefault> UseLEB128Directives(
|
|
|
|
"use-leb128-directives", cl::Hidden,
|
|
|
|
cl::desc(
|
|
|
|
"Disable the usage of LEB128 directives, and generate .byte instead."),
|
|
|
|
cl::init(cl::BOU_UNSET));
|
2021-05-07 20:15:43 +02:00
|
|
|
}
|
2020-12-02 19:46:58 +01:00
|
|
|
|
2010-01-20 07:34:14 +01:00
|
|
|
MCAsmInfo::MCAsmInfo() {
|
2011-03-24 19:46:34 +01:00
|
|
|
SeparatorString = ";";
|
2008-09-25 23:00:33 +02:00
|
|
|
CommentString = "#";
|
2010-09-23 00:19:53 +02:00
|
|
|
LabelSuffix = ":";
|
2013-12-03 00:39:26 +01:00
|
|
|
PrivateGlobalPrefix = "L";
|
2014-12-04 01:06:57 +01:00
|
|
|
PrivateLabelPrefix = PrivateGlobalPrefix;
|
2014-03-29 08:05:06 +01:00
|
|
|
LinkerPrivateGlobalPrefix = "";
|
2009-08-12 00:39:40 +02:00
|
|
|
InlineAsmStart = "APP";
|
|
|
|
InlineAsmEnd = "NO_APP";
|
2011-07-27 02:38:12 +02:00
|
|
|
Code16Directive = ".code16";
|
|
|
|
Code32Directive = ".code32";
|
|
|
|
Code64Directive = ".code64";
|
2008-09-25 23:00:33 +02:00
|
|
|
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";
|
|
|
|
GlobalDirective = "\t.globl\t";
|
2014-12-01 22:16:17 +01:00
|
|
|
WeakDirective = "\t.weak\t";
|
2018-04-03 19:28:55 +02:00
|
|
|
if (DwarfExtendedLoc != Default)
|
|
|
|
SupportsExtendedDwarfLocDirective = DwarfExtendedLoc == Enable;
|
2020-12-02 19:46:58 +01:00
|
|
|
if (UseLEB128Directives != cl::BOU_UNSET)
|
|
|
|
HasLEB128Directives = UseLEB128Directives == cl::BOU_TRUE;
|
2014-02-13 15:44:26 +01:00
|
|
|
|
|
|
|
// FIXME: Clang's logic should be synced with the logic used to initialize
|
|
|
|
// this member and the two implementations should be merged.
|
|
|
|
// For reference:
|
|
|
|
// - Solaris always enables the integrated assembler by default
|
|
|
|
// - SparcELFMCAsmInfo and X86ELFMCAsmInfo are handling this case
|
|
|
|
// - Windows always enables the integrated assembler by default
|
|
|
|
// - MCAsmInfoCOFF is handling this case, should it be MCAsmInfoMicrosoft?
|
|
|
|
// - MachO targets always enables the integrated assembler by default
|
|
|
|
// - MCAsmInfoDarwin is handling this case
|
|
|
|
// - Generic_GCC toolchains enable the integrated assembler on a per
|
|
|
|
// architecture basis.
|
2014-06-11 06:19:25 +02:00
|
|
|
// - The target subclasses for AArch64, ARM, and X86 handle these cases
|
2020-04-11 19:06:18 +02:00
|
|
|
UseIntegratedAssembler = true;
|
2016-07-11 14:42:14 +02:00
|
|
|
PreserveAsmComments = true;
|
2006-10-13 19:50:07 +02:00
|
|
|
}
|
2006-10-05 02:35:16 +02:00
|
|
|
|
2017-02-11 01:27:28 +01:00
|
|
|
MCAsmInfo::~MCAsmInfo() = default;
|
2006-10-13 19:50:07 +02:00
|
|
|
|
2019-04-12 08:57:45 +02:00
|
|
|
void MCAsmInfo::addInitialFrameState(const MCCFIInstruction &Inst) {
|
|
|
|
InitialFrameState.push_back(Inst);
|
|
|
|
}
|
|
|
|
|
2015-01-09 19:55:42 +01:00
|
|
|
bool MCAsmInfo::isSectionAtomizableBySymbols(const MCSection &Section) const {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2011-04-28 18:09:09 +02:00
|
|
|
const MCExpr *
|
|
|
|
MCAsmInfo::getExprForPersonalitySymbol(const MCSymbol *Sym,
|
2011-05-01 05:50:49 +02:00
|
|
|
unsigned Encoding,
|
2011-04-28 18:09:09 +02:00
|
|
|
MCStreamer &Streamer) const {
|
2011-05-01 05:50:49 +02:00
|
|
|
return getExprForFDESymbol(Sym, Encoding, Streamer);
|
2011-04-28 23:04:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
const MCExpr *
|
|
|
|
MCAsmInfo::getExprForFDESymbol(const MCSymbol *Sym,
|
2011-05-01 05:50:49 +02:00
|
|
|
unsigned Encoding,
|
2011-04-28 23:04:39 +02:00
|
|
|
MCStreamer &Streamer) const {
|
2011-05-01 05:50:49 +02:00
|
|
|
if (!(Encoding & dwarf::DW_EH_PE_pcrel))
|
2015-05-30 03:25:56 +02:00
|
|
|
return MCSymbolRefExpr::create(Sym, Streamer.getContext());
|
2011-05-01 05:50:49 +02:00
|
|
|
|
|
|
|
MCContext &Context = Streamer.getContext();
|
2015-05-30 03:25:56 +02:00
|
|
|
const MCExpr *Res = MCSymbolRefExpr::create(Sym, Context);
|
2015-05-18 20:43:14 +02:00
|
|
|
MCSymbol *PCSym = Context.createTempSymbol();
|
2020-02-15 04:21:58 +01:00
|
|
|
Streamer.emitLabel(PCSym);
|
2015-05-30 03:25:56 +02:00
|
|
|
const MCExpr *PC = MCSymbolRefExpr::create(PCSym, Context);
|
|
|
|
return MCBinaryExpr::createSub(Res, PC, Context);
|
2011-04-28 18:09:09 +02:00
|
|
|
}
|
2015-06-09 02:31:39 +02:00
|
|
|
|
[XCOFF][AIX] Differentiate usage of label symbol and csect symbol
Summary:
We are using symbols to represent label and csect interchangeably before, and that could be a problem.
There are cases we would need to add storage mapping class to the symbol if that symbol is actually the name of a csect, but it's hard for us to figure out whether that symbol is a label or csect.
This patch intend to do the following:
1. Construct a QualName (A name include the storage mapping class)
MCSymbolXCOFF for every MCSectionXCOFF.
2. Keep a pointer to that QualName inside of MCSectionXCOFF.
3. Use that QualName whenever we need a symbol refers to that
MCSectionXCOFF.
4. Adapt the snowball effect from the above changes in
XCOFFObjectWriter.cpp.
Reviewers: xingxue, DiggerLin, sfertile, daltenty, hubert.reinterpretcast
Reviewed By: DiggerLin, daltenty
Subscribers: wuzish, nemanjai, mgorny, hiraditya, kbarton, jsji, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D69633
2019-11-08 15:26:28 +01:00
|
|
|
bool MCAsmInfo::isAcceptableChar(char C) const {
|
2021-01-23 08:25:03 +01:00
|
|
|
return isAlnum(C) || C == '_' || C == '$' || C == '.' || C == '@';
|
2015-06-09 02:31:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
bool MCAsmInfo::isValidUnquotedName(StringRef Name) const {
|
|
|
|
if (Name.empty())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
// If any of the characters in the string is an unacceptable character, force
|
|
|
|
// quotes.
|
|
|
|
for (char C : Name) {
|
|
|
|
if (!isAcceptableChar(C))
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
MCAsmInfo: Allow targets to specify when the .section directive should be omitted
Summary:
The default behavior is to omit the .section directive for .text, .data,
and sometimes .bss, but some targets may want to omit this directive for
other sections too.
The AMDGPU backend will uses this to emit a simplified syntax for section
switches. For example if the section directive is not omitted (current
behavior), section switches to .hsatext will be printed like this:
.section .hsatext,#alloc,#execinstr,#write
This is actually wrong, because .hsatext has some custom STT_* flags,
which MC doesn't know how to print or parse.
If the section directive is omitted (made possible by this commit),
section switches will be printed like this:
.hsatext
The motivation for this patch is to make it possible to emit sections
with custom STT_* flags without having to teach MC about all the target
specific STT_* flags.
Reviewers: rafael, grosbach
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D12423
llvm-svn: 248618
2015-09-25 23:41:14 +02:00
|
|
|
|
|
|
|
bool MCAsmInfo::shouldOmitSectionDirective(StringRef SectionName) const {
|
|
|
|
// FIXME: Does .section .bss/.data/.text work everywhere??
|
|
|
|
return SectionName == ".text" || SectionName == ".data" ||
|
|
|
|
(SectionName == ".bss" && !usesELFSectionDirectiveForBSS());
|
|
|
|
}
|