add Utils::initExternalFunction
This commit is contained in:
@ -15,9 +15,9 @@ add_executable(sysyc
|
||||
sysyc.cpp
|
||||
IR.cpp
|
||||
SysYIRGenerator.cpp
|
||||
Backend.cpp
|
||||
# Backend.cpp
|
||||
# LLVMIRGenerator.cpp
|
||||
LLVMIRGenerator_1.cpp
|
||||
# LLVMIRGenerator_1.cpp
|
||||
)
|
||||
target_include_directories(sysyc PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include)
|
||||
target_compile_options(sysyc PRIVATE -frtti)
|
||||
|
||||
@ -1067,4 +1067,113 @@ void Utils::createExternalFunction(
|
||||
}
|
||||
}
|
||||
|
||||
void Utils::initExternalFunction(Module *pModule, IRBuilder *pBuilder) {
|
||||
std::vector<Type *> paramTypes;
|
||||
std::vector<std::string> paramNames;
|
||||
std::vector<std::vector<Value *>> paramDims;
|
||||
Type *returnType;
|
||||
std::string funcName;
|
||||
|
||||
returnType = Type::getIntType();
|
||||
funcName = "getint";
|
||||
Utils::createExternalFunction(paramTypes, paramNames, paramDims, returnType,
|
||||
funcName, pModule, pBuilder);
|
||||
funcName = "getch";
|
||||
Utils::createExternalFunction(paramTypes, paramNames, paramDims, returnType,
|
||||
funcName, pModule, pBuilder);
|
||||
paramTypes.push_back(Type::getIntType());
|
||||
paramNames.emplace_back("x");
|
||||
paramDims.push_back(std::vector<Value *>{ConstantValue::get(-1)});
|
||||
funcName = "getarray";
|
||||
Utils::createExternalFunction(paramTypes, paramNames, paramDims, returnType,
|
||||
funcName, pModule, pBuilder);
|
||||
|
||||
returnType = Type::getFloatType();
|
||||
paramTypes.clear();
|
||||
paramNames.clear();
|
||||
paramDims.clear();
|
||||
funcName = "getfloat";
|
||||
Utils::createExternalFunction(paramTypes, paramNames, paramDims, returnType,
|
||||
funcName, pModule, pBuilder);
|
||||
|
||||
returnType = Type::getIntType();
|
||||
paramTypes.push_back(Type::getFloatType());
|
||||
paramNames.emplace_back("x");
|
||||
paramDims.push_back(std::vector<Value *>{ConstantValue::get(-1)});
|
||||
funcName = "getfarray";
|
||||
Utils::createExternalFunction(paramTypes, paramNames, paramDims, returnType,
|
||||
funcName, pModule, pBuilder);
|
||||
|
||||
returnType = Type::getVoidType();
|
||||
|
||||
paramTypes.clear();
|
||||
paramTypes.push_back(Type::getIntType());
|
||||
paramDims.clear();
|
||||
paramDims.emplace_back();
|
||||
funcName = "putint";
|
||||
Utils::createExternalFunction(paramTypes, paramNames, paramDims, returnType,
|
||||
funcName, pModule, pBuilder);
|
||||
|
||||
funcName = "putch";
|
||||
Utils::createExternalFunction(paramTypes, paramNames, paramDims, returnType,
|
||||
funcName, pModule, pBuilder);
|
||||
|
||||
paramTypes.clear();
|
||||
paramTypes.push_back(Type::getIntType());
|
||||
paramTypes.push_back(Type::getIntType());
|
||||
paramDims.clear();
|
||||
paramDims.emplace_back();
|
||||
paramDims.push_back(std::vector<Value *>{ConstantValue::get(-1)});
|
||||
paramNames.clear();
|
||||
paramNames.emplace_back("n");
|
||||
paramNames.emplace_back("a");
|
||||
funcName = "putarray";
|
||||
Utils::createExternalFunction(paramTypes, paramNames, paramDims, returnType,
|
||||
funcName, pModule, pBuilder);
|
||||
|
||||
paramTypes.clear();
|
||||
paramTypes.push_back(Type::getFloatType());
|
||||
paramDims.clear();
|
||||
paramDims.emplace_back();
|
||||
paramNames.clear();
|
||||
paramNames.emplace_back("a");
|
||||
funcName = "putfloat";
|
||||
Utils::createExternalFunction(paramTypes, paramNames, paramDims, returnType,
|
||||
funcName, pModule, pBuilder);
|
||||
|
||||
paramTypes.clear();
|
||||
paramTypes.push_back(Type::getIntType());
|
||||
paramTypes.push_back(Type::getFloatType());
|
||||
paramDims.clear();
|
||||
paramDims.emplace_back();
|
||||
paramDims.push_back(std::vector<Value *>{ConstantValue::get(-1)});
|
||||
paramNames.clear();
|
||||
paramNames.emplace_back("n");
|
||||
paramNames.emplace_back("a");
|
||||
funcName = "putfarray";
|
||||
Utils::createExternalFunction(paramTypes, paramNames, paramDims, returnType,
|
||||
funcName, pModule, pBuilder);
|
||||
|
||||
paramTypes.clear();
|
||||
paramTypes.push_back(Type::getIntType());
|
||||
paramDims.clear();
|
||||
paramDims.emplace_back();
|
||||
paramNames.clear();
|
||||
paramNames.emplace_back("__LINE__");
|
||||
funcName = "starttime";
|
||||
Utils::createExternalFunction(paramTypes, paramNames, paramDims, returnType,
|
||||
funcName, pModule, pBuilder);
|
||||
|
||||
paramTypes.clear();
|
||||
paramTypes.push_back(Type::getIntType());
|
||||
paramDims.clear();
|
||||
paramDims.emplace_back();
|
||||
paramNames.clear();
|
||||
paramNames.emplace_back("__LINE__");
|
||||
funcName = "stoptime";
|
||||
Utils::createExternalFunction(paramTypes, paramNames, paramDims, returnType,
|
||||
funcName, pModule, pBuilder);
|
||||
|
||||
}
|
||||
|
||||
} // namespace sysy
|
||||
@ -6,9 +6,9 @@ using namespace std;
|
||||
#include "SysYLexer.h"
|
||||
#include "SysYParser.h"
|
||||
using namespace antlr4;
|
||||
#include "Backend.h"
|
||||
// #include "Backend.h"
|
||||
#include "SysYIRGenerator.h"
|
||||
#include "LLVMIRGenerator.h"
|
||||
// #include "LLVMIRGenerator.h"
|
||||
using namespace sysy;
|
||||
|
||||
static string argStopAfter;
|
||||
@ -78,12 +78,13 @@ int main(int argc, char **argv) {
|
||||
auto moduleIR = generator.get();
|
||||
// moduleIR->print(cout);
|
||||
return EXIT_SUCCESS;
|
||||
} else if (argStopAfter == "llvmir") {
|
||||
LLVMIRGenerator llvmirGenerator;
|
||||
llvmirGenerator.generateIR(moduleAST); // 使用公共接口生成 IR
|
||||
cout << llvmirGenerator.getIR();
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
}
|
||||
// else if (argStopAfter == "llvmir") {
|
||||
// LLVMIRGenerator llvmirGenerator;
|
||||
// llvmirGenerator.generateIR(moduleAST); // 使用公共接口生成 IR
|
||||
// cout << llvmirGenerator.getIR();
|
||||
// return EXIT_SUCCESS;
|
||||
// }
|
||||
|
||||
// // generate assembly
|
||||
// CodeGen codegen(moduleIR);
|
||||
|
||||
Reference in New Issue
Block a user