33 static void names_reset(
names_t *names)
55 static char *name_increment(
names_t *names,
const void *obj,
char *existing,
arena_t *arena)
58 if (name != NULL) {
return name; }
82 static char *get_anon_name(
emit_t *emit,
const void *symbol,
const char *prefix)
86 if (name != NULL) {
return name; }
95 return get_anon_name(emit, symbol, prefix);
100 return get_anon_name(emit, local, prefix);
118 for (
size_t i = 0; i < len; i++)
131 char *params = params_to_string(closure.
params, arena);
133 return str_format(arena,
"closure(result: %s, params: [%s], variadic: %s)", result, params, closure.
variadic ?
"true" :
"false");
141 case 0:
return str_format(arena,
"ptr(%s)", pointee);
142 case SIZE_MAX:
return str_format(arena,
"unbounded-ptr(%s)", pointee);
143 default:
return str_format(arena,
"ptr(%s of %zu)", pointee, pointer.
length);
151 for (
size_t i = 0; i < len; i++)
157 char *joined =
str_join(
", ", fields, arena);
158 return str_format(arena,
"record(fields: [%s])", joined);
165 for (
size_t i = 0; i < len; i++)
172 char *joined =
str_join(
", ", variants, arena);
173 return str_format(arena,
"enum(variants: [%s])", joined);
180 case eTypeEmpty:
return "empty";
181 case eTypeUnit:
return "unit";
182 case eTypeBool:
return "bool";
183 case eTypeOpaque:
return "opaque";
184 case eTypeEnum:
return enum_to_string(type->
sum, arena);
185 case eTypeDigit:
return digit_to_string(type->
digit, arena);
186 case eTypeClosure:
return closure_to_string(type->
closure, arena);
187 case eTypePointer:
return pointer_to_string(type->
pointer, arena);
188 case eTypeStruct:
return record_to_string(type->
record, arena);
CT_FS_API os_error_t fs_dir_create(fs_t *fs, const char *path)
create a directory create a directory and all child directories inside a filesystem
CT_NODISCARD CT_STD_API map_t * map_optimal(size_t size, hash_info_t info, arena_t *arena)
create a new map with an optimal size
CT_STD_API void map_reset(map_t *map)
clear all key-value pairs from a map
CT_STD_API void map_set(map_t *map, const void *key, void *value)
set a key-value pair in a map
CT_NODISCARD CT_PUREFN CT_STD_API void * map_get(const map_t *map, const void *key)
get a value from a map
#define CT_NEVER(...)
assert that a code path is never reached
CT_NODISCARD CT_STD_API char * str_replace(const char *str, const char *search, const char *repl, arena_t *arena)
replace all instances of a substring in a string
CT_NODISCARD CT_STD_API char * str_join(const char *sep, const vector_t *parts, arena_t *arena)
join strings
CT_NODISCARD CT_PUREFN CT_STD_API bool str_contains(const char *str, const char *search)
check if a string contains a substring
CT_TREE_API const char * sign_name(sign_t sign)
get the pretty name of a integer sign
CT_TREE_API const char * digit_name(digit_t digit)
get the pretty name of a digit
CT_STD_API const hash_info_t kTypeInfoPtr
type information for a generic pointer this operates on the pointer itself and not the data it points...
CT_NODISCARD CT_PUREFN CT_STD_API size_t typevec_len(const typevec_t *vec)
get the length of a vector
CT_NODISCARD CT_PUREFN CT_STD_API void * typevec_offset(const typevec_t *vec, size_t index)
get a pointer to the value at the given index
CT_NODISCARD CT_STD_API vector_t * vector_of(size_t len, arena_t *arena)
create a new vector with a specified length
CT_STD_API void vector_set(vector_t *vector, size_t index, void *value)
set a value in a vector
STA_DECL char * str_format(arena_t *arena, const char *fmt,...)
target code emitter options
arena_t * arena
arena to use
const ssa_type_t * result
const ssa_type_t * pointer
ssa_type_closure_t closure
ssa_type_pointer_t pointer
A vector with a fixed type size.
a generic vector of pointers
char * get_anon_symbol_name(emit_t *emit, const ssa_symbol_t *symbol, const char *prefix)
void counter_reset(emit_t *emit)
names_t names_new(size_t size, arena_t *arena)
char * begin_module(emit_t *emit, fs_t *fs, const ssa_module_t *mod)
char * get_step_name(emit_t *emit, const ssa_step_t *step)
char * get_anon_local_name(emit_t *emit, const ssa_local_t *local, const char *prefix)
char * get_block_name(emit_t *emit, const ssa_block_t *block)
char * get_step_from_block(emit_t *emit, const ssa_block_t *block, size_t index)
const char * type_to_string(const ssa_type_t *type, arena_t *arena)
CT_LOCAL char * c89_format_integer_literal(arena_t *arena, const mpz_t value)