Browse Source

Get basic IR code generation working properly

gingerBill 5 years ago
parent
commit
bfda101686
3 changed files with 603 additions and 108 deletions
  1. 3 2
      src/checker.cpp
  2. 581 95
      src/llvm_backend.cpp
  3. 19 11
      src/llvm_backend.hpp

+ 3 - 2
src/checker.cpp

@@ -1625,6 +1625,7 @@ void add_dependency_to_set(Checker *c, Entity *entity) {
 	if (decl == nullptr) {
 		return;
 	}
+
 	for_array(i, decl->type_info_deps.entries) {
 		Type *type = decl->type_info_deps.entries[i].ptr;
 		add_min_dep_type_info(c, type);
@@ -1670,8 +1671,8 @@ void generate_minimum_dependency_set(Checker *c, Entity *start) {
 		str_lit("type_table"),
 		str_lit("__type_info_of"),
 		str_lit("default_temp_allocator"),
-		str_lit("default_temp_allocator_init"),
-		str_lit("default_temp_allocator_destroy"),
+		// str_lit("default_temp_allocator_init"),
+		// str_lit("default_temp_allocator_destroy"),
 		str_lit("default_temp_allocator_proc"),
 
 		str_lit("Type_Info"),

File diff suppressed because it is too large
+ 581 - 95
src/llvm_backend.cpp


+ 19 - 11
src/llvm_backend.hpp

@@ -55,8 +55,9 @@ struct lbModule {
 
 	Map<LLVMTypeRef> types; // Key: Type *
 
-	Map<lbValue> values; // Key: Entity *
-	Map<lbValue> members; // Key: String
+	Map<lbValue>  values;           // Key: Entity *
+	Map<lbValue>  members;          // Key: String
+	Map<Entity *> procedure_values; // Key: LLVMValueRef
 
 	Map<lbValue> const_strings; // Key: String
 	Map<lbValue> const_string_byte_slices; // Key: String
@@ -222,6 +223,8 @@ LLVMTypeRef lb_addr_lb_type(lbAddr const &addr);
 void lb_addr_store(lbProcedure *p, lbAddr const &addr, lbValue value);
 lbValue lb_addr_load(lbProcedure *p, lbAddr const &addr);
 lbValue lb_emit_load(lbProcedure *p, lbValue v);
+void lb_emit_store(lbProcedure *p, lbValue ptr, lbValue value);
+
 
 void    lb_build_stmt(lbProcedure *p, Ast *stmt);
 lbValue lb_build_expr(lbProcedure *p, Ast *expr);
@@ -233,30 +236,35 @@ lbValue lb_build_gep(lbProcedure *p, lbValue const &value, i32 index) ;
 lbValue lb_emit_struct_ep(lbProcedure *p, lbValue s, i32 index);
 lbValue lb_emit_struct_ev(lbProcedure *p, lbValue s, i32 index);
 lbValue lb_emit_array_epi(lbProcedure *p, lbValue value, i32 index);
-
+lbValue lb_emit_array_ep(lbProcedure *p, lbValue s, lbValue index);
+lbValue lb_emit_deep_field_gep(lbProcedure *p, lbValue e, Selection sel);
 
 lbValue lb_emit_arith(lbProcedure *p, TokenKind op, lbValue lhs, lbValue rhs, Type *type);
-
+lbValue lb_emit_byte_swap(lbProcedure *p, lbValue value, Type *platform_type);
 void lb_emit_defer_stmts(lbProcedure *p, lbDeferExitKind kind, lbBlock *block);
-
+lbValue lb_emit_transmute(lbProcedure *p, lbValue value, Type *t);
+lbValue lb_emit_comp(lbProcedure *p, TokenKind op_kind, lbValue left, lbValue right);
+lbValue lb_emit_call(lbProcedure *p, lbValue value, Array<lbValue> const &args, ProcInlining inlining = ProcInlining_none, bool use_return_ptr_hint = false);
 lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t);
+
 lbValue lb_build_call_expr(lbProcedure *p, Ast *expr);
 
 
-lbAddr lb_add_global_generated(lbModule *m, Type *type, lbValue value={});
+lbAddr lb_find_or_generate_context_ptr(lbProcedure *p);
+void lb_push_context_onto_stack(lbProcedure *p, lbAddr ctx);
 
-lbAddr lb_add_local(lbProcedure *p, Type *type, Entity *e=nullptr, bool zero_init=true, i32 param_index=0);
 
-lbValue lb_emit_transmute(lbProcedure *p, lbValue value, Type *t);
+lbAddr lb_add_global_generated(lbModule *m, Type *type, lbValue value={});
+lbAddr lb_add_local(lbProcedure *p, Type *type, Entity *e=nullptr, bool zero_init=true, i32 param_index=0);
 
-lbValue lb_emit_comp(lbProcedure *p, TokenKind op_kind, lbValue left, lbValue right);
-lbValue lb_emit_call(lbProcedure *p, lbValue value, Array<lbValue> const &args, ProcInlining inlining = ProcInlining_none, bool use_return_ptr_hint = false);
 
 lbValue lb_typeid(lbModule *m, Type *type, Type *typeid_type=t_typeid);
 
 lbValue lb_address_from_load_or_generate_local(lbProcedure *p, lbValue value);
-
 lbDefer lb_add_defer_node(lbProcedure *p, isize scope_index, Ast *stmt);
+lbAddr lb_add_local_generated(lbProcedure *p, Type *type, bool zero_init);
+
+lbValue lb_emit_runtime_call(lbProcedure *p, char const *c_name, Array<lbValue> const &args);
 
 
 enum lbCallingConventionKind {

Some files were not shown because too many files changed in this diff