added examples
This commit is contained in:
parent
aae9204863
commit
158a9797ca
|
@ -100,6 +100,12 @@ include_directories(${PROJECT_SOURCE_DIR}/dep/tomlc99)
|
||||||
|
|
||||||
link_libraries(tomlc99)
|
link_libraries(tomlc99)
|
||||||
|
|
||||||
|
# ------------------------------------------------ #
|
||||||
|
# Standard library #
|
||||||
|
# ------------------------------------------------ #
|
||||||
|
|
||||||
|
add_subdirectory(lib)
|
||||||
|
|
||||||
# ------------------------------------------------ #
|
# ------------------------------------------------ #
|
||||||
# LLD-C-Layer #
|
# LLD-C-Layer #
|
||||||
# ------------------------------------------------ #
|
# ------------------------------------------------ #
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
//
|
||||||
|
// Created by servostar on 6/10/24.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
extern void swap(float*, float*);
|
||||||
|
|
||||||
|
int main(int argc, char* argv[]) {
|
||||||
|
float a = 2.0;
|
||||||
|
float b = 7.0;
|
||||||
|
|
||||||
|
swap(&a, &b);
|
||||||
|
|
||||||
|
printf("%f, %f\n", a, b);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
|
||||||
|
fun swap(in out float: a, in out float: b) {
|
||||||
|
float: c = a
|
||||||
|
a = b
|
||||||
|
b = c
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
//
|
||||||
|
// Created by servostar on 6/10/24.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
extern void fib(int*, int);
|
||||||
|
|
||||||
|
int main(int argc, char* argv[]) {
|
||||||
|
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
int r = 0;
|
||||||
|
fib(&r, i);
|
||||||
|
printf("%d\n", r);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
|
||||||
|
fun fib(in int: x, out int: c) {
|
||||||
|
|
||||||
|
int: i = 0
|
||||||
|
int: k = 1
|
||||||
|
int: p = 1
|
||||||
|
|
||||||
|
while x < i {
|
||||||
|
int: t = k
|
||||||
|
k = k + p
|
||||||
|
p = t
|
||||||
|
|
||||||
|
i = i + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
c = k
|
||||||
|
}
|
|
@ -22,4 +22,4 @@ file(GLOB_RECURSE STDLIB_MEM_SOURCE_FILES src/mem/*.c)
|
||||||
add_library(mem ${STDLIB_MEM_SOURCE_FILES})
|
add_library(mem ${STDLIB_MEM_SOURCE_FILES})
|
||||||
|
|
||||||
file(GLOB_RECURSE STDLIB_OS_SOURCE_FILES src/os/*.c)
|
file(GLOB_RECURSE STDLIB_OS_SOURCE_FILES src/os/*.c)
|
||||||
add_library(os ${STDLIB_OS_SOURCE_FILES})
|
add_library(os ${STDLIB_OS_SOURCE_FILES})
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
//
|
||||||
|
// Created by servostar on 6/10/24.
|
||||||
|
//
|
||||||
|
|
||||||
|
extern void entry(void);
|
||||||
|
|
||||||
|
int main(int argc, char* argv[]) {
|
||||||
|
entry();
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -61,8 +61,8 @@ TargetLinkConfig* lld_create_link_config(const Target* target, const TargetConfi
|
||||||
|
|
||||||
{
|
{
|
||||||
// output file after linking
|
// output file after linking
|
||||||
gchar* basename = g_strjoin(".", target_config->name, "out", NULL);
|
basename = g_strjoin(".", target_config->name, "out", NULL);
|
||||||
gchar* filename = g_build_filename(target_config->output_directory, basename, NULL);
|
filename = g_build_filename(target_config->output_directory, basename, NULL);
|
||||||
|
|
||||||
config->output_file = filename;
|
config->output_file = filename;
|
||||||
}
|
}
|
||||||
|
@ -70,6 +70,12 @@ TargetLinkConfig* lld_create_link_config(const Target* target, const TargetConfi
|
||||||
g_array_append_val(config->object_file_names, target_object);
|
g_array_append_val(config->object_file_names, target_object);
|
||||||
INFO("resolved path of target object: %s", target_object);
|
INFO("resolved path of target object: %s", target_object);
|
||||||
|
|
||||||
|
// if it is an app, add entrypoint library
|
||||||
|
if (target_config->mode == Application) {
|
||||||
|
char* entrypoint = g_strdup("libentrypoint.a");
|
||||||
|
g_array_append_val(module->imports, entrypoint);
|
||||||
|
}
|
||||||
|
|
||||||
// resolve absolute paths to dependent library object files
|
// resolve absolute paths to dependent library object files
|
||||||
DEBUG("resolving target dependencies...");
|
DEBUG("resolving target dependencies...");
|
||||||
for (guint i = 0; i < module->imports->len; i++) {
|
for (guint i = 0; i < module->imports->len; i++) {
|
||||||
|
|
|
@ -75,7 +75,7 @@ BackendError impl_logical_operation(LLVMBackendCompileUnit *unit,
|
||||||
LLVMValueRef llvm_rhs = NULL;
|
LLVMValueRef llvm_rhs = NULL;
|
||||||
LLVMValueRef llvm_lhs = NULL;
|
LLVMValueRef llvm_lhs = NULL;
|
||||||
|
|
||||||
if (operation->impl.arithmetic == LogicalNot) {
|
if (operation->impl.logical == LogicalNot) {
|
||||||
// single operand
|
// single operand
|
||||||
rhs = g_array_index(operation->operands, Expression*, 0);
|
rhs = g_array_index(operation->operands, Expression*, 0);
|
||||||
impl_expr(unit, scope, builder, rhs, &llvm_rhs);
|
impl_expr(unit, scope, builder, rhs, &llvm_rhs);
|
||||||
|
@ -354,7 +354,23 @@ BackendError impl_variable_load(LLVMBackendCompileUnit *unit, LLVMLocalScope *sc
|
||||||
return new_backend_impl_error(Implementation, NULL, "Variable not found");
|
return new_backend_impl_error(Implementation, NULL, "Variable not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
*llvm_result = llvm_variable;
|
if (LLVMGetTypeKind(LLVMTypeOf(llvm_variable)) == LLVMPointerTypeKind) {
|
||||||
|
|
||||||
|
Type* type;
|
||||||
|
LLVMTypeRef llvm_type;
|
||||||
|
|
||||||
|
if (variable->kind == VariableKindDefinition) {
|
||||||
|
type = variable->impl.definiton.declaration.type;
|
||||||
|
} else {
|
||||||
|
type = variable->impl.declaration.type;
|
||||||
|
}
|
||||||
|
|
||||||
|
get_type_impl(unit, scope->func_scope->global_scope, type, &llvm_type);
|
||||||
|
|
||||||
|
*llvm_result = LLVMBuildLoad2(builder, llvm_type, llvm_variable, "");
|
||||||
|
} else {
|
||||||
|
*llvm_result = llvm_variable;
|
||||||
|
}
|
||||||
|
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -244,11 +244,13 @@ BackendError parse_module(const Module* module, const TargetConfig* config) {
|
||||||
|
|
||||||
err = export_module(unit, &target, config);
|
err = export_module(unit, &target, config);
|
||||||
if (err.kind == Success) {
|
if (err.kind == Success) {
|
||||||
TargetLinkConfig* link_config = lld_create_link_config(&target, config, module);
|
if (config->mode == Application) {
|
||||||
|
TargetLinkConfig* link_config = lld_create_link_config(&target, config, module);
|
||||||
|
|
||||||
lld_link_target(link_config);
|
lld_link_target(link_config);
|
||||||
|
|
||||||
lld_delete_link_config(link_config);
|
lld_delete_link_config(link_config);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
delete_target(target);
|
delete_target(target);
|
||||||
|
|
Loading…
Reference in New Issue