summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/MC')
-rw-r--r--llvm/lib/MC/MCAsmInfoXCOFF.cpp11
-rw-r--r--llvm/lib/MC/MCAsmStreamer.cpp1
-rw-r--r--llvm/lib/MC/MCELFStreamer.cpp3
-rw-r--r--llvm/lib/MC/MCMachOStreamer.cpp1
-rw-r--r--llvm/lib/MC/MCSectionXCOFF.cpp36
-rw-r--r--llvm/lib/MC/XCOFFObjectWriter.cpp3
6 files changed, 47 insertions, 8 deletions
diff --git a/llvm/lib/MC/MCAsmInfoXCOFF.cpp b/llvm/lib/MC/MCAsmInfoXCOFF.cpp
index 13939f6a65f..65fe8848e20 100644
--- a/llvm/lib/MC/MCAsmInfoXCOFF.cpp
+++ b/llvm/lib/MC/MCAsmInfoXCOFF.cpp
@@ -20,5 +20,16 @@ MCAsmInfoXCOFF::MCAsmInfoXCOFF() {
UseDotAlignForAlignment = true;
AsciiDirective = nullptr; // not supported
AscizDirective = nullptr; // not supported
+ NeedsFunctionDescriptors = true;
+ HasDotLGloblDirective = true;
Data64bitsDirective = "\t.llong\t";
+ SupportsQuotedNames = false;
+}
+
+bool MCAsmInfoXCOFF::isValidUnquotedName(StringRef Name) const {
+ // FIXME: Remove this function when we stop using "TOC[TC0]" as a symbol name.
+ if (Name.equals("TOC[TC0]"))
+ return true;
+
+ return MCAsmInfo::isValidUnquotedName(Name);
}
diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp
index 55bcc914ea3..dd27d0bc8a5 100644
--- a/llvm/lib/MC/MCAsmStreamer.cpp
+++ b/llvm/lib/MC/MCAsmStreamer.cpp
@@ -650,6 +650,7 @@ bool MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
case MCSA_Global: // .globl/.global
OS << MAI->getGlobalDirective();
break;
+ case MCSA_LGlobal: OS << "\t.lglobl\t"; break;
case MCSA_Hidden: OS << "\t.hidden\t"; break;
case MCSA_IndirectSymbol: OS << "\t.indirect_symbol\t"; break;
case MCSA_Internal: OS << "\t.internal\t"; break;
diff --git a/llvm/lib/MC/MCELFStreamer.cpp b/llvm/lib/MC/MCELFStreamer.cpp
index 816e742b263..e411e24921c 100644
--- a/llvm/lib/MC/MCELFStreamer.cpp
+++ b/llvm/lib/MC/MCELFStreamer.cpp
@@ -277,6 +277,9 @@ bool MCELFStreamer::EmitSymbolAttribute(MCSymbol *S, MCSymbolAttr Attribute) {
case MCSA_AltEntry:
llvm_unreachable("ELF doesn't support the .alt_entry attribute");
+
+ case MCSA_LGlobal:
+ llvm_unreachable("ELF doesn't support the .lglobl attribute");
}
return true;
diff --git a/llvm/lib/MC/MCMachOStreamer.cpp b/llvm/lib/MC/MCMachOStreamer.cpp
index 613f255a4ea..8e558a36b7a 100644
--- a/llvm/lib/MC/MCMachOStreamer.cpp
+++ b/llvm/lib/MC/MCMachOStreamer.cpp
@@ -330,6 +330,7 @@ bool MCMachOStreamer::EmitSymbolAttribute(MCSymbol *Sym,
case MCSA_Protected:
case MCSA_Weak:
case MCSA_Local:
+ case MCSA_LGlobal:
return false;
case MCSA_Global:
diff --git a/llvm/lib/MC/MCSectionXCOFF.cpp b/llvm/lib/MC/MCSectionXCOFF.cpp
index db277521db2..d52959f15f9 100644
--- a/llvm/lib/MC/MCSectionXCOFF.cpp
+++ b/llvm/lib/MC/MCSectionXCOFF.cpp
@@ -15,26 +15,46 @@ using namespace llvm;
MCSectionXCOFF::~MCSectionXCOFF() = default;
+static StringRef getMappingClassString(XCOFF::StorageMappingClass SMC) {
+ switch (SMC) {
+ case XCOFF::XMC_DS:
+ return "DS";
+ case XCOFF::XMC_RW:
+ return "RW";
+ case XCOFF::XMC_PR:
+ return "PR";
+ default:
+ report_fatal_error("Unhandled storage-mapping class.");
+ }
+}
+
void MCSectionXCOFF::PrintSwitchToSection(const MCAsmInfo &MAI, const Triple &T,
raw_ostream &OS,
const MCExpr *Subsection) const {
if (getKind().isText()) {
if (getMappingClass() != XCOFF::XMC_PR)
- llvm_unreachable("Unsupported storage-mapping class for .text csect");
+ report_fatal_error("Unhandled storage-mapping class for .text csect");
OS << "\t.csect " << getSectionName() << "["
- << "PR"
+ << getMappingClassString(getMappingClass())
<< "]" << '\n';
return;
}
if (getKind().isData()) {
- assert(getMappingClass() == XCOFF::XMC_RW &&
- "Unhandled storage-mapping class for data section.");
-
- OS << "\t.csect " << getSectionName() << "["
- << "RW"
- << "]" << '\n';
+ switch (getMappingClass()) {
+ case XCOFF::XMC_RW:
+ case XCOFF::XMC_DS:
+ OS << "\t.csect " << getSectionName() << "["
+ << getMappingClassString(getMappingClass()) << "]" << '\n';
+ break;
+ case XCOFF::XMC_TC0:
+ OS << "\t.toc\n";
+ break;
+ default:
+ report_fatal_error(
+ "Unhandled storage-mapping class for .data csect.");
+ }
return;
}
diff --git a/llvm/lib/MC/XCOFFObjectWriter.cpp b/llvm/lib/MC/XCOFFObjectWriter.cpp
index e831d3e763f..5d8735b017d 100644
--- a/llvm/lib/MC/XCOFFObjectWriter.cpp
+++ b/llvm/lib/MC/XCOFFObjectWriter.cpp
@@ -235,6 +235,9 @@ void XCOFFObjectWriter::executePostLayoutBinding(
break;
}
report_fatal_error("Unhandled mapping of read-write csect to section.");
+ case XCOFF::XMC_TC0:
+ // TODO FIXME Handle emiting the TOC base.
+ break;
case XCOFF::XMC_BS:
assert(XCOFF::XTY_CM == MCSec->getCSectType() &&
"Mapping invalid csect. CSECT with bss storage class must be "
OpenPOWER on IntegriCloud