summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2015-12-22 01:39:04 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2015-12-22 01:39:04 +0000
commitff1d084aa2f07927f3c63c93f3286822abe9d1ac (patch)
tree5ff2fae7c2a9b59f37829e17a4eac861b1728856 /llvm
parenta9f3bc6d86a7e067a4529895ae3e76f0c587c128 (diff)
downloadbcm5719-llvm-ff1d084aa2f07927f3c63c93f3286822abe9d1ac.tar.gz
bcm5719-llvm-ff1d084aa2f07927f3c63c93f3286822abe9d1ac.zip
[MC] Don't use the architecture to govern which object file format to use
InitMCObjectFileInfo was trying to override the triple in awkward ways. For example, a triple specifying COFF but not Windows was forced as ELF. This makes it easy for internal invariants to get violated, such as those which triggered PR25912. This fixes PR25912. llvm-svn: 256226
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/MC/MCObjectFileInfo.cpp28
-rw-r--r--llvm/lib/Support/Triple.cpp48
-rw-r--r--llvm/test/CodeGen/X86/statepoint-stackmap-format.ll2
-rw-r--r--llvm/test/MC/COFF/ARM/directive-type-diagnostics.s10
-rw-r--r--llvm/test/MC/ELF/ARM/directive-type-diagnostics.s10
5 files changed, 62 insertions, 36 deletions
diff --git a/llvm/lib/MC/MCObjectFileInfo.cpp b/llvm/lib/MC/MCObjectFileInfo.cpp
index dbedd73a432..028f2e955b2 100644
--- a/llvm/lib/MC/MCObjectFileInfo.cpp
+++ b/llvm/lib/MC/MCObjectFileInfo.cpp
@@ -606,7 +606,6 @@ void MCObjectFileInfo::initCOFFMCObjectFileInfo(Triple T) {
// though it contains relocatable pointers. In PIC mode, this is probably a
// big runtime hit for C++ apps. Either the contents of the LSDA need to be
// adjusted or this should be a data section.
- assert(T.isOSWindows() && "Windows is the only supported COFF target");
if (T.getArch() == Triple::x86_64) {
// On Windows 64 with SEH, the LSDA is emitted into the .xdata section
LSDASection = nullptr;
@@ -810,25 +809,26 @@ void MCObjectFileInfo::InitMCObjectFileInfo(const Triple &TheTriple,
TT = TheTriple;
- Triple::ArchType Arch = TT.getArch();
- // FIXME: Checking for Arch here to filter out bogus triples such as
- // cellspu-apple-darwin. Perhaps we should fix in Triple?
- if ((Arch == Triple::x86 || Arch == Triple::x86_64 ||
- Arch == Triple::arm || Arch == Triple::thumb ||
- Arch == Triple::aarch64 ||
- Arch == Triple::ppc || Arch == Triple::ppc64 ||
- Arch == Triple::UnknownArch) &&
- TT.isOSBinFormatMachO()) {
+ switch (TT.getObjectFormat()) {
+ case Triple::MachO:
Env = IsMachO;
initMachOMCObjectFileInfo(TT);
- } else if ((Arch == Triple::x86 || Arch == Triple::x86_64 ||
- Arch == Triple::arm || Arch == Triple::thumb) &&
- (TT.isOSWindows() && TT.getObjectFormat() == Triple::COFF)) {
+ break;
+ case Triple::COFF:
+ if (!TT.isOSWindows())
+ report_fatal_error(
+ "Cannot initialize MC for non-Windows COFF object files.");
+
Env = IsCOFF;
initCOFFMCObjectFileInfo(TT);
- } else {
+ break;
+ case Triple::ELF:
Env = IsELF;
initELFMCObjectFileInfo(TT);
+ break;
+ case Triple::UnknownObjectFormat:
+ report_fatal_error("Cannot initialize MC for unknown object file format.");
+ break;
}
}
diff --git a/llvm/lib/Support/Triple.cpp b/llvm/lib/Support/Triple.cpp
index 9061d1772f2..3bb1116007e 100644
--- a/llvm/lib/Support/Triple.cpp
+++ b/llvm/lib/Support/Triple.cpp
@@ -538,22 +538,53 @@ static const char *getObjectFormatTypeName(Triple::ObjectFormatType Kind) {
static Triple::ObjectFormatType getDefaultFormat(const Triple &T) {
switch (T.getArch()) {
- default:
- break;
+ case Triple::UnknownArch:
+ case Triple::aarch64:
+ case Triple::arm:
+ case Triple::thumb:
+ case Triple::x86:
+ case Triple::x86_64:
+ if (T.isOSDarwin())
+ return Triple::MachO;
+ else if (T.isOSWindows())
+ return Triple::COFF;
+ return Triple::ELF;
+
+ case Triple::aarch64_be:
+ case Triple::amdgcn:
+ case Triple::amdil:
+ case Triple::amdil64:
+ case Triple::armeb:
+ case Triple::avr:
+ case Triple::bpfeb:
+ case Triple::bpfel:
case Triple::hexagon:
+ case Triple::hsail:
+ case Triple::hsail64:
+ case Triple::kalimba:
+ case Triple::le32:
+ case Triple::le64:
case Triple::mips:
- case Triple::mipsel:
case Triple::mips64:
case Triple::mips64el:
+ case Triple::mipsel:
+ case Triple::msp430:
+ case Triple::nvptx:
+ case Triple::nvptx64:
+ case Triple::ppc64le:
case Triple::r600:
- case Triple::amdgcn:
+ case Triple::shave:
case Triple::sparc:
+ case Triple::sparcel:
case Triple::sparcv9:
+ case Triple::spir:
+ case Triple::spir64:
case Triple::systemz:
+ case Triple::tce:
+ case Triple::thumbeb:
case Triple::wasm32:
case Triple::wasm64:
case Triple::xcore:
- case Triple::ppc64le:
return Triple::ELF;
case Triple::ppc:
@@ -562,12 +593,7 @@ static Triple::ObjectFormatType getDefaultFormat(const Triple &T) {
return Triple::MachO;
return Triple::ELF;
}
-
- if (T.isOSDarwin())
- return Triple::MachO;
- else if (T.isOSWindows())
- return Triple::COFF;
- return Triple::ELF;
+ llvm_unreachable("unknown architecture");
}
/// \brief Construct a triple from the string representation provided.
diff --git a/llvm/test/CodeGen/X86/statepoint-stackmap-format.ll b/llvm/test/CodeGen/X86/statepoint-stackmap-format.ll
index e18476cee53..2b7f077a4b2 100644
--- a/llvm/test/CodeGen/X86/statepoint-stackmap-format.ll
+++ b/llvm/test/CodeGen/X86/statepoint-stackmap-format.ll
@@ -1,5 +1,5 @@
; RUN: llc < %s -mtriple="x86_64-pc-linux-gnu" | FileCheck %s
-; RUN: llc < %s -mtriple="x86_64-pc-win64-coff" | FileCheck %s
+; RUN: llc < %s -mtriple="x86_64-pc-unknown-elf" | FileCheck %s
; This test is a sanity check to ensure statepoints are generating StackMap
; sections correctly. This is not intended to be a rigorous test of the
diff --git a/llvm/test/MC/COFF/ARM/directive-type-diagnostics.s b/llvm/test/MC/COFF/ARM/directive-type-diagnostics.s
deleted file mode 100644
index f8a52cd43e4..00000000000
--- a/llvm/test/MC/COFF/ARM/directive-type-diagnostics.s
+++ /dev/null
@@ -1,10 +0,0 @@
-// RUN: not llvm-mc -triple arm-coff -filetype asm -o /dev/null %s 2>&1 | FileCheck %s
-// RUN: not llvm-mc -triple armeb-coff -filetype asm -o /dev/null %s 2>&1 | FileCheck %s
-// RUN: not llvm-mc -triple thumb-coff -filetype asm -o /dev/null %s 2>&1 | FileCheck %s
-// RUN: not llvm-mc -triple thumbeb-coff -filetype asm -o /dev/null %s 2>&1 | FileCheck %s
-
- .type symbol 32
-// CHECK: error: expected STT_<TYPE_IN_UPPER_CASE>, '#<type>', '%<type>' or "<type>"
-// CHECK: .type symbol 32
-// CHECK: ^
-
diff --git a/llvm/test/MC/ELF/ARM/directive-type-diagnostics.s b/llvm/test/MC/ELF/ARM/directive-type-diagnostics.s
new file mode 100644
index 00000000000..b166ffd06aa
--- /dev/null
+++ b/llvm/test/MC/ELF/ARM/directive-type-diagnostics.s
@@ -0,0 +1,10 @@
+// RUN: not llvm-mc -triple arm-elf -filetype asm -o /dev/null %s 2>&1 | FileCheck %s
+// RUN: not llvm-mc -triple armeb-elf -filetype asm -o /dev/null %s 2>&1 | FileCheck %s
+// RUN: not llvm-mc -triple thumb-elf -filetype asm -o /dev/null %s 2>&1 | FileCheck %s
+// RUN: not llvm-mc -triple thumbeb-elf -filetype asm -o /dev/null %s 2>&1 | FileCheck %s
+
+ .type symbol 32
+// CHECK: error: expected STT_<TYPE_IN_UPPER_CASE>, '#<type>', '%<type>' or "<type>"
+// CHECK: .type symbol 32
+// CHECK: ^
+
OpenPOWER on IntegriCloud