about summary refs log tree commit diff
path: root/src/bootstrap/codegen.pry
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootstrap/codegen.pry')
-rw-r--r--src/bootstrap/codegen.pry27
1 files changed, 26 insertions, 1 deletions
diff --git a/src/bootstrap/codegen.pry b/src/bootstrap/codegen.pry
index 57f5472..be2ee5c 100644
--- a/src/bootstrap/codegen.pry
+++ b/src/bootstrap/codegen.pry
@@ -95,6 +95,7 @@ let codegen = struct {
 	whil_block: LLVMBasicBlockRef,
 	current_function: LLVMValueRef,
 	current_function_retur_type: *Node,
+	llvm_target_data: LLVMTargetDataRef,
 };
 
 let codegen_init = (alloc: *arena) => *codegen {
@@ -111,6 +112,7 @@ let codegen_init = (alloc: *arena) => *codegen {
 	let c = cast(*codegen, arena_alloc(alloc, sizeof(codegen)));
 	
 	(*c).llvm_module = module;
+	(*c).llvm_target_data = LLVMGetModuleDataLayout(module);
 	(*c).llvm_context = context;
 	(*c).builder = builder;
 	(*c).arena = alloc;
@@ -693,7 +695,6 @@ let codegen_generate_expression_value = (c: *codegen, expression: *Node, name: *
 		v.stack_level = cast(*i64, null);
 		v.node = expression;
 		v.node_type = expression;
-		printf("RET\n");
 		return codegen_create_variable(c, v);
 	};
 	
@@ -713,6 +714,30 @@ let codegen_generate_expression_value = (c: *codegen, expression: *Node, name: *
 		v.node_type = exp.typ;
 		return codegen_create_variable(c, v);
 	};
+	
+	if ((*expression).type == NODE_SIZEOF_STATEMENT) {
+		let exp = *cast(*NODE_SIZEOF_STATEMENT_DATA, (*expression).data);
+		let typ = codegen_get_llvm_type(c, exp.typ);
+		assert(typ != cast(*LLVMTypeRef, null));
+		let size_in_bytes = LLVMStoreSizeOfType((*c).llvm_target_data, *typ);
+		let size_val = LLVMConstInt(LLVMInt64Type(), size_in_bytes, 0);
+
+		let node_type = Node{};
+		node_type.type = NODE_TYPE_SIMPLE_TYPE;
+
+		let d = cast(*NODE_TYPE_SIMPLE_TYPE_DATA, arena_alloc((*c).arena, sizeof(NODE_TYPE_SIMPLE_TYPE_DATA)));
+		(*d).name = "i64";
+		(*d).underlying_type = cast(*Node, null);
+		node_type.data = cast(*void, d);
+
+		let v = Variable{};
+		v.value = size_val;
+		v.type = cast(LLVMTypeRef, null);
+		v.stack_level = cast(*i64, null);
+		v.node = expression;
+		v.node_type = create_node(c, node_type);
+		return codegen_create_variable(c, v);
+	};
 
 	printf("ASSERT 1: %d\n", (*expression).type);
 	assert(false);