Skip to content

Commit 0a5a208

Browse files
authored
update (#281)
1 parent 3a3e0d2 commit 0a5a208

3 files changed

Lines changed: 57 additions & 14 deletions

File tree

llvm_temporary/src/llvm_temporary/expression/rvalue/binary.rs

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -86,16 +86,42 @@ pub(crate) fn gen<'ctx, 'a>(
8686
result.as_basic_value_enum()
8787
}
8888

89-
(BasicValueEnum::FloatValue(l), BasicValueEnum::FloatValue(r)) => match operator {
90-
Operator::Greater => env.builder.build_float_compare(FloatPredicate::OGT, l, r, "fcmpgt").unwrap().as_basic_value_enum(),
91-
Operator::Less => env.builder.build_float_compare(FloatPredicate::OLT, l, r, "fcmplt").unwrap().as_basic_value_enum(),
92-
Operator::Equal => env.builder.build_float_compare(FloatPredicate::OEQ, l, r, "fcmpeq").unwrap().as_basic_value_enum(),
93-
Operator::NotEqual => env.builder.build_float_compare(FloatPredicate::ONE, l, r, "fcmpne").unwrap().as_basic_value_enum(),
94-
Operator::GreaterEqual => env.builder.build_float_compare(FloatPredicate::OGE, l, r, "fcmpge").unwrap().as_basic_value_enum(),
95-
Operator::LessEqual => env.builder.build_float_compare(FloatPredicate::OLE, l, r, "fcmple").unwrap().as_basic_value_enum(),
96-
Operator::Remainder => env.builder.build_float_rem(l, r, "modtmp").unwrap().as_basic_value_enum(),
97-
_ => panic!("Unsupported float operator"),
98-
},
89+
(BasicValueEnum::FloatValue(l), BasicValueEnum::FloatValue(r)) => {
90+
let mut result: BasicValueEnum<'ctx> = match operator {
91+
Operator::Add => env.builder.build_float_add(l, r, "faddtmp").unwrap().as_basic_value_enum(),
92+
Operator::Subtract => env.builder.build_float_sub(l, r, "fsubtmp").unwrap().as_basic_value_enum(),
93+
Operator::Multiply => env.builder.build_float_mul(l, r, "fmultmp").unwrap().as_basic_value_enum(),
94+
Operator::Divide => env.builder.build_float_div(l, r, "fdivtmp").unwrap().as_basic_value_enum(),
95+
Operator::Remainder => env.builder.build_float_rem(l, r, "fmodtmp").unwrap().as_basic_value_enum(),
96+
97+
Operator::Greater => env.builder.build_float_compare(FloatPredicate::OGT, l, r, "fcmpgt").unwrap().as_basic_value_enum(),
98+
Operator::Less => env.builder.build_float_compare(FloatPredicate::OLT, l, r, "fcmplt").unwrap().as_basic_value_enum(),
99+
Operator::Equal => env.builder.build_float_compare(FloatPredicate::OEQ, l, r, "fcmpeq").unwrap().as_basic_value_enum(),
100+
Operator::NotEqual => env.builder.build_float_compare(FloatPredicate::ONE, l, r, "fcmpne").unwrap().as_basic_value_enum(),
101+
Operator::GreaterEqual => env.builder.build_float_compare(FloatPredicate::OGE, l, r, "fcmpge").unwrap().as_basic_value_enum(),
102+
Operator::LessEqual => env.builder.build_float_compare(FloatPredicate::OLE, l, r, "fcmple").unwrap().as_basic_value_enum(),
103+
104+
_ => panic!("Unsupported float operator"),
105+
};
106+
107+
if let Some(exp) = expected_type {
108+
match (result, exp) {
109+
(BasicValueEnum::FloatValue(fv), inkwell::types::BasicTypeEnum::FloatType(target_ty)) => {
110+
if fv.get_type() != target_ty {
111+
result = env.builder.build_float_cast(fv, target_ty, "fcast_result").unwrap().as_basic_value_enum();
112+
}
113+
}
114+
(BasicValueEnum::IntValue(iv), inkwell::types::BasicTypeEnum::IntType(target_ty)) => {
115+
if iv.get_type() != target_ty {
116+
result = env.builder.build_int_cast(iv, target_ty, "icast_result").unwrap().as_basic_value_enum();
117+
}
118+
}
119+
_ => {}
120+
}
121+
}
122+
123+
result
124+
}
99125

100126
(BasicValueEnum::IntValue(int_val), BasicValueEnum::FloatValue(float_val)) => {
101127
let casted = env

llvm_temporary/src/llvm_temporary/expression/rvalue/variables.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,26 @@ pub(crate) fn gen<'ctx, 'a>(
2929

3030
if let Some(et) = expected_type {
3131
if et.is_pointer_type() {
32+
// ptr: i8**
33+
let loaded = env
34+
.builder
35+
.build_load(ptr, &format!("load_{}", var_name))
36+
.unwrap();
37+
3238
let expected_ptr = et.into_pointer_type();
33-
if ptr.get_type() != expected_ptr {
39+
if loaded.get_type() != BasicTypeEnum::from(expected_ptr) {
3440
return env
3541
.builder
36-
.build_bit_cast(ptr, expected_ptr, &format!("{}_as_ptr", var_name))
42+
.build_bit_cast(
43+
loaded,
44+
expected_ptr,
45+
&format!("{}_as_ptr", var_name),
46+
)
3747
.unwrap()
3848
.as_basic_value_enum();
3949
}
40-
return ptr.as_basic_value_enum();
50+
51+
return loaded;
4152
}
4253
}
4354

llvm_temporary/src/llvm_temporary/llvm_backend.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,13 @@ use std::process::Command;
55
pub fn compile_ir_to_object(ir: &str, file_stem: &str, opt_flag: &str) -> String {
66
let object_path = format!("target/{}.o", file_stem);
77

8-
let mut child = Command::new("clang")
8+
let mut cmd = Command::new("clang");
9+
10+
if !opt_flag.is_empty() {
11+
cmd.arg(opt_flag);
12+
}
13+
14+
let mut child = cmd
915
.arg(opt_flag)
1016
.arg("-c")
1117
.arg("-x")

0 commit comments

Comments
 (0)