at least everything compiles

This commit is contained in:
ridethepig 2023-05-08 21:16:16 +08:00
parent 4458c23fc7
commit 4706c79a6d
4 changed files with 26 additions and 15 deletions

View File

@ -303,8 +303,7 @@ public:
}
else {
LOG(WARNING) << "Unexpected pointer type" << pointer->to_string();
aim_to = pointer;
panic("message");
aim_to = nullptr;
}
element_type = extract_type(pointer, indices);
operand_list.push_back(pointer);

View File

@ -65,7 +65,7 @@ class Compiler:
Print_C.print_procedure(f"Generating {self.scheme}.ll")
completed = subprocess.run(frontend_instr.format(header=header, sy=sy, ir=ir).split(), stdout=log_file, stderr=log_file, bufsize=1)
if completed.returncode != 0:
Print_C.print_error(f"Generating {self.scheme}.ll failed! See {log}")
Print_C.print_error(f"Generating {self.scheme}.ll failed! See {log} | {sy}")
self.count_error += 1
log_file.close()
@ -145,7 +145,7 @@ class Compiler:
for testcase in self.testcases:
Print_C.print_subheader(f"[Compiling {self.scheme} | {testcase}]")
self.sy_to_ir(frontend_instr=frontend_instr, testcase=testcase, category=category)
if self.count_error >= 5:
if self.count_error >= 1:
Print_C.print_error(f"Test script stopped due to too many errors")
return

View File

@ -34,8 +34,8 @@ class Tester:
def compile(self):
self.compiler.compile_all_tests(frontend_instr=self.frontend_instr, emit_llvm_ir=self.emit_llvm_ir)
def compile_rubbish(self):
self.compiler.compile_rubbish(frontend_instr=self.frontend_instr, category="functional")
def compile_rubbish(self, category):
self.compiler.compile_rubbish(frontend_instr=self.frontend_instr, category=category)
def run(self):
self.runner.run_all_tests()
@ -103,7 +103,7 @@ my_scheme = {"scheme": "my",
if __name__ == '__main__':
testcases = get_sy_testcases(sub_dir="functional")
testcases = get_sy_testcases(sub_dir="functional_test")
all_schemes = [clang_llvm_scheme, thu_llvm_scheme, thu_thu_scheme] # gcc_gcc_scheme, ustc_ustc_scheme, ustc_ustc_no_vec_scheme]
testers = []
Print_C.print_header("[Removing old data...]\n\n")
@ -113,7 +113,7 @@ if __name__ == '__main__':
subprocess.run("rm -rf build/log/run_log".split())
subprocess.run("rm -rf build/log/test_result.log".split())
Tester(my_scheme, True, testcases).compile_rubbish()
Tester(my_scheme, True, testcases).compile_rubbish(category="functional_test")
# for scheme in all_schemes:
# tester = Tester(scheme, is_trivial=True)

View File

@ -683,13 +683,13 @@ std::any Visitor::visitNumber(SysyParser::NumberContext *ctx) {
std::any Visitor::visitIntConst(SysyParser::IntConstContext *ctx) {
int const_int = 0;
if (ctx->DECIMAL_CONST()) {
const_int = std::stoi(ctx->DECIMAL_CONST()->getText(), nullptr, 10);
const_int = std::stol(ctx->DECIMAL_CONST()->getText(), nullptr, 10);
}
else if (ctx->HEXADECIMAL_CONST()) {
const_int = std::stoi(ctx->HEXADECIMAL_CONST()->getText(), nullptr, 16);
const_int = std::stol(ctx->HEXADECIMAL_CONST()->getText(), nullptr, 16);
}
else if (ctx->OCTAL_CONST()) {
const_int = std::stoi(ctx->OCTAL_CONST()->getText(), nullptr, 8);
const_int = std::stol(ctx->OCTAL_CONST()->getText(), nullptr, 8);
}
return build_ConstantInt("", const_int);
}
@ -730,6 +730,7 @@ std::any Visitor::visitLVal(SysyParser::LValContext *ctx) {
}
};
case Type::TypeTag::PointerType: {
sysy_assert(0);
if (ctx->exp().empty()) {
// ??? Pointer
// @retval: InstLoad
@ -743,6 +744,7 @@ std::any Visitor::visitLVal(SysyParser::LValContext *ctx) {
auto pointed_type = std::dynamic_pointer_cast<PointerType>(lval->type)->pointed_type;
auto inst_load = build_InstLoad(lval, pointed_type, _state.current_bb);
LOG(INFO) << lval->to_string() << " " << lval->type->to_string();
auto ptr = build_InstGEP(inst_load, {CONST0}, _state.current_bb);
pointed_type = std::dynamic_pointer_cast<PointerType>(ptr->type)->pointed_type;
LOG(INFO) << pointed_type->to_string();
@ -778,7 +780,11 @@ std::any Visitor::visitLVal(SysyParser::LValContext *ctx) {
}
}
case Type::TypeTag::ArrayType: {
sysy_assert(!ctx->exp().empty());
if (ctx->exp().empty()) {
// passing an array to function
auto ptr = build_InstGEP(lval, {CONST0, CONST0}, _state.current_bb);
return ptr;
}
// get &array[0]
auto ptr = build_InstGEP(lval, {CONST0, CONST0}, _state.current_bb);
auto pointed_type = std::dynamic_pointer_cast<PointerType>(ptr->type)->pointed_type;
@ -806,7 +812,12 @@ std::any Visitor::visitLVal(SysyParser::LValContext *ctx) {
return arr_elem_ptr;
}
else {
panic("Should be int");
// return the address of an sub array
auto array_type = std::dynamic_pointer_cast<ArrayType>(pointed_type);
auto dim_size = ConstantInt::make_shared(array_type->element_count);
auto inst_mul = build_InstBinary(InstTag::Mul, offset, dim_size, _state.current_bb);
auto arr_elem_ptr = build_InstGEP(ptr, {CONST0, offset}, _state.current_bb);
return arr_elem_ptr;
}
}
default:
@ -879,8 +890,9 @@ std::any Visitor::visitFuncFParam(SysyParser::FuncFParamContext *ctx) {
dim_list.push_back(exp_val->value);
}
auto array_type = ArrayType::build_from_list(dim_list);
auto true_array_type = std::make_shared<PointerType>(array_type);
return {true_array_type};
// auto true_array_type = std::make_shared<PointerType>(array_type);
// return {true_array_type};
return {array_type};
}
}