aboutsummaryrefslogtreecommitdiffstats
path: root/lib/AsmParser
diff options
context:
space:
mode:
authorNick Lewycky <nicholas@mxc.ca>2008-03-02 02:48:09 +0000
committerNick Lewycky <nicholas@mxc.ca>2008-03-02 02:48:09 +0000
commitfc82fabe00b0b820e3c0d7fc9e289bace0295f11 (patch)
tree963a736756189f58a4bd042ddf745b895e40cbac /lib/AsmParser
parentfe0753efbac4e15d5e1b8a58b06788a86d7e2545 (diff)
downloadexternal_llvm-fc82fabe00b0b820e3c0d7fc9e289bace0295f11.zip
external_llvm-fc82fabe00b0b820e3c0d7fc9e289bace0295f11.tar.gz
external_llvm-fc82fabe00b0b820e3c0d7fc9e289bace0295f11.tar.bz2
Add an unwind_to field to basic blocks, making them Users instead of Values.
This is the first checkin for PR1269, the new EH infrastructure. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47802 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AsmParser')
-rw-r--r--lib/AsmParser/LLLexer.cpp1
-rw-r--r--lib/AsmParser/llvmAsmParser.y42
2 files changed, 25 insertions, 18 deletions
diff --git a/lib/AsmParser/LLLexer.cpp b/lib/AsmParser/LLLexer.cpp
index f78079b..18b774b 100644
--- a/lib/AsmParser/LLLexer.cpp
+++ b/lib/AsmParser/LLLexer.cpp
@@ -474,6 +474,7 @@ int LLLexer::LexIdentifier() {
KEYWORD("asm", ASM_TOK);
KEYWORD("sideeffect", SIDEEFFECT);
KEYWORD("gc", GC);
+ KEYWORD("unwind_to", UNWIND_TO);
KEYWORD("cc", CC_TOK);
KEYWORD("ccc", CCC_TOK);
diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y
index 5a824ae..c564069 100644
--- a/lib/AsmParser/llvmAsmParser.y
+++ b/lib/AsmParser/llvmAsmParser.y
@@ -518,7 +518,7 @@ static Value *getVal(const Type *Ty, const ValID &ID) {
/// defineBBVal - This is a definition of a new basic block with the specified
/// identifier which must be the same as CurFun.NextValNum, if its numeric.
-static BasicBlock *defineBBVal(const ValID &ID) {
+static BasicBlock *defineBBVal(const ValID &ID, BasicBlock *unwindDest) {
assert(inFunctionScope() && "Can't get basic block at global scope!");
BasicBlock *BB = 0;
@@ -548,21 +548,19 @@ static BasicBlock *defineBBVal(const ValID &ID) {
assert(ID.Num == CurFun.NextValNum && "Invalid new block number");
InsertValue(BB);
}
-
- ID.destroy();
- return BB;
- }
-
- // We haven't seen this BB before and its first mention is a definition.
- // Just create it and return it.
- std::string Name (ID.Type == ValID::LocalName ? ID.getName() : "");
- BB = new BasicBlock(Name, CurFun.CurrentFunction);
- if (ID.Type == ValID::LocalID) {
- assert(ID.Num == CurFun.NextValNum && "Invalid new block number");
- InsertValue(BB);
+ } else {
+ // We haven't seen this BB before and its first mention is a definition.
+ // Just create it and return it.
+ std::string Name (ID.Type == ValID::LocalName ? ID.getName() : "");
+ BB = new BasicBlock(Name, CurFun.CurrentFunction);
+ if (ID.Type == ValID::LocalID) {
+ assert(ID.Num == CurFun.NextValNum && "Invalid new block number");
+ InsertValue(BB);
+ }
}
- ID.destroy(); // Free strdup'd memory
+ ID.destroy();
+ BB->setUnwindDest(unwindDest);
return BB;
}
@@ -1066,7 +1064,7 @@ Module *llvm::RunVMAsmParser(llvm::MemoryBuffer *MB) {
%token OPAQUE EXTERNAL TARGET TRIPLE ALIGN ADDRSPACE
%token DEPLIBS CALL TAIL ASM_TOK MODULE SIDEEFFECT
%token CC_TOK CCC_TOK FASTCC_TOK COLDCC_TOK X86_STDCALLCC_TOK X86_FASTCALLCC_TOK
-%token DATALAYOUT
+%token DATALAYOUT UNWIND_TO
%type <UIntVal> OptCallingConv
%type <ParamAttrs> OptParamAttrs ParamAttr
%type <ParamAttrs> OptFuncAttrs FuncAttr
@@ -2568,14 +2566,22 @@ InstructionList : InstructionList Inst {
CHECK_FOR_ERROR
}
| /* empty */ { // Empty space between instruction lists
- $$ = defineBBVal(ValID::createLocalID(CurFun.NextValNum));
+ $$ = defineBBVal(ValID::createLocalID(CurFun.NextValNum), 0);
+ CHECK_FOR_ERROR
+ }
+ | UNWIND_TO ValueRef { // Only the unwind to block
+ $$ = defineBBVal(ValID::createLocalID(CurFun.NextValNum), getBBVal($2));
CHECK_FOR_ERROR
}
| LABELSTR { // Labelled (named) basic block
- $$ = defineBBVal(ValID::createLocalName(*$1));
+ $$ = defineBBVal(ValID::createLocalName(*$1), 0);
+ delete $1;
+ CHECK_FOR_ERROR
+ }
+ | LABELSTR UNWIND_TO ValueRef {
+ $$ = defineBBVal(ValID::createLocalName(*$1), getBBVal($3));
delete $1;
CHECK_FOR_ERROR
-
};
BBTerminatorInst :