Codegen change, remove typedefs, use standard

This commit is contained in:
Krzosa Karol
2022-10-01 16:42:03 +02:00
parent 3623ecce00
commit c85f16f673
3 changed files with 50 additions and 44 deletions

View File

@@ -58,6 +58,31 @@ unique_name(Allocator *allocator, Ast *ast){
return result;
}
function const char *
get_ctype_name_for_type(Ast_Type *type){
switch(type->kind){
case TYPE_VOID: return "void";
case TYPE_BOOL: return "bool";
case TYPE_STRING: return "String";
case TYPE_CHAR: return "char";
case TYPE_F32: return "float";
case TYPE_F64: return "double";
case TYPE_INT: return "int";
case TYPE_S8: return "int8_t";
case TYPE_S16: return "int16_t";
case TYPE_S32: return "int32_t";
case TYPE_S64: return "int64_t";
case TYPE_U8: return "uint8_t";
case TYPE_U16: return "uint16_t";
case TYPE_U32: return "uint32_t";
case TYPE_U64: return "uint64_t";
case TYPE_TUPLE: return "Tuple";
case TYPE_TYPE: return "int64_t";
invalid_default_case;
}
return "<unknown_type>";
}
function String
string_simple_decl_prefix(Allocator *a, Ast_Type *ast){
switch(ast->kind){
@@ -88,7 +113,7 @@ string_simple_decl_prefix(Allocator *a, Ast_Type *ast){
return string_fmt(a, "%Q%Q", sc, string);
}break;
default: {
String string = string_fmt(a, "%s ", name(ast));
String string = string_fmt(a, "%s ", get_ctype_name_for_type(ast));
return string;
}
}
@@ -199,7 +224,7 @@ gen_value(Token *pos, Value a){
}break;
case TYPE_STRING:{
int length = 0;
gen("(String){(U8 *)\"");
gen("(String){(uint8_t *)\"");
for(int i = 0; i < a.intern_val.len; i++){
if(a.intern_val.str[i] == '\n'){length += 2; gen("\\n");}
else if(a.intern_val.str[i] == '\r'){length += 2; gen("\\r");}
@@ -500,8 +525,8 @@ gen_ast(Ast *ast){
switch(ast->kind){
CASE(RUNTIME_ASSERT, Builtin){
if(node->assert_message.len == 0) gen("assert");
else gen("assert_msg");
if(node->assert_message.len == 0) gen("CORE_Assert");
else gen("CORE_AssertMessage");
gen("(");
gen_expr(node->expr);
if(node->assert_message.len){
@@ -597,9 +622,9 @@ gen_ast(Ast *ast){
// Array iter
if(node->is_array_traversal){
gen("for(S64 _i%d = 0; _i%d < ", node->pos->line, node->pos->line);
gen("for(int64_t _i%d = 0; _i%d < ", node->pos->line, node->pos->line);
if(is_array(node->cond->resolved_type)){
gen("_buff_cap(");
gen("CORE_BufferSize(");
gen_expr(node->cond);
gen(")");
} else{
@@ -759,34 +784,14 @@ compile_to_c_code(){
gen(R"==(
#include <stdint.h>
#include <math.h>
#include <stdbool.h>
#include <string.h>
typedef int8_t S8;
typedef int16_t S16;
typedef int32_t S32;
typedef int64_t S64;
typedef uint8_t U8;
typedef uint16_t U16;
typedef uint32_t U32;
typedef uint64_t U64;
typedef S8 B8;
typedef S16 B16;
typedef S32 B32;
typedef S64 B64;
typedef U64 SizeU;
typedef S64 SizeS;
typedef float F32;
typedef double F64;
typedef S32 Bool;
typedef S64 Type;
#define true 1
#define false 0
#define assert(x) do{if(!(x))__debugbreak();}while(0)
#define assert_msg(x,...) assert(x)
#define _buff_cap(x) (sizeof(x)/sizeof((x)[0]))
#define CORE_Assert(x) do{if(!(x))__debugbreak();}while(0)
#define CORE_AssertMessage(x,...) CORE_Assert(x)
#define CORE_BufferSize(x) (sizeof(x)/sizeof((x)[0]))
typedef struct String{
U8 *str;
S64 len;
uint8_t *str;
int64_t len;
}String;
)==");
@@ -806,7 +811,7 @@ typedef struct String{
if(type->kind == TYPE_SLICE){
genln("typedef struct Slice%llu{", type->type_id);
global_indent++;
genln("S64 len;");
genln("int64_t len;");
genln("");
gen_simple_decl(type_pointer(type->base), pctx->intern("data"_s));
gen(";");
@@ -865,7 +870,7 @@ typedef struct String{
}
// Generate type info
genln("S64 type_infos_len = %d;", length(&pctx->all_types));
genln("int64_t type_infos_len = %d;", length(&pctx->all_types));
genln("Type_Info *type_infos = (Type_Info[]){");
global_indent++;
Iter(&pctx->all_types){
@@ -894,7 +899,7 @@ typedef struct String{
gen(".struct_member_count = %d, ", t->agg.members.len);
gen(".struct_members = (Type_Info_Struct_Member[]){");
For_Named(t->agg.members, m){
gen("{.name = (String){(U8 *)\"%Q\", %d}, .type = %d, .offset = %d}, ", m.name, m.name.len, m.type->type_id, m.offset);
gen("{.name = (String){(uint8_t *)\"%Q\", %d}, .type = %d, .offset = %d}, ", m.name, m.name.len, m.type->type_id, m.offset);
}
gen("}");