From 6a4207d26301f167f7f0c77cf5bd787b1edad3c5 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Tue, 7 Jan 2014 02:29:00 +0000 Subject: [PATCH] ARM IAS: allow more depth in contextual diagnostics Switch the context to be SmallVectors. This allows for saving additional context when providing previous emission sites. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198665 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 50 ++++++++++++++--------- test/MC/ARM/unwind-stack-diagnostics.s | 30 ++++++++++++++ 2 files changed, 60 insertions(+), 20 deletions(-) create mode 100644 test/MC/ARM/unwind-stack-diagnostics.s diff --git a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index f864af70e29..0076939b4ae 100644 --- a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -116,46 +116,56 @@ typedef MapVector ConstantPoolMapTy; class UnwindContext { MCAsmParser &Parser; - SMLoc FnStartLoc; - SMLoc CantUnwindLoc; - SMLoc PersonalityLoc; - SMLoc HandlerDataLoc; + typedef SmallVector Locs; + + Locs FnStartLocs; + Locs CantUnwindLocs; + Locs PersonalityLocs; + Locs HandlerDataLocs; int FPReg; public: UnwindContext(MCAsmParser &P) : Parser(P), FPReg(-1) {} - bool hasFnStart() const { return FnStartLoc.isValid(); } - bool cantUnwind() const { return CantUnwindLoc.isValid(); } - bool hasHandlerData() const { return HandlerDataLoc.isValid(); } - bool hasPersonality() const { return PersonalityLoc.isValid(); } + bool hasFnStart() const { return !FnStartLocs.empty(); } + bool cantUnwind() const { return !CantUnwindLocs.empty(); } + bool hasHandlerData() const { return !HandlerDataLocs.empty(); } + bool hasPersonality() const { return !PersonalityLocs.empty(); } - void recordFnStart(SMLoc L) { FnStartLoc = L; } - void recordCantUnwind(SMLoc L) { CantUnwindLoc = L; } - void recordPersonality(SMLoc L) { PersonalityLoc = L; } - void recordHandlerData(SMLoc L) { HandlerDataLoc = L; } + void recordFnStart(SMLoc L) { FnStartLocs.push_back(L); } + void recordCantUnwind(SMLoc L) { CantUnwindLocs.push_back(L); } + void recordPersonality(SMLoc L) { PersonalityLocs.push_back(L); } + void recordHandlerData(SMLoc L) { HandlerDataLocs.push_back(L); } void saveFPReg(int Reg) { FPReg = Reg; } int getFPReg() const { return FPReg; } void emitFnStartLocNotes() const { - Parser.Note(FnStartLoc, ".fnstart was specified here"); + for (Locs::const_iterator FI = FnStartLocs.begin(), FE = FnStartLocs.end(); + FI != FE; ++FI) + Parser.Note(*FI, ".fnstart was specified here"); } void emitCantUnwindLocNotes() const { - Parser.Note(CantUnwindLoc, ".cantunwind was specified here"); + for (Locs::const_iterator UI = CantUnwindLocs.begin(), + UE = CantUnwindLocs.end(); UI != UE; ++UI) + Parser.Note(*UI, ".cantunwind was specified here"); } void emitHandlerDataLocNotes() const { - Parser.Note(HandlerDataLoc, ".handlerdata was specified here"); + for (Locs::const_iterator HI = HandlerDataLocs.begin(), + HE = HandlerDataLocs.end(); HI != HE; ++HI) + Parser.Note(*HI, ".handlerdata was specified here"); } void emitPersonalityLocNotes() const { - Parser.Note(PersonalityLoc, ".personality was specified here"); + for (Locs::const_iterator PI = PersonalityLocs.begin(), + PE = PersonalityLocs.end(); PI != PE; ++PI) + Parser.Note(*PI, ".personality was specified here"); } void reset() { - FnStartLoc = SMLoc(); - CantUnwindLoc = SMLoc(); - PersonalityLoc = SMLoc(); - HandlerDataLoc = SMLoc(); + FnStartLocs = Locs(); + CantUnwindLocs = Locs(); + PersonalityLocs = Locs(); + HandlerDataLocs = Locs(); FPReg = -1; } }; diff --git a/test/MC/ARM/unwind-stack-diagnostics.s b/test/MC/ARM/unwind-stack-diagnostics.s new file mode 100644 index 00000000000..28d5672d3aa --- /dev/null +++ b/test/MC/ARM/unwind-stack-diagnostics.s @@ -0,0 +1,30 @@ +@ RUN: not llvm-mc -triple armv7-eabi -filetype asm -o /dev/null 2>&1 %s \ +@ RUN: | FileCheck %s + + .syntax unified + .thumb + + .text + + .global multiple_personality_disorder + .type multiple_personality_disorder,%function +multiple_personality_disorder: + .fnstart + .personality __gcc_personality_v0 + .personality __gxx_personality_v0 + .personality __gxx_personality_sj0 + .cantunwind + +@ CHECK: error: .cantunwind can't be used with .personality directive +@ CHECK: .cantunwind +@ CHECK: ^ +@ CHECK: note: .personality was specified here +@ CHECK: .personality __gcc_personality_v0 +@ CHECK: ^ +@ CHECK: note: .personality was specified here +@ CHECK: .personality __gxx_personality_v0 +@ CHECK: ^ +@ CHECK: note: .personality was specified here +@ CHECK: .personality __gxx_personality_sj0 +@ CHECK: ^ + -- 2.34.1