Browse Source

Implement constant value generation from ExactValue

gingerBill 5 years ago
parent
commit
d56807095a
5 changed files with 952 additions and 194 deletions
  1. 32 17
      examples/llvm-demo/demo.odin
  2. 0 28
      src/ir.cpp
  3. 1 2
      src/ir_print.cpp
  4. 891 147
      src/llvm_backend.cpp
  5. 28 0
      src/types.cpp

+ 32 - 17
examples/llvm-demo/demo.odin

@@ -2,29 +2,44 @@ package demo
 
 import "core:os"
 
+// Foo :: struct {
+// 	x, y: int,
+// };
+// foo :: proc(x: int) -> (f: Foo) {
+// 	return;
+// }
+
 main :: proc() {
-	Foo :: struct {
-		x, y: int,
-	};
+	Foo :: enum {A=1, B, C, D};
+	Foo_Set :: bit_set[Foo];
+	x := Foo_Set{.A, .C};
+
+	y := [4]int{3 = 1, 0 .. 1 = 3, 2 = 9};
+	z := []int{1, 2, 3, 4};
+
+	// @thread_local a: int;
+
+	// x := i32(1);
+	// y := i32(2);
+	// z := x + y;
+	// w := z - 2;
 
-	x := i32(1);
-	y := i32(2);
-	z := x + y;
-	w := z - 2;
+	// foo(123);
 
 
-	c := 1 + 2i;
-	q := 1 + 2i + 3j + 4k;
+	// c := 1 + 2i;
+	// q := 1 + 2i + 3j + 4k;
 
-	s := "Hellope";
+	// s := "Hellope";
 
-	f: Foo;
-	pc: proc "contextless" (x: i32) -> Foo;
-	po: proc "odin" (x: i32) -> Foo;
-	e: enum{A, B, C};
-	u: union{i32, bool};
-	u1: union{i32};
-	um: union #maybe {^int};
+	// f := Foo{1, 2};
+	// pc: proc "contextless" (x: i32) -> Foo;
+	// po: proc "odin" (x: i32) -> Foo;
+	// e: enum{A, B, C};
+	// u: union{i32, bool};
+	// u1: union{i32};
+	// um: union #maybe {^int};
 
 	// os.write_string(os.stdout, "Hellope\n");
+	return;
 }

+ 0 - 28
src/ir.cpp

@@ -5911,34 +5911,6 @@ irValue *ir_type_info(irProcedure *proc, Type *type) {
 	return ir_emit_array_ep(proc, ir_global_type_info_data, ir_const_i32(id));
 }
 
-// IMPORTANT NOTE(bill): This must match the same as the in core.odin
-enum Typeid_Kind : u8 {
-	Typeid_Invalid,
-	Typeid_Integer,
-	Typeid_Rune,
-	Typeid_Float,
-	Typeid_Complex,
-	Typeid_Quaternion,
-	Typeid_String,
-	Typeid_Boolean,
-	Typeid_Any,
-	Typeid_Type_Id,
-	Typeid_Pointer,
-	Typeid_Procedure,
-	Typeid_Array,
-	Typeid_Enumerated_Array,
-	Typeid_Dynamic_Array,
-	Typeid_Slice,
-	Typeid_Tuple,
-	Typeid_Struct,
-	Typeid_Union,
-	Typeid_Enum,
-	Typeid_Map,
-	Typeid_Bit_Field,
-	Typeid_Bit_Set,
-};
-
-
 irValue *ir_typeid(irModule *m, Type *type) {
 	type = default_type(type);
 

+ 1 - 2
src/ir_print.cpp

@@ -1014,8 +1014,7 @@ void ir_print_exact_value(irFileBuffer *f, irModule *m, ExactValue value, Type *
 		} else if (is_type_enumerated_array(type)) {
 			ast_node(cl, CompoundLit, value.value_compound);
 
-			Type *index_type = type->EnumeratedArray.elem;
-			Type *elem_type = type->Array.elem;
+			Type *elem_type = type->EnumeratedArray.elem;
 			isize elem_count = cl->elems.count;
 			if (elem_count == 0) {
 				ir_write_str_lit(f, "zeroinitializer");

File diff suppressed because it is too large
+ 891 - 147
src/llvm_backend.cpp


+ 28 - 0
src/types.cpp

@@ -305,6 +305,34 @@ struct Type {
 	bool failure;
 };
 
+// IMPORTANT NOTE(bill): This must match the same as the in core.odin
+enum Typeid_Kind : u8 {
+	Typeid_Invalid,
+	Typeid_Integer,
+	Typeid_Rune,
+	Typeid_Float,
+	Typeid_Complex,
+	Typeid_Quaternion,
+	Typeid_String,
+	Typeid_Boolean,
+	Typeid_Any,
+	Typeid_Type_Id,
+	Typeid_Pointer,
+	Typeid_Procedure,
+	Typeid_Array,
+	Typeid_Enumerated_Array,
+	Typeid_Dynamic_Array,
+	Typeid_Slice,
+	Typeid_Tuple,
+	Typeid_Struct,
+	Typeid_Union,
+	Typeid_Enum,
+	Typeid_Map,
+	Typeid_Bit_Field,
+	Typeid_Bit_Set,
+};
+
+
 
 
 // TODO(bill): Should I add extra information here specifying the kind of selection?

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