mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
Check arguments & return types of main(). Abort in case of no match.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37404 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
bec7647f98
commit
499d8f0c3b
@ -231,7 +231,39 @@ int ExecutionEngine::runFunctionAsMain(Function *Fn,
|
||||
std::vector<GenericValue> GVArgs;
|
||||
GenericValue GVArgc;
|
||||
GVArgc.IntVal = APInt(32, argv.size());
|
||||
|
||||
// Check main() type
|
||||
unsigned NumArgs = Fn->getFunctionType()->getNumParams();
|
||||
const FunctionType *FTy = Fn->getFunctionType();
|
||||
const Type* PPInt8Ty = PointerType::get(PointerType::get(Type::Int8Ty));
|
||||
switch (NumArgs) {
|
||||
case 3:
|
||||
if (FTy->getParamType(2) != PPInt8Ty) {
|
||||
cerr << "Invalid type for third argument of main() supplied\n";
|
||||
abort();
|
||||
}
|
||||
case 2:
|
||||
if (FTy->getParamType(1) != PPInt8Ty) {
|
||||
cerr << "Invalid type for second argument of main() supplied\n";
|
||||
abort();
|
||||
}
|
||||
case 1:
|
||||
if (FTy->getParamType(0) != Type::Int32Ty) {
|
||||
cerr << "Invalid type for first argument of main() supplied\n";
|
||||
abort();
|
||||
}
|
||||
case 0:
|
||||
if (FTy->getReturnType() != Type::Int32Ty &&
|
||||
FTy->getReturnType() != Type::VoidTy) {
|
||||
cerr << "Invalid return type of main() supplied\n";
|
||||
abort();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
cerr << "Invalid number of arguments of main() supplied\n";
|
||||
abort();
|
||||
}
|
||||
|
||||
if (NumArgs) {
|
||||
GVArgs.push_back(GVArgc); // Arg #0 = argc.
|
||||
if (NumArgs > 1) {
|
||||
|
Loading…
Reference in New Issue
Block a user