aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/AsmParser/llvmAsmParser.y84
1 files changed, 42 insertions, 42 deletions
diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y
index 71da575..f71fa58 100644
--- a/lib/AsmParser/llvmAsmParser.y
+++ b/lib/AsmParser/llvmAsmParser.y
@@ -1210,50 +1210,50 @@ FunctionHeaderH : OptInternal TypesV FuncName '(' ArgList ')' {
string FunctionName($3);
vector<const Type*> ParamTypeList;
- if ($5)
+ if ($5) { // If there are arguments...
for (vector<pair<PATypeHolder*,char*> >::iterator I = $5->begin();
I != $5->end(); ++I)
ParamTypeList.push_back(I->first->get());
+ }
bool isVarArg = ParamTypeList.size() && ParamTypeList.back() == Type::VoidTy;
if (isVarArg) ParamTypeList.pop_back();
- const FunctionType *MT = FunctionType::get(*$2, ParamTypeList, isVarArg);
- const PointerType *PMT = PointerType::get(MT);
+ const FunctionType *FT = FunctionType::get(*$2, ParamTypeList, isVarArg);
+ const PointerType *PFT = PointerType::get(FT);
delete $2;
- Function *M = 0;
- if (SymbolTable *ST = CurModule.CurrentModule->getSymbolTable()) {
- // Is the function already in symtab?
- if (Value *V = ST->lookup(PMT, FunctionName)) {
- M = cast<Function>(V);
-
- // Yes it is. If this is the case, either we need to be a forward decl,
- // or it needs to be.
- if (!CurMeth.isDeclare && !M->isExternal())
- ThrowException("Redefinition of function '" + FunctionName + "'!");
-
- // Make sure that we keep track of the internal marker, even if there was
- // a previous "declare".
- if ($1)
- M->setInternalLinkage(true);
-
- // If we found a preexisting function prototype, remove it from the
- // module, so that we don't get spurious conflicts with global & local
- // variables.
- //
- CurModule.CurrentModule->getFunctionList().remove(M);
- }
- }
+ Function *Fn = 0;
+ // Is the function already in symtab?
+ 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 (!CurMeth.isDeclare && !Fn->isExternal())
+ ThrowException("Redefinition of function '" + FunctionName + "'!");
+
+ // Make sure that we keep track of the internal marker, even if there was
+ // a previous "declare".
+ if ($1)
+ Fn->setInternalLinkage(true);
+
+ // If we found a preexisting function prototype, remove it from the
+ // module, so that we don't get spurious conflicts with global & local
+ // variables.
+ //
+ CurModule.CurrentModule->getFunctionList().remove(Fn);
+
+ // 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("");
- if (M == 0) { // Not already defined?
- M = new Function(MT, $1, FunctionName);
- InsertValue(M, CurModule.Values);
- CurModule.DeclareNewGlobalValue(M, ValID::create($3));
+ } else { // Not already defined?
+ Fn = new Function(FT, $1, FunctionName);
+ InsertValue(Fn, CurModule.Values);
+ CurModule.DeclareNewGlobalValue(Fn, ValID::create($3));
}
free($3); // Free strdup'd memory!
- CurMeth.FunctionStart(M);
+ CurMeth.FunctionStart(Fn);
// Add all of the arguments we parsed to the function...
if ($5) { // Is null if empty...
@@ -1263,7 +1263,7 @@ FunctionHeaderH : OptInternal TypesV FuncName '(' ArgList ')' {
delete $5->back().first;
$5->pop_back(); // Delete the last entry
}
- Function::aiterator ArgIt = M->abegin();
+ Function::aiterator ArgIt = Fn->abegin();
for (vector<pair<PATypeHolder*, char*> >::iterator I = $5->begin();
I != $5->end(); ++I, ++ArgIt) {
delete I->first; // Delete the typeholder...
@@ -1411,11 +1411,11 @@ BBTerminatorInst : RET ResolvedVal { // Return with a result...
}
| INVOKE TypesV ValueRef '(' ValueRefListE ')' TO ResolvedVal
EXCEPT ResolvedVal {
- const PointerType *PMTy;
+ const PointerType *PFTy;
const FunctionType *Ty;
- if (!(PMTy = dyn_cast<PointerType>($2->get())) ||
- !(Ty = dyn_cast<FunctionType>(PMTy->getElementType()))) {
+ if (!(PFTy = dyn_cast<PointerType>($2->get())) ||
+ !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
// Pull out the types of all of the arguments...
vector<const Type*> ParamTypes;
if ($5) {
@@ -1427,11 +1427,11 @@ BBTerminatorInst : RET ResolvedVal { // Return with a result...
if (isVarArg) ParamTypes.pop_back();
Ty = FunctionType::get($2->get(), ParamTypes, isVarArg);
- PMTy = PointerType::get(Ty);
+ PFTy = PointerType::get(Ty);
}
delete $2;
- Value *V = getVal(PMTy, $3); // Get the function we're calling...
+ Value *V = getVal(PFTy, $3); // Get the function we're calling...
BasicBlock *Normal = dyn_cast<BasicBlock>($8);
BasicBlock *Except = dyn_cast<BasicBlock>($10);
@@ -1570,11 +1570,11 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
delete $2; // Free the list...
}
| CALL TypesV ValueRef '(' ValueRefListE ')' {
- const PointerType *PMTy;
+ const PointerType *PFTy;
const FunctionType *Ty;
- if (!(PMTy = dyn_cast<PointerType>($2->get())) ||
- !(Ty = dyn_cast<FunctionType>(PMTy->getElementType()))) {
+ if (!(PFTy = dyn_cast<PointerType>($2->get())) ||
+ !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
// Pull out the types of all of the arguments...
vector<const Type*> ParamTypes;
if ($5) {
@@ -1586,11 +1586,11 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
if (isVarArg) ParamTypes.pop_back();
Ty = FunctionType::get($2->get(), ParamTypes, isVarArg);
- PMTy = PointerType::get(Ty);
+ PFTy = PointerType::get(Ty);
}
delete $2;
- Value *V = getVal(PMTy, $3); // Get the function we're calling...
+ Value *V = getVal(PFTy, $3); // Get the function we're calling...
// Create the call node...
if (!$5) { // Has no arguments?