Skip to content

Commit a03ae73

Browse files
committed
Add XCOFF triple object format type for AIX
This patch adds an XCOFF triple object format type into LLVM. This XCOFF triple object file type will be used later by object file and assembly generation for the AIX platform. Differential Revision: https://reviews.llvm.org/D58930 llvm-svn: 355989
1 parent d425d6b commit a03ae73

File tree

11 files changed

+51
-1
lines changed

11 files changed

+51
-1
lines changed

clang/lib/CodeGen/BackendUtil.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1447,6 +1447,9 @@ static const char* getSectionNameForBitcode(const Triple &T) {
14471447
case Triple::Wasm:
14481448
case Triple::UnknownObjectFormat:
14491449
return ".llvmbc";
1450+
case Triple::XCOFF:
1451+
llvm_unreachable("XCOFF is not yet implemented");
1452+
break;
14501453
}
14511454
llvm_unreachable("Unimplemented ObjectFormatType");
14521455
}
@@ -1460,6 +1463,9 @@ static const char* getSectionNameForCommandline(const Triple &T) {
14601463
case Triple::Wasm:
14611464
case Triple::UnknownObjectFormat:
14621465
return ".llvmcmd";
1466+
case Triple::XCOFF:
1467+
llvm_unreachable("XCOFF is not yet implemented");
1468+
break;
14631469
}
14641470
llvm_unreachable("Unimplemented ObjectFormatType");
14651471
}

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4406,6 +4406,8 @@ CodeGenModule::GetAddrOfConstantCFString(const StringLiteral *Literal) {
44064406
switch (Triple.getObjectFormat()) {
44074407
case llvm::Triple::UnknownObjectFormat:
44084408
llvm_unreachable("unknown file format");
4409+
case llvm::Triple::XCOFF:
4410+
llvm_unreachable("XCOFF is not yet implemented");
44094411
case llvm::Triple::COFF:
44104412
case llvm::Triple::ELF:
44114413
case llvm::Triple::Wasm:

lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2059,6 +2059,7 @@ bool GDBRemoteCommunicationClient::GetCurrentProcessInfo(bool allow_lazy) {
20592059
20602060
assert(triple.getObjectFormat() != llvm::Triple::UnknownObjectFormat);
20612061
assert(triple.getObjectFormat() != llvm::Triple::Wasm);
2062+
assert(triple.getObjectFormat() != llvm::Triple::XCOFF);
20622063
switch (triple.getObjectFormat()) {
20632064
case llvm::Triple::MachO:
20642065
m_process_arch.SetArchitecture(eArchTypeMachO, cpu, sub);
@@ -2070,6 +2071,7 @@ bool GDBRemoteCommunicationClient::GetCurrentProcessInfo(bool allow_lazy) {
20702071
m_process_arch.SetArchitecture(eArchTypeCOFF, cpu, sub);
20712072
break;
20722073
case llvm::Triple::Wasm:
2074+
case llvm::Triple::XCOFF:
20732075
if (log)
20742076
log->Printf("error: not supported target architecture");
20752077
return false;

llvm/include/llvm/ADT/Triple.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ class Triple {
219219
ELF,
220220
MachO,
221221
Wasm,
222+
XCOFF,
222223
};
223224

224225
private:
@@ -598,6 +599,11 @@ class Triple {
598599
!isAndroid();
599600
}
600601

602+
/// Tests whether the OS is AIX.
603+
bool isOSAIX() const {
604+
return getOS() == Triple::AIX;
605+
}
606+
601607
/// Tests whether the OS uses the ELF binary format.
602608
bool isOSBinFormatELF() const {
603609
return getObjectFormat() == Triple::ELF;
@@ -618,6 +624,11 @@ class Triple {
618624
return getObjectFormat() == Triple::Wasm;
619625
}
620626

627+
/// Tests whether the OS uses the XCOFF binary format.
628+
bool isOSBinFormatXCOFF() const {
629+
return getObjectFormat() == Triple::XCOFF;
630+
}
631+
621632
/// Tests whether the target is the PS4 CPU
622633
bool isPS4CPU() const {
623634
return getArch() == Triple::x86_64 &&

llvm/include/llvm/MC/MCObjectFileInfo.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ class MCObjectFileInfo {
380380
return EHFrameSection;
381381
}
382382

383-
enum Environment { IsMachO, IsELF, IsCOFF, IsWasm };
383+
enum Environment { IsMachO, IsELF, IsCOFF, IsWasm, IsXCOFF };
384384
Environment getObjectFileType() const { return Env; }
385385

386386
bool isPositionIndependent() const { return PositionIndependent; }

llvm/lib/MC/MCContext.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,9 @@ MCSymbol *MCContext::createSymbolImpl(const StringMapEntry<bool> *Name,
161161
return new (Name, *this) MCSymbolMachO(Name, IsTemporary);
162162
case MCObjectFileInfo::IsWasm:
163163
return new (Name, *this) MCSymbolWasm(Name, IsTemporary);
164+
case MCObjectFileInfo::IsXCOFF:
165+
// TODO: Need to implement class MCSymbolXCOFF.
166+
break;
164167
}
165168
}
166169
return new (Name, *this) MCSymbol(MCSymbol::SymbolKindUnset, Name,

llvm/lib/MC/MCObjectFileInfo.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -801,6 +801,11 @@ void MCObjectFileInfo::InitMCObjectFileInfo(const Triple &TheTriple, bool PIC,
801801
Env = IsWasm;
802802
initWasmMCObjectFileInfo(TT);
803803
break;
804+
case Triple::XCOFF:
805+
Env = IsXCOFF;
806+
// TODO: Initialize MCObjectFileInfo for XCOFF format when
807+
// MCSectionXCOFF is ready.
808+
break;
804809
case Triple::UnknownObjectFormat:
805810
report_fatal_error("Cannot initialize MC for unknown object file format.");
806811
break;
@@ -816,6 +821,7 @@ MCSection *MCObjectFileInfo::getDwarfComdatSection(const char *Name,
816821
case Triple::MachO:
817822
case Triple::COFF:
818823
case Triple::Wasm:
824+
case Triple::XCOFF:
819825
case Triple::UnknownObjectFormat:
820826
report_fatal_error("Cannot get DWARF comdat section for this object file "
821827
"format: not implemented.");

llvm/lib/MC/MCParser/AsmParser.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,9 @@ AsmParser::AsmParser(SourceMgr &SM, MCContext &Ctx, MCStreamer &Out,
710710
case MCObjectFileInfo::IsWasm:
711711
PlatformParser.reset(createWasmAsmParser());
712712
break;
713+
case MCObjectFileInfo::IsXCOFF:
714+
// TODO: Need to implement createXCOFFAsmParser for XCOFF format.
715+
break;
713716
}
714717

715718
PlatformParser->Initialize(*this);

llvm/lib/Support/Triple.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,9 @@ static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) {
534534

535535
static Triple::ObjectFormatType parseFormat(StringRef EnvironmentName) {
536536
return StringSwitch<Triple::ObjectFormatType>(EnvironmentName)
537+
// "xcoff" must come before "coff" because of the order-dependendent
538+
// pattern matching.
539+
.EndsWith("xcoff", Triple::XCOFF)
537540
.EndsWith("coff", Triple::COFF)
538541
.EndsWith("elf", Triple::ELF)
539542
.EndsWith("macho", Triple::MachO)
@@ -622,6 +625,7 @@ static StringRef getObjectFormatTypeName(Triple::ObjectFormatType Kind) {
622625
case Triple::ELF: return "elf";
623626
case Triple::MachO: return "macho";
624627
case Triple::Wasm: return "wasm";
628+
case Triple::XCOFF: return "xcoff";
625629
}
626630
llvm_unreachable("unknown object format type");
627631
}
@@ -686,6 +690,8 @@ static Triple::ObjectFormatType getDefaultFormat(const Triple &T) {
686690
case Triple::ppc64:
687691
if (T.isOSDarwin())
688692
return Triple::MachO;
693+
else if (T.isOSAIX())
694+
return Triple::XCOFF;
689695
return Triple::ELF;
690696

691697
case Triple::wasm32:

llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5594,6 +5594,9 @@ bool ARMAsmParser::parsePrefix(ARMMCExpr::VariantKind &RefKind) {
55945594
case MCObjectFileInfo::IsWasm:
55955595
CurrentFormat = WASM;
55965596
break;
5597+
case MCObjectFileInfo::IsXCOFF:
5598+
llvm_unreachable("unexpected object format");
5599+
break;
55975600
}
55985601

55995602
if (~Prefix->SupportedFormats & CurrentFormat) {

llvm/unittests/ADT/TripleTest.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1258,6 +1258,11 @@ TEST(TripleTest, FileFormat) {
12581258
EXPECT_EQ(Triple::Wasm,
12591259
Triple("wasm64-unknown-wasi-musl-wasm").getObjectFormat());
12601260

1261+
EXPECT_EQ(Triple::XCOFF, Triple("powerpc-ibm-aix").getObjectFormat());
1262+
EXPECT_EQ(Triple::XCOFF, Triple("powerpc64-ibm-aix").getObjectFormat());
1263+
EXPECT_EQ(Triple::XCOFF, Triple("powerpc---xcoff").getObjectFormat());
1264+
EXPECT_EQ(Triple::XCOFF, Triple("powerpc64---xcoff").getObjectFormat());
1265+
12611266
Triple MSVCNormalized(Triple::normalize("i686-pc-windows-msvc-elf"));
12621267
EXPECT_EQ(Triple::ELF, MSVCNormalized.getObjectFormat());
12631268

@@ -1276,6 +1281,9 @@ TEST(TripleTest, FileFormat) {
12761281

12771282
T.setObjectFormat(Triple::MachO);
12781283
EXPECT_EQ(Triple::MachO, T.getObjectFormat());
1284+
1285+
T.setObjectFormat(Triple::XCOFF);
1286+
EXPECT_EQ(Triple::XCOFF, T.getObjectFormat());
12791287
}
12801288

12811289
TEST(TripleTest, NormalizeWindows) {

0 commit comments

Comments
 (0)