mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Add memory-env option.
This commit is contained in:
committed by
Christoffer Lerno
parent
6a73c8e90e
commit
6eb65d5b37
@@ -11,6 +11,14 @@ enum CompilerOptLevel
|
|||||||
O3
|
O3
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum MemoryEnvironment
|
||||||
|
{
|
||||||
|
NORMAL,
|
||||||
|
SMALL,
|
||||||
|
TINY,
|
||||||
|
NONE
|
||||||
|
}
|
||||||
|
|
||||||
enum OsType
|
enum OsType
|
||||||
{
|
{
|
||||||
UNKNOWN,
|
UNKNOWN,
|
||||||
@@ -51,9 +59,9 @@ enum OsType
|
|||||||
EMSCRIPTEN,
|
EMSCRIPTEN,
|
||||||
}
|
}
|
||||||
|
|
||||||
const OsType OS_TYPE = (OsType)($$OS_TYPE);
|
const OsType OS_TYPE = (OsType)$$OS_TYPE;
|
||||||
const bool COMPILER_LIBC_AVAILABLE = $$COMPILER_LIBC_AVAILABLE;
|
const bool COMPILER_LIBC_AVAILABLE = $$COMPILER_LIBC_AVAILABLE;
|
||||||
const CompilerOptLevel COMPILER_OPT_LEVEL = (CompilerOptLevel)($$COMPILER_OPT_LEVEL);
|
const CompilerOptLevel COMPILER_OPT_LEVEL = (CompilerOptLevel)$$COMPILER_OPT_LEVEL;
|
||||||
const bool BIG_ENDIAN = $$PLATFORM_BIG_ENDIAN;
|
const bool BIG_ENDIAN = $$PLATFORM_BIG_ENDIAN;
|
||||||
const bool I128_NATIVE_SUPPORT = $$PLATFORM_I128_SUPPORTED;
|
const bool I128_NATIVE_SUPPORT = $$PLATFORM_I128_SUPPORTED;
|
||||||
const bool F16_SUPPORT = $$PLATFORM_F16_SUPPORTED;
|
const bool F16_SUPPORT = $$PLATFORM_F16_SUPPORTED;
|
||||||
@@ -62,7 +70,7 @@ const bool COMPILER_SAFE_MODE = $$COMPILER_SAFE_MODE;
|
|||||||
const usz LLVM_VERSION = $$LLVM_VERSION;
|
const usz LLVM_VERSION = $$LLVM_VERSION;
|
||||||
const bool BENCHMARKING = $$BENCHMARKING;
|
const bool BENCHMARKING = $$BENCHMARKING;
|
||||||
const bool TESTING = $$TESTING;
|
const bool TESTING = $$TESTING;
|
||||||
const usz TEMP_ALLOCATOR_SIZE = 128 * 1024;
|
const MemoryEnvironment MEMORY_ENV = (MemoryEnvironment)$$MEMORY_ENVIRONMENT;
|
||||||
|
|
||||||
macro bool os_is_posix()
|
macro bool os_is_posix()
|
||||||
{
|
{
|
||||||
@@ -86,4 +94,5 @@ macro bool os_is_posix()
|
|||||||
$echo("Assuming non-Posix environment");
|
$echo("Assuming non-Posix environment");
|
||||||
return false;
|
return false;
|
||||||
$endswitch;
|
$endswitch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -275,7 +275,16 @@ macro TempAllocator* temp_allocator()
|
|||||||
{
|
{
|
||||||
if (!thread_temp_allocator)
|
if (!thread_temp_allocator)
|
||||||
{
|
{
|
||||||
thread_temp_allocator = allocator::new_temp(env::TEMP_ALLOCATOR_SIZE, allocator::LIBC_ALLOCATOR)!!;
|
$switch (env::MEMORY_ENV):
|
||||||
|
$case NORMAL:
|
||||||
|
thread_temp_allocator = allocator::new_temp(1024 * 256, allocator::LIBC_ALLOCATOR)!!;
|
||||||
|
$case SMALL:
|
||||||
|
thread_temp_allocator = allocator::new_temp(1024 * 16, allocator::LIBC_ALLOCATOR)!!;
|
||||||
|
$case TINY:
|
||||||
|
thread_temp_allocator = allocator::new_temp(1024 * 4, allocator::LIBC_ALLOCATOR)!!;
|
||||||
|
$case NONE:
|
||||||
|
unreachable("Temp allocator must explicitly created when memory-env is set to 'none'.");
|
||||||
|
$endswitch;
|
||||||
}
|
}
|
||||||
return thread_temp_allocator;
|
return thread_temp_allocator;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,6 +131,7 @@ static void usage(void)
|
|||||||
OUTPUT("");
|
OUTPUT("");
|
||||||
OUTPUT(" --reloc=<option> - Relocation model: none, pic, PIC, pie, PIE.");
|
OUTPUT(" --reloc=<option> - Relocation model: none, pic, PIC, pie, PIE.");
|
||||||
OUTPUT(" --x86vec=<option> - Set max level of vector instructions: none, native, mmx, sse, avx, avx512.");
|
OUTPUT(" --x86vec=<option> - Set max level of vector instructions: none, native, mmx, sse, avx, avx512.");
|
||||||
|
OUTPUT(" --memory-env=<option> - Set the memory environment: normal, small, tiny, none.");
|
||||||
OUTPUT("");
|
OUTPUT("");
|
||||||
OUTPUT(" --debug-stats - Print debug statistics.");
|
OUTPUT(" --debug-stats - Print debug statistics.");
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
@@ -546,6 +547,11 @@ static void parse_option(BuildOptions *options)
|
|||||||
options->x86_vector_capability = (X86VectorCapability)parse_multi_option(argopt, 6, vector_capability);
|
options->x86_vector_capability = (X86VectorCapability)parse_multi_option(argopt, 6, vector_capability);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if ((argopt = match_argopt("memory-env")))
|
||||||
|
{
|
||||||
|
options->memory_environment = (MemoryEnvironment )parse_multi_option(argopt, 4, memory_environment);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if ((argopt = match_argopt("reloc")))
|
if ((argopt = match_argopt("reloc")))
|
||||||
{
|
{
|
||||||
options->reloc_model = (RelocModel)parse_multi_option(argopt, 5, reloc_models);
|
options->reloc_model = (RelocModel)parse_multi_option(argopt, 5, reloc_models);
|
||||||
@@ -839,6 +845,7 @@ BuildOptions parse_arguments(int argc, const char *argv[])
|
|||||||
.reloc_model = RELOC_DEFAULT,
|
.reloc_model = RELOC_DEFAULT,
|
||||||
.backend = BACKEND_LLVM,
|
.backend = BACKEND_LLVM,
|
||||||
.x86_vector_capability = X86VECTOR_DEFAULT,
|
.x86_vector_capability = X86VECTOR_DEFAULT,
|
||||||
|
.memory_environment = MEMORY_ENV_NOT_SET,
|
||||||
.win.crt_linking = WIN_CRT_DEFAULT,
|
.win.crt_linking = WIN_CRT_DEFAULT,
|
||||||
.files = NULL,
|
.files = NULL,
|
||||||
.build_dir = NULL,
|
.build_dir = NULL,
|
||||||
|
|||||||
@@ -147,6 +147,7 @@ typedef enum
|
|||||||
X86VECTOR_NATIVE = 5,
|
X86VECTOR_NATIVE = 5,
|
||||||
} X86VectorCapability;
|
} X86VectorCapability;
|
||||||
|
|
||||||
|
|
||||||
static const char *vector_capability[6] = {
|
static const char *vector_capability[6] = {
|
||||||
[X86VECTOR_NONE] = "none",
|
[X86VECTOR_NONE] = "none",
|
||||||
[X86VECTOR_MMX] = "mmx",
|
[X86VECTOR_MMX] = "mmx",
|
||||||
@@ -156,6 +157,22 @@ static const char *vector_capability[6] = {
|
|||||||
[X86VECTOR_NATIVE] = "native"
|
[X86VECTOR_NATIVE] = "native"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MEMORY_ENV_NOT_SET = -1,
|
||||||
|
MEMORY_ENV_NORMAL = 0,
|
||||||
|
MEMORY_ENV_SMALL = 1,
|
||||||
|
MEMORY_ENV_TINY = 2,
|
||||||
|
MEMORY_ENV_NONE = 3,
|
||||||
|
} MemoryEnvironment;
|
||||||
|
|
||||||
|
static const char *memory_environment[6] = {
|
||||||
|
[MEMORY_ENV_NORMAL] = "normal",
|
||||||
|
[MEMORY_ENV_SMALL] = "small",
|
||||||
|
[MEMORY_ENV_TINY] = "tiny",
|
||||||
|
[MEMORY_ENV_NONE] = "none",
|
||||||
|
};
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
WIN_CRT_DEFAULT = -1,
|
WIN_CRT_DEFAULT = -1,
|
||||||
@@ -284,6 +301,7 @@ typedef struct BuildOptions_
|
|||||||
const char *obj_out;
|
const char *obj_out;
|
||||||
RelocModel reloc_model;
|
RelocModel reloc_model;
|
||||||
X86VectorCapability x86_vector_capability;
|
X86VectorCapability x86_vector_capability;
|
||||||
|
MemoryEnvironment memory_environment;
|
||||||
bool print_keywords;
|
bool print_keywords;
|
||||||
bool print_attributes;
|
bool print_attributes;
|
||||||
bool print_builtins;
|
bool print_builtins;
|
||||||
@@ -365,6 +383,7 @@ typedef struct
|
|||||||
bool no_entry;
|
bool no_entry;
|
||||||
int build_threads;
|
int build_threads;
|
||||||
OptimizationLevel optimization_level;
|
OptimizationLevel optimization_level;
|
||||||
|
MemoryEnvironment memory_environment;
|
||||||
SizeOptimizationLevel size_optimization_level;
|
SizeOptimizationLevel size_optimization_level;
|
||||||
bool single_module;
|
bool single_module;
|
||||||
DebugInfo debug_info;
|
DebugInfo debug_info;
|
||||||
|
|||||||
@@ -196,6 +196,10 @@ static void update_build_target_from_options(BuildTarget *target, BuildOptions *
|
|||||||
{
|
{
|
||||||
target->feature.safe_mode = options->safe_mode == 1;
|
target->feature.safe_mode = options->safe_mode == 1;
|
||||||
}
|
}
|
||||||
|
if (options->memory_environment != MEMORY_ENV_NOT_SET)
|
||||||
|
{
|
||||||
|
target->memory_environment = options->memory_environment;
|
||||||
|
}
|
||||||
if (options->debug_info_override != DEBUG_INFO_NOT_SET)
|
if (options->debug_info_override != DEBUG_INFO_NOT_SET)
|
||||||
{
|
{
|
||||||
target->debug_info = options->debug_info_override;
|
target->debug_info = options->debug_info_override;
|
||||||
@@ -301,6 +305,7 @@ void init_default_build_target(BuildTarget *target, BuildOptions *options)
|
|||||||
.source_dirs = options->files,
|
.source_dirs = options->files,
|
||||||
.name = options->output_name,
|
.name = options->output_name,
|
||||||
.optimization_level = OPTIMIZATION_DEFAULT,
|
.optimization_level = OPTIMIZATION_DEFAULT,
|
||||||
|
.memory_environment = MEMORY_ENV_NORMAL,
|
||||||
.size_optimization_level = SIZE_OPTIMIZATION_NONE,
|
.size_optimization_level = SIZE_OPTIMIZATION_NONE,
|
||||||
.symtab_size = options->symtab_size ? options->symtab_size : DEFAULT_SYMTAB_SIZE,
|
.symtab_size = options->symtab_size ? options->symtab_size : DEFAULT_SYMTAB_SIZE,
|
||||||
.switchrange_max_size = DEFAULT_SWITCHRANGE_MAX_SIZE,
|
.switchrange_max_size = DEFAULT_SWITCHRANGE_MAX_SIZE,
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ const char *project_default_keys[] = {
|
|||||||
"link-args",
|
"link-args",
|
||||||
"linked-libraries",
|
"linked-libraries",
|
||||||
"macossdk",
|
"macossdk",
|
||||||
|
"memory-env",
|
||||||
"no-entry",
|
"no-entry",
|
||||||
"nolibc",
|
"nolibc",
|
||||||
"nostdlib",
|
"nostdlib",
|
||||||
@@ -62,6 +63,7 @@ const char* project_target_keys[] = {
|
|||||||
"link-args-override",
|
"link-args-override",
|
||||||
"link-args-add",
|
"link-args-add",
|
||||||
"macossdk",
|
"macossdk",
|
||||||
|
"memory-env",
|
||||||
"nolibc",
|
"nolibc",
|
||||||
"nostdlib",
|
"nostdlib",
|
||||||
"panicfn",
|
"panicfn",
|
||||||
@@ -289,6 +291,9 @@ static void load_into_build_target(JSONObject *json, const char *type, BuildTarg
|
|||||||
DebugInfo info = get_valid_string_setting(json, "debug-info", type, debug_infos, 0, 3, "one of 'full' 'line-table' or 'none'.");
|
DebugInfo info = get_valid_string_setting(json, "debug-info", type, debug_infos, 0, 3, "one of 'full' 'line-table' or 'none'.");
|
||||||
if (info > -1) target->debug_info = info;
|
if (info > -1) target->debug_info = info;
|
||||||
|
|
||||||
|
MemoryEnvironment env = get_valid_string_setting(json, "memory-env", type, memory_environment, 0, 4, "one of 'normal', 'small', 'tiny' or 'none'.");
|
||||||
|
if (env > -1) target->memory_environment = env;
|
||||||
|
|
||||||
// Symtab
|
// Symtab
|
||||||
long symtab_size = get_valid_integer(json, "symtab", type, false);
|
long symtab_size = get_valid_integer(json, "symtab", type, false);
|
||||||
if (symtab_size > 0)
|
if (symtab_size > 0)
|
||||||
@@ -409,6 +414,7 @@ static void project_add_targets(Project *project, JSONObject *project_data)
|
|||||||
|
|
||||||
BuildTarget default_target = {
|
BuildTarget default_target = {
|
||||||
.optimization_level = OPTIMIZATION_DEFAULT,
|
.optimization_level = OPTIMIZATION_DEFAULT,
|
||||||
|
.memory_environment = MEMORY_ENV_NORMAL,
|
||||||
.size_optimization_level = SIZE_OPTIMIZATION_NONE,
|
.size_optimization_level = SIZE_OPTIMIZATION_NONE,
|
||||||
.arch_os_target = ARCH_OS_TARGET_DEFAULT,
|
.arch_os_target = ARCH_OS_TARGET_DEFAULT,
|
||||||
.debug_info = DEBUG_INFO_NONE,
|
.debug_info = DEBUG_INFO_NONE,
|
||||||
|
|||||||
@@ -551,9 +551,11 @@ static void setup_int_define(const char *id, uint64_t i, Type *type)
|
|||||||
{
|
{
|
||||||
TokenType token_type = TOKEN_CONST_IDENT;
|
TokenType token_type = TOKEN_CONST_IDENT;
|
||||||
id = symtab_add(id, (uint32_t) strlen(id), fnv1a(id, (uint32_t) strlen(id)), &token_type);
|
id = symtab_add(id, (uint32_t) strlen(id), fnv1a(id, (uint32_t) strlen(id)), &token_type);
|
||||||
assert(type_is_integer(type));
|
Type *flat = type_flatten(type);
|
||||||
Expr *expr = expr_new_const_int(INVALID_SPAN, type, i, true);
|
assert(type_is_integer(flat));
|
||||||
if (expr_const_will_overflow(&expr->const_expr, type->type_kind))
|
Expr *expr = expr_new_const_int(INVALID_SPAN, flat, i, true);
|
||||||
|
expr->type = type;
|
||||||
|
if (expr_const_will_overflow(&expr->const_expr, flat->type_kind))
|
||||||
{
|
{
|
||||||
error_exit("Integer define %s overflow.", id);
|
error_exit("Integer define %s overflow.", id);
|
||||||
}
|
}
|
||||||
@@ -745,6 +747,7 @@ static int jump_buffer_size()
|
|||||||
}
|
}
|
||||||
UNREACHABLE
|
UNREACHABLE
|
||||||
}
|
}
|
||||||
|
|
||||||
void compile()
|
void compile()
|
||||||
{
|
{
|
||||||
symtab_init(active_target.symtab_size);
|
symtab_init(active_target.symtab_size);
|
||||||
@@ -770,6 +773,7 @@ void compile()
|
|||||||
setup_bool_define("PLATFORM_I128_SUPPORTED", platform_target.int128);
|
setup_bool_define("PLATFORM_I128_SUPPORTED", platform_target.int128);
|
||||||
setup_bool_define("PLATFORM_F128_SUPPORTED", platform_target.float128);
|
setup_bool_define("PLATFORM_F128_SUPPORTED", platform_target.float128);
|
||||||
setup_bool_define("PLATFORM_F16_SUPPORTED", platform_target.float16);
|
setup_bool_define("PLATFORM_F16_SUPPORTED", platform_target.float16);
|
||||||
|
setup_int_define("MEMORY_ENVIRONMENT", (uint64_t)active_target.memory_environment, type_int);
|
||||||
setup_bool_define("COMPILER_LIBC_AVAILABLE", !active_target.no_libc);
|
setup_bool_define("COMPILER_LIBC_AVAILABLE", !active_target.no_libc);
|
||||||
setup_int_define("COMPILER_OPT_LEVEL", (uint64_t)active_target.optimization_level, type_int);
|
setup_int_define("COMPILER_OPT_LEVEL", (uint64_t)active_target.optimization_level, type_int);
|
||||||
setup_int_define("OS_TYPE", (uint64_t)platform_target.os, type_int);
|
setup_int_define("OS_TYPE", (uint64_t)platform_target.os, type_int);
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
#define COMPILER_VERSION "0.4.24"
|
#define COMPILER_VERSION "0.4.25"
|
||||||
@@ -350,7 +350,7 @@ voiderr64: ; preds = %after_check63, %voi
|
|||||||
br i1 %not, label %if.then, label %if.exit
|
br i1 %not, label %if.then, label %if.exit
|
||||||
|
|
||||||
if.then: ; preds = %voiderr64
|
if.then: ; preds = %voiderr64
|
||||||
%79 = call i64 @std_core_mem_allocator_new_temp(ptr %retparam65, i64 131072, ptr @std_core_mem_allocator__SYSTEM_ALLOCATOR)
|
%79 = call i64 @std_core_mem_allocator_new_temp(ptr %retparam65, i64 262144, ptr @std_core_mem_allocator__SYSTEM_ALLOCATOR)
|
||||||
%not_err66 = icmp eq i64 %79, 0
|
%not_err66 = icmp eq i64 %79, 0
|
||||||
br i1 %not_err66, label %after_check67, label %assign_optional
|
br i1 %not_err66, label %after_check67, label %assign_optional
|
||||||
|
|
||||||
@@ -364,7 +364,7 @@ after_check67: ; preds = %if.then
|
|||||||
|
|
||||||
panic_block: ; preds = %assign_optional
|
panic_block: ; preds = %assign_optional
|
||||||
%81 = load ptr, ptr @std_core_builtin_panic, align 8
|
%81 = load ptr, ptr @std_core_builtin_panic, align 8
|
||||||
call void %81(ptr @.panic_msg, i64 27, ptr @.file, i64 6, ptr @.func, i64 4,
|
call void %81(ptr @.panic_msg,
|
||||||
unreachable
|
unreachable
|
||||||
|
|
||||||
noerr_block: ; preds = %after_check67
|
noerr_block: ; preds = %after_check67
|
||||||
|
|||||||
@@ -494,7 +494,7 @@ voiderr97: ; preds = %after_check96, %voi
|
|||||||
br i1 %not, label %if.then, label %if.exit
|
br i1 %not, label %if.then, label %if.exit
|
||||||
|
|
||||||
if.then: ; preds = %voiderr97
|
if.then: ; preds = %voiderr97
|
||||||
%158 = call i64 @std_core_mem_allocator_new_temp(%TempAllocator** %retparam98, i64 131072, %Allocator* @std_core_mem_allocator__SYSTEM_ALLOCATOR)
|
%158 = call i64 @std_core_mem_allocator_new_temp(%TempAllocator** %retparam98, i64 262144, %Allocator* @std_core_mem_allocator__SYSTEM_ALLOCATOR)
|
||||||
%not_err99 = icmp eq i64 %158, 0
|
%not_err99 = icmp eq i64 %158, 0
|
||||||
br i1 %not_err99, label %after_check100, label %assign_optional
|
br i1 %not_err99, label %after_check100, label %assign_optional
|
||||||
|
|
||||||
@@ -508,7 +508,7 @@ after_check100: ; preds = %if.then
|
|||||||
|
|
||||||
panic_block: ; preds = %assign_optional
|
panic_block: ; preds = %assign_optional
|
||||||
%160 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8
|
%160 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8
|
||||||
call void %160(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.panic_msg, i64 0, i64 0), i64 27, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.file, i64 0, i64 0), i64 6, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.func, i64 0, i64 0), i64 4,
|
call void %160(i8* getelementptr inbounds
|
||||||
unreachable
|
unreachable
|
||||||
|
|
||||||
noerr_block: ; preds = %after_check100
|
noerr_block: ; preds = %after_check100
|
||||||
|
|||||||
Reference in New Issue
Block a user