From d90330af3f06ece00d0658a9f3ae866c0f7516a2 Mon Sep 17 00:00:00 2001 From: rain2133 <1370973498@qq.com> Date: Sun, 22 Jun 2025 14:14:02 +0800 Subject: [PATCH] add Utils::initExternalFunction --- src/CMakeLists.txt | 4 +- src/SysYIRGenerator.cpp | 109 ++++++++++++++++++++++++++++++++++++++++ src/sysyc.cpp | 17 ++++--- 3 files changed, 120 insertions(+), 10 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e8c78f6..6bfd3e4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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) diff --git a/src/SysYIRGenerator.cpp b/src/SysYIRGenerator.cpp index 7e4ed85..1718aba 100644 --- a/src/SysYIRGenerator.cpp +++ b/src/SysYIRGenerator.cpp @@ -1067,4 +1067,113 @@ void Utils::createExternalFunction( } } +void Utils::initExternalFunction(Module *pModule, IRBuilder *pBuilder) { + std::vector paramTypes; + std::vector paramNames; + std::vector> 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{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{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{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{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 \ No newline at end of file diff --git a/src/sysyc.cpp b/src/sysyc.cpp index 40116e1..0f01099 100644 --- a/src/sysyc.cpp +++ b/src/sysyc.cpp @@ -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);