Codegen change, remove typedefs, use standard
This commit is contained in:
@@ -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("}");
|
||||
|
||||
Reference in New Issue
Block a user