diff options
author | Chris Lattner <sabre@nondot.org> | 2004-07-14 19:33:47 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-07-14 19:33:47 +0000 |
commit | d9ce6adfcc77a576d1f2a33f92f110d38f2e23da (patch) | |
tree | 11bd8871d459932f8872881bd4e0cd54457c1c77 | |
parent | 5f8cce13486dd9c5e7374c5e467750298791bac8 (diff) |
Fix a regression from last night. Apparently the CFE is broken and outputs
functions multiple times, expecting them to be merged. This should be fixed
in the CFE, then here.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14823 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/AsmParser/llvmAsmParser.y | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y index 4dece6e21c..72c5b014ad 100644 --- a/lib/AsmParser/llvmAsmParser.y +++ b/lib/AsmParser/llvmAsmParser.y @@ -1551,14 +1551,24 @@ FunctionHeaderH : TypesV Name '(' ArgList ')' { const PointerType *PFT = PointerType::get(FT); delete $1; + Function *Fn = 0; // Is the function already in symtab? - if (CurModule.CurrentModule->getFunction(FunctionName, FT)) - ThrowException("Redefinition of function '" + FunctionName + "'!"); + if ((Fn = CurModule.CurrentModule->getFunction(FunctionName, FT))) { + // Yes it is. If this is the case, either we need to be a forward decl, + // or it needs to be. + if (!CurFun.isDeclare && !Fn->isExternal()) + ThrowException("Redefinition of function '" + FunctionName + "'!"); + + // Make sure to strip off any argument names so we can't get conflicts... + for (Function::aiterator AI = Fn->abegin(), AE = Fn->aend(); AI != AE; ++AI) + AI->setName(""); - Function *Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName, - CurModule.CurrentModule); - InsertValue(Fn, CurModule.Values); - CurModule.DeclareNewGlobalValue(Fn, ValID::create($2)); + } else { // Not already defined? + Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName, + CurModule.CurrentModule); + InsertValue(Fn, CurModule.Values); + CurModule.DeclareNewGlobalValue(Fn, ValID::create($2)); + } free($2); // Free strdup'd memory! CurFun.FunctionStart(Fn); |