mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-13 22:58:50 +00:00
[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
This commit is contained in:
parent
e58a61dc83
commit
54b9760f86
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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: ^
|
||||
|
10
test/MC/ELF/ARM/directive-type-diagnostics.s
Normal file
10
test/MC/ELF/ARM/directive-type-diagnostics.s
Normal file
@ -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: ^
|
||||
|
Loading…
Reference in New Issue
Block a user