diff --git a/src/irgen/IRGenExp.cpp b/src/irgen/IRGenExp.cpp index 7ff3ba50..76136c75 100644 --- a/src/irgen/IRGenExp.cpp +++ b/src/irgen/IRGenExp.cpp @@ -656,9 +656,16 @@ std::any IRGenImpl::visitUnaryExp(SysYParser::UnaryExpContext* ctx) { } } + if (callee_name == "starttime" || callee_name == "stoptime") { + int lineno = ctx->getStart()->getLine(); + args.push_back(static_cast(builder_.CreateConstInt(lineno))); + } + if (args.size() != func_it->second->GetParams().size()) { - throw std::runtime_error( - FormatError("irgen", "函数参数个数不匹配: " + callee_name)); + if (callee_name != "starttime" && callee_name != "stoptime") { + throw std::runtime_error( + FormatError("irgen", "函数参数个数不匹配: " + callee_name)); + } } for (size_t i = 0; i < args.size(); ++i) { args[i] = CastValueTo(args[i], func_it->second->GetParams()[i]->GetType()); diff --git a/src/irgen/IRGenFunc.cpp b/src/irgen/IRGenFunc.cpp index 21ca2631..9c6c1342 100644 --- a/src/irgen/IRGenFunc.cpp +++ b/src/irgen/IRGenFunc.cpp @@ -119,9 +119,11 @@ std::any IRGenImpl::visitCompUnit(SysYParser::CompUnitContext* ctx) { auto* putch = module_.CreateFunction("putch", ir::Type::GetVoidType(), true); putch->AddParam("%arg.x", ir::Type::GetInt32Type()); function_map_["putch"] = putch; - auto* sysy_starttime = module_.CreateFunction("starttime", ir::Type::GetVoidType(), true); + auto* sysy_starttime = module_.CreateFunction("_sysy_starttime", ir::Type::GetVoidType(), true); + sysy_starttime->AddParam("%arg.lineno", ir::Type::GetInt32Type()); function_map_["starttime"] = sysy_starttime; - auto* sysy_stoptime = module_.CreateFunction("stoptime", ir::Type::GetVoidType(), true); + auto* sysy_stoptime = module_.CreateFunction("_sysy_stoptime", ir::Type::GetVoidType(), true); + sysy_stoptime->AddParam("%arg.lineno", ir::Type::GetInt32Type()); function_map_["stoptime"] = sysy_stoptime; SysYParser::FuncDefContext* main_func = nullptr;