diff options
author | Chris Lattner <sabre@nondot.org> | 2004-06-03 06:38:43 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-06-03 06:38:43 +0000 |
commit | f75832b0155c4027497cb7a39c941af04cf1edcd (patch) | |
tree | e12a0dfc43eba0f8dd78b2fca27420f7436d55ba /llvm/lib/VMCore/Verifier.cpp | |
parent | 6973e85b162181794086b68b77f1e368f0b37ff2 (diff) | |
download | bcm5719-llvm-f75832b0155c4027497cb7a39c941af04cf1edcd.tar.gz bcm5719-llvm-f75832b0155c4027497cb7a39c941af04cf1edcd.zip |
* Verify function prototypes, not just functions with bodies.
* Verify that functions do not take aggregates as arguments.
llvm-svn: 13984
Diffstat (limited to 'llvm/lib/VMCore/Verifier.cpp')
-rw-r--r-- | llvm/lib/VMCore/Verifier.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/llvm/lib/VMCore/Verifier.cpp b/llvm/lib/VMCore/Verifier.cpp index e2d6b63b690..2e92c26d4e9 100644 --- a/llvm/lib/VMCore/Verifier.cpp +++ b/llvm/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()); |