2017-02-11 08:27:28 +08:00
|
|
|
//===- MCAsmInfo.cpp - Asm Info -------------------------------------------===//
|
2006-09-07 02:35:33 +08:00
|
|
|
//
|
2019-01-19 16:50:56 +08: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-07 02:35:33 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// This file defines target asm properties related what form asm statements
|
|
|
|
// should take.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2009-08-23 04:48:53 +08:00
|
|
|
#include "llvm/MC/MCAsmInfo.h"
|
2017-06-07 11:48:56 +08:00
|
|
|
#include "llvm/BinaryFormat/Dwarf.h"
|
2011-05-01 11:50:49 +08:00
|
|
|
#include "llvm/MC/MCContext.h"
|
2011-04-29 00:09:09 +08:00
|
|
|
#include "llvm/MC/MCExpr.h"
|
|
|
|
#include "llvm/MC/MCStreamer.h"
|
2018-04-04 01:28:55 +08:00
|
|
|
#include "llvm/Support/CommandLine.h"
|
2017-02-11 08:27:28 +08:00
|
|
|
|
2006-09-07 02:35:33 +08:00
|
|
|
using namespace llvm;
|
|
|
|
|
2018-04-04 01:28:55 +08:00
|
|
|
enum DefaultOnOff { Default, Enable, Disable };
|
|
|
|
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));
|
|
|
|
|
2010-01-20 14:34:14 +08:00
|
|
|
MCAsmInfo::MCAsmInfo() {
|
2011-03-25 02:46:34 +08:00
|
|
|
SeparatorString = ";";
|
2008-09-26 05:00:33 +08:00
|
|
|
CommentString = "#";
|
2010-09-23 06:19:53 +08:00
|
|
|
LabelSuffix = ":";
|
2013-12-03 07:39:26 +08:00
|
|
|
PrivateGlobalPrefix = "L";
|
2014-12-04 08:06:57 +08:00
|
|
|
PrivateLabelPrefix = PrivateGlobalPrefix;
|
2014-03-29 15:05:06 +08:00
|
|
|
LinkerPrivateGlobalPrefix = "";
|
2009-08-12 06:39:40 +08:00
|
|
|
InlineAsmStart = "APP";
|
|
|
|
InlineAsmEnd = "NO_APP";
|
2011-07-27 08:38:12 +08:00
|
|
|
Code16Directive = ".code16";
|
|
|
|
Code32Directive = ".code32";
|
|
|
|
Code64Directive = ".code64";
|
2008-09-26 05:00:33 +08: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-02 05:16:17 +08:00
|
|
|
WeakDirective = "\t.weak\t";
|
2018-04-04 01:28:55 +08:00
|
|
|
if (DwarfExtendedLoc != Default)
|
|
|
|
SupportsExtendedDwarfLocDirective = DwarfExtendedLoc == Enable;
|
2014-02-13 22:44:26 +08: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 12:19:25 +08:00
|
|
|
// - The target subclasses for AArch64, ARM, and X86 handle these cases
|
2014-02-13 22:44:26 +08:00
|
|
|
UseIntegratedAssembler = false;
|
2016-07-11 20:42:14 +08:00
|
|
|
PreserveAsmComments = true;
|
2006-10-14 01:50:07 +08:00
|
|
|
}
|
2006-10-05 08:35:16 +08:00
|
|
|
|
2017-02-11 08:27:28 +08:00
|
|
|
MCAsmInfo::~MCAsmInfo() = default;
|
2006-10-14 01:50:07 +08:00
|
|
|
|
2019-04-12 14:57:45 +08:00
|
|
|
void MCAsmInfo::addInitialFrameState(const MCCFIInstruction &Inst) {
|
|
|
|
InitialFrameState.push_back(Inst);
|
|
|
|
}
|
|
|
|
|
2015-01-10 02:55:42 +08:00
|
|
|
bool MCAsmInfo::isSectionAtomizableBySymbols(const MCSection &Section) const {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2011-04-29 00:09:09 +08:00
|
|
|
const MCExpr *
|
|
|
|
MCAsmInfo::getExprForPersonalitySymbol(const MCSymbol *Sym,
|
2011-05-01 11:50:49 +08:00
|
|
|
unsigned Encoding,
|
2011-04-29 00:09:09 +08:00
|
|
|
MCStreamer &Streamer) const {
|
2011-05-01 11:50:49 +08:00
|
|
|
return getExprForFDESymbol(Sym, Encoding, Streamer);
|
2011-04-29 05:04:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
const MCExpr *
|
|
|
|
MCAsmInfo::getExprForFDESymbol(const MCSymbol *Sym,
|
2011-05-01 11:50:49 +08:00
|
|
|
unsigned Encoding,
|
2011-04-29 05:04:39 +08:00
|
|
|
MCStreamer &Streamer) const {
|
2011-05-01 11:50:49 +08:00
|
|
|
if (!(Encoding & dwarf::DW_EH_PE_pcrel))
|
2015-05-30 09:25:56 +08:00
|
|
|
return MCSymbolRefExpr::create(Sym, Streamer.getContext());
|
2011-05-01 11:50:49 +08:00
|
|
|
|
|
|
|
MCContext &Context = Streamer.getContext();
|
2015-05-30 09:25:56 +08:00
|
|
|
const MCExpr *Res = MCSymbolRefExpr::create(Sym, Context);
|
2015-05-19 02:43:14 +08:00
|
|
|
MCSymbol *PCSym = Context.createTempSymbol();
|
2011-05-01 11:50:49 +08:00
|
|
|
Streamer.EmitLabel(PCSym);
|
2015-05-30 09:25:56 +08:00
|
|
|
const MCExpr *PC = MCSymbolRefExpr::create(PCSym, Context);
|
|
|
|
return MCBinaryExpr::createSub(Res, PC, Context);
|
2011-04-29 00:09:09 +08:00
|
|
|
}
|
2015-06-09 08:31:39 +08:00
|
|
|
|
|
|
|
static bool isAcceptableChar(char C) {
|
|
|
|
return (C >= 'a' && C <= 'z') || (C >= 'A' && C <= 'Z') ||
|
|
|
|
(C >= '0' && C <= '9') || C == '_' || C == '$' || C == '.' || C == '@';
|
|
|
|
}
|
|
|
|
|
|
|
|
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-26 05:41:14 +08:00
|
|
|
|
|
|
|
bool MCAsmInfo::shouldOmitSectionDirective(StringRef SectionName) const {
|
|
|
|
// FIXME: Does .section .bss/.data/.text work everywhere??
|
|
|
|
return SectionName == ".text" || SectionName == ".data" ||
|
|
|
|
(SectionName == ".bss" && !usesELFSectionDirectiveForBSS());
|
|
|
|
}
|