mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-27 22:09:09 +00:00
LLVM backend: set small string flag on empty string
This commit is contained in:
parent
a481e34f31
commit
c5d0a42c20
2 changed files with 94 additions and 112 deletions
|
@ -15,8 +15,8 @@ use crate::llvm::build_list::{
|
||||||
list_single, list_sort_with, list_sublist, list_swap,
|
list_single, list_sort_with, list_sublist, list_swap,
|
||||||
};
|
};
|
||||||
use crate::llvm::build_str::{
|
use crate::llvm::build_str::{
|
||||||
empty_str, str_concat, str_count_graphemes, str_ends_with, str_from_float, str_from_int,
|
str_concat, str_count_graphemes, str_ends_with, str_from_float, str_from_int, str_from_utf8,
|
||||||
str_from_utf8, str_from_utf8_range, str_join_with, str_number_of_bytes, str_repeat, str_split,
|
str_from_utf8_range, str_join_with, str_number_of_bytes, str_repeat, str_split,
|
||||||
str_starts_with, str_starts_with_code_point, str_to_utf8, str_trim, str_trim_left,
|
str_starts_with, str_starts_with_code_point, str_to_utf8, str_trim, str_trim_left,
|
||||||
str_trim_right,
|
str_trim_right,
|
||||||
};
|
};
|
||||||
|
@ -779,9 +779,6 @@ pub fn build_exp_literal<'a, 'ctx, 'env>(
|
||||||
Bool(b) => env.context.bool_type().const_int(*b as u64, false).into(),
|
Bool(b) => env.context.bool_type().const_int(*b as u64, false).into(),
|
||||||
Byte(b) => env.context.i8_type().const_int(*b as u64, false).into(),
|
Byte(b) => env.context.i8_type().const_int(*b as u64, false).into(),
|
||||||
Str(str_literal) => {
|
Str(str_literal) => {
|
||||||
if str_literal.is_empty() {
|
|
||||||
empty_str(env)
|
|
||||||
} else {
|
|
||||||
let ctx = env.context;
|
let ctx = env.context;
|
||||||
let builder = env.builder;
|
let builder = env.builder;
|
||||||
let number_of_chars = str_literal.len() as u64;
|
let number_of_chars = str_literal.len() as u64;
|
||||||
|
@ -840,9 +837,8 @@ pub fn build_exp_literal<'a, 'ctx, 'env>(
|
||||||
.const_int(*character as u64, false)
|
.const_int(*character as u64, false)
|
||||||
.as_basic_value_enum();
|
.as_basic_value_enum();
|
||||||
let index_val = ctx.i64_type().const_int(index as u64, false);
|
let index_val = ctx.i64_type().const_int(index as u64, false);
|
||||||
let elem_ptr = unsafe {
|
let elem_ptr =
|
||||||
builder.build_in_bounds_gep(array_alloca, &[index_val], "index")
|
unsafe { builder.build_in_bounds_gep(array_alloca, &[index_val], "index") };
|
||||||
};
|
|
||||||
|
|
||||||
builder.build_store(elem_ptr, val);
|
builder.build_store(elem_ptr, val);
|
||||||
}
|
}
|
||||||
|
@ -885,12 +881,7 @@ pub fn build_exp_literal<'a, 'ctx, 'env>(
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
builder.build_bitcast(
|
builder.build_bitcast(struct_val.into_struct_value(), str_type, "cast_collection")
|
||||||
struct_val.into_struct_value(),
|
|
||||||
str_type,
|
|
||||||
"cast_collection",
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -432,12 +432,3 @@ pub fn str_equal<'a, 'ctx, 'env>(
|
||||||
bitcode::STR_EQUAL,
|
bitcode::STR_EQUAL,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO investigate: does this cause problems when the layout is known? this value is now not refcounted!
|
|
||||||
pub fn empty_str<'a, 'ctx, 'env>(env: &Env<'a, 'ctx, 'env>) -> BasicValueEnum<'ctx> {
|
|
||||||
let struct_type = super::convert::zig_str_type(env);
|
|
||||||
|
|
||||||
// The pointer should be null (aka zero) and the length should be zero,
|
|
||||||
// so the whole struct should be a const_zero
|
|
||||||
BasicValueEnum::StructValue(struct_type.const_zero())
|
|
||||||
}
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue