mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-21 03:32:21 +00:00
Add 'pedantic' mode to verifier rejecting syntactically valid, but 'bad' due to other reasons code
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@43424 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5973ef40ca
commit
536c64b4d6
@ -60,6 +60,7 @@
|
|||||||
#include "llvm/ADT/SmallVector.h"
|
#include "llvm/ADT/SmallVector.h"
|
||||||
#include "llvm/ADT/StringExtras.h"
|
#include "llvm/ADT/StringExtras.h"
|
||||||
#include "llvm/ADT/STLExtras.h"
|
#include "llvm/ADT/STLExtras.h"
|
||||||
|
#include "llvm/Support/CommandLine.h"
|
||||||
#include "llvm/Support/Compiler.h"
|
#include "llvm/Support/Compiler.h"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@ -67,7 +68,10 @@
|
|||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
namespace { // Anonymous namespace for class
|
namespace { // Anonymous namespace for class
|
||||||
|
cl::opt<bool>
|
||||||
|
Pedantic("pedantic",
|
||||||
|
cl::desc("Reject code with undefined behaviour"));
|
||||||
|
|
||||||
struct VISIBILITY_HIDDEN
|
struct VISIBILITY_HIDDEN
|
||||||
Verifier : public FunctionPass, InstVisitor<Verifier> {
|
Verifier : public FunctionPass, InstVisitor<Verifier> {
|
||||||
static char ID; // Pass ID, replacement for typeid
|
static char ID; // Pass ID, replacement for typeid
|
||||||
@ -806,10 +810,17 @@ void Verifier::visitCallInst(CallInst &CI) {
|
|||||||
"Call parameter type does not match function signature!",
|
"Call parameter type does not match function signature!",
|
||||||
CI.getOperand(i+1), FTy->getParamType(i), &CI);
|
CI.getOperand(i+1), FTy->getParamType(i), &CI);
|
||||||
|
|
||||||
if (Function *F = CI.getCalledFunction())
|
if (Function *F = CI.getCalledFunction()) {
|
||||||
|
if (Pedantic) {
|
||||||
|
// Verify that calling convention of Function and CallInst match
|
||||||
|
Assert1(F->getCallingConv() == CI.getCallingConv(),
|
||||||
|
"Call uses different calling convention than function", &CI);
|
||||||
|
}
|
||||||
|
|
||||||
if (Intrinsic::ID ID = (Intrinsic::ID)F->getIntrinsicID())
|
if (Intrinsic::ID ID = (Intrinsic::ID)F->getIntrinsicID())
|
||||||
visitIntrinsicFunctionCall(ID, CI);
|
visitIntrinsicFunctionCall(ID, CI);
|
||||||
|
}
|
||||||
|
|
||||||
visitInstruction(CI);
|
visitInstruction(CI);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user