From 9c00ddb8d5c6be2286a3a66ccec6c6ecc682295b Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Thu, 18 Sep 2014 04:28:29 +0000 Subject: [PATCH] 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 --- lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 5 +- test/MC/ARM/directive-unsupported.s | 68 +++++++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 test/MC/ARM/directive-unsupported.s diff --git a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index 2243da03e28..7e33ec5617d 100644 --- a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -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(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") diff --git a/test/MC/ARM/directive-unsupported.s b/test/MC/ARM/directive-unsupported.s new file mode 100644 index 00000000000..0b1f9bac61a --- /dev/null +++ b/test/MC/ARM/directive-unsupported.s @@ -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: ^ +