1 #include "codegen/CodeGen.h"
5 #include "ast/AstNode.h"
14 semantic::NameResolver& nr)
15 : ctx{ctx}, cu{cu}, nr{nr} {
16 arrayType = tir::StructType::get(ctx,
18 tir::
Type::getInt32Ty(ctx),
20 tir::
Type::getPointerTy(ctx)});
23 tir::
Type* CG::emitType(ast::
Type const* type) {
24 using Kind = ast::BuiltInType::Kind;
25 if(isAstTypeReference(type)) {
26 return tir::
Type::getPointerTy(ctx);
27 }
else if(type->isPrimitive()) {
28 auto ty = cast<ast::BuiltInType>(type);
29 switch(ty->getKind()) {
31 return tir::
Type::getInt1Ty(ctx);
33 return tir::
Type::getInt16Ty(ctx);
35 return tir::
Type::getInt16Ty(ctx);
37 return tir::
Type::getInt32Ty(ctx);
39 return tir::
Type::getInt8Ty(ctx);
43 }
else if(type->isArray()) {
49 void CG::run(ast::LinkingUnit
const* lu) {
50 for(
auto* cu : lu->compliationUnits()) {
51 for(
auto* decl : cu->decls()) {
52 if(
auto* classDecl = dyn_cast<ast::ClassDecl>(decl)) {
53 emitClassDecl(classDecl);
57 for(
auto* cu : lu->compliationUnits()) {
58 for(
auto* decl : cu->decls()) {
59 if(
auto* classDecl = dyn_cast<ast::ClassDecl>(decl)) {
66 tir::
Value* CG::emitGetArraySz(tir::
Value* ptr) {
68 auto zero =
Constant::CreateInt32(ctx, 0);
69 auto gepSz = builder.createGEPInstr(ptr, arrayType, {zero});
70 gepSz->setName(
"arr.gep.sz");
71 auto sz = builder.createLoadInstr(Type::getInt32Ty(ctx), gepSz);
72 sz->setName(
"arr.sz");
76 tir::
Value* CG::emitGetArrayPtr(tir::
Value* ptr) {
78 auto one =
Constant::CreateInt32(ctx, 1);
79 auto gepPtr = builder.createGEPInstr(ptr, arrayType, {one});
80 gepPtr->setName(
"arr.gep.ptr");
81 auto arrPtr = builder.createLoadInstr(Type::getPointerTy(ctx), gepPtr);
82 arrPtr->setName(
"arr.ptr");
86 void CG::emitSetArraySz(tir::
Value* ptr, tir::
Value* sz) {
88 auto zero =
Constant::CreateInt32(ctx, 0);
89 auto gepSz = builder.createGEPInstr(ptr, arrayType, {zero});
90 gepSz->setName(
"arr.gep.sz");
91 builder.createStoreInstr(sz, gepSz);
94 void CG::emitSetArrayPtr(tir::
Value* ptr, tir::
Value* arr) {
96 auto one =
Constant::CreateInt32(ctx, 1);
97 auto gepPtr = builder.createGEPInstr(ptr, arrayType, {one});
98 gepPtr->setName(
"arr.gep.ptr");
99 builder.createStoreInstr(arr, gepPtr);