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:
Saleem Abdulrasool 2014-09-18 04:28:29 +00:00
parent 3ff76847ba
commit 9c00ddb8d5
2 changed files with 72 additions and 1 deletions

View File

@ -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")

View 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: ^