mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 20:29:53 +00:00
ARM: prevent crash on ELF directives on COFF
Certain directives are unsupported on Windows (some of which could/should be supported). We would not diagnose the use but rather crash during the emission as we try to access the Target Streamer. Add an assertion to prevent creating a NULL reference (which is not permitted under C++) as well as a test to ensure that we can diagnose the disabled directives. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218014 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3ff76847ba
commit
9c00ddb8d5
@ -135,6 +135,8 @@ class ARMAsmParser : public MCTargetAsmParser {
|
||||
UnwindContext UC;
|
||||
|
||||
ARMTargetStreamer &getTargetStreamer() {
|
||||
assert(getParser().getStreamer().getTargetStreamer() &&
|
||||
"do not have a target streamer");
|
||||
MCTargetStreamer &TS = *getParser().getStreamer().getTargetStreamer();
|
||||
return static_cast<ARMTargetStreamer &>(TS);
|
||||
}
|
||||
@ -8313,6 +8315,7 @@ bool ARMAsmParser::ParseDirective(AsmToken DirectiveID) {
|
||||
const MCObjectFileInfo::Environment Format =
|
||||
getContext().getObjectFileInfo()->getObjectFileType();
|
||||
bool IsMachO = Format == MCObjectFileInfo::IsMachO;
|
||||
bool IsCOFF = Format == MCObjectFileInfo::IsCOFF;
|
||||
|
||||
StringRef IDVal = DirectiveID.getIdentifier();
|
||||
if (IDVal == ".word")
|
||||
@ -8364,7 +8367,7 @@ bool ARMAsmParser::ParseDirective(AsmToken DirectiveID) {
|
||||
else if (IDVal == ".thumb_set")
|
||||
return parseDirectiveThumbSet(DirectiveID.getLoc());
|
||||
|
||||
if (!IsMachO) {
|
||||
if (!IsMachO && !IsCOFF) {
|
||||
if (IDVal == ".arch")
|
||||
return parseDirectiveArch(DirectiveID.getLoc());
|
||||
else if (IDVal == ".cpu")
|
||||
|
68
test/MC/ARM/directive-unsupported.s
Normal file
68
test/MC/ARM/directive-unsupported.s
Normal file
@ -0,0 +1,68 @@
|
||||
@ RUN: not llvm-mc -triple thumbv7-windows -filetype asm -o /dev/null %s 2>&1 \
|
||||
@ RUN: | FileCheck %s
|
||||
|
||||
@ RUN: not llvm-mc -triple armv7-darwin -filetype asm -o /dev/null %s 2>&1 \
|
||||
@ RUN: | FileCheck %s
|
||||
|
||||
.syntax unified
|
||||
|
||||
.arch armv7
|
||||
|
||||
// CHECK: error: unknown directive
|
||||
// CHECK: .arch armv7
|
||||
// CHECK: ^
|
||||
|
||||
.cpu cortex-a7
|
||||
|
||||
// CHECK: error: unknown directive
|
||||
// CHECK: .cpu cortex-a7
|
||||
// CHECK: ^
|
||||
|
||||
.fpu neon
|
||||
|
||||
// CHECK: error: unknown directive
|
||||
// CHECK: .fpu neon
|
||||
// CHECK: ^
|
||||
|
||||
.eabi_attribute 0, 0
|
||||
|
||||
// CHECK: error: unknown directive
|
||||
// CHECK: .eabi_attribute 0, 0
|
||||
// CHECK: ^
|
||||
|
||||
.inst 0xdefe
|
||||
|
||||
// CHECK: error: unknown directive
|
||||
// CHECK: .inst 0xdefe
|
||||
// CHECK: ^
|
||||
|
||||
.inst.n 0xdefe
|
||||
|
||||
// CHECK: error: unknown directive
|
||||
// CHECK: .inst.n 0xdefe
|
||||
// CHECK: ^
|
||||
|
||||
.inst.w 0xdefe
|
||||
|
||||
// CHECK: error: unknown directive
|
||||
// CHECK: .inst.w 0xdefe
|
||||
// CHECK: ^
|
||||
|
||||
.object_arch armv7
|
||||
|
||||
// CHECK: error: unknown directive
|
||||
// CHECK: .object_arch armv7
|
||||
// CHECK: ^
|
||||
|
||||
.tlsdescseq undefined
|
||||
|
||||
// CHECK: error: unknown directive
|
||||
// CHECK: .tlsdescseq undefined
|
||||
// CHECK: ^
|
||||
|
||||
.fnstart
|
||||
|
||||
// CHECK: error: unknown directive
|
||||
// CHECK: .fnstart
|
||||
// CHECK: ^
|
||||
|
Loading…
Reference in New Issue
Block a user