summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/VMCore/Verifier.cpp14
1 files changed, 12 insertions, 2 deletions
diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp
index e2d6b63..2e92c26 100644
--- a/lib/VMCore/Verifier.cpp
+++ b/lib/VMCore/Verifier.cpp
@@ -112,12 +112,18 @@ namespace { // Anonymous namespace for class
bool doFinalization(Module &M) {
// Scan through, checking all of the external function's linkage now...
- for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
+ for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
visitGlobalValue(*I);
+ // Check to make sure function prototypes are okay.
+ if (I->isExternal()) visitFunction(*I);
+ }
+
for (Module::giterator I = M.gbegin(), E = M.gend(); I != E; ++I)
visitGlobalValue(*I);
+
+
// If the module is broken, abort at this time.
abortIfBroken();
return false;
@@ -284,10 +290,14 @@ void Verifier::visitFunction(Function &F) {
// Check that the argument values match the function type for this function...
unsigned i = 0;
- for (Function::aiterator I = F.abegin(), E = F.aend(); I != E; ++I, ++i)
+ for (Function::aiterator I = F.abegin(), E = F.aend(); I != E; ++I, ++i) {
Assert2(I->getType() == FT->getParamType(i),
"Argument value does not match function argument type!",
I, FT->getParamType(i));
+ // Make sure no aggregates are passed by value.
+ Assert1(I->getType()->isFirstClassType(),
+ "Functions cannot take aggregates as arguments by value!", I);
+ }
if (!F.isExternal()) {
verifySymbolTable(F.getSymbolTable());