mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 20:11:17 +00:00
358 lines
6.8 KiB
C
358 lines
6.8 KiB
C
#pragma once
|
|
|
|
// Copyright (c) 2019 Christoffer Lerno. All rights reserved.
|
|
// Use of this source code is governed by the GNU LGPLv3.0 license
|
|
// a copy of which can be found in the LICENSE file.
|
|
|
|
#include "../utils/common.h"
|
|
#include "../version.h"
|
|
|
|
#define MAX_LIB_DIRS 1024
|
|
#define MAX_FILES 2048
|
|
#define MAX_THREADS 0xFFFF
|
|
|
|
#define TB_BACKEND 0
|
|
|
|
typedef enum
|
|
{
|
|
BACKEND_LLVM,
|
|
BACKEND_TB
|
|
} CompilerBackend;
|
|
|
|
typedef enum
|
|
{
|
|
COMMAND_MISSING = 0,
|
|
COMMAND_COMPILE,
|
|
COMMAND_COMPILE_ONLY,
|
|
COMMAND_GENERATE_HEADERS,
|
|
COMMAND_INIT,
|
|
COMMAND_BUILD,
|
|
COMMAND_COMPILE_RUN,
|
|
COMMAND_RUN,
|
|
COMMAND_CLEAN_RUN,
|
|
COMMAND_CLEAN,
|
|
COMMAND_DIST,
|
|
COMMAND_DOCS,
|
|
COMMAND_BENCH,
|
|
COMMAND_UNIT_TEST,
|
|
COMMAND_PRINT_SYNTAX,
|
|
} CompilerCommand;
|
|
|
|
typedef enum
|
|
{
|
|
DIAG_NONE = 0, // Don't use!
|
|
DIAG_WARNING_TYPE, // Don't use!
|
|
DIAG_UNUSED,
|
|
DIAG_UNUSED_PARAMETER,
|
|
DIAG_UNUSED_FUNCTION,
|
|
DIAG_UNUSED_VARIABLE,
|
|
DIAG_UNUSED_IMPORT,
|
|
DIAG_UNUSED_MODULE,
|
|
DIAG_UNUSED_LABEL,
|
|
DIAG_UNUSED_PUBLIC,
|
|
DIAG_UNUSED_TYPE,
|
|
DIAG_CONVERSION,
|
|
DIAG_COVERED_SWITCH_DEFAULT,
|
|
DIAG_UNREACHABLE_DEFAULT,
|
|
DIAG_ERROR_TYPE, // Don't use this!
|
|
DIAG_FALLOFF_NONVOID,
|
|
DIAG_DUPLICATE_ATTRIBUTE,
|
|
DIAG_NOT_IN_ENUM,
|
|
DIAG_MISSING_CASE,
|
|
DIAG_REMAINDER_DIV_BY_ZERO,
|
|
DIAG_INT_TO_POINTER_CAST,
|
|
DIAG_SHIFT_LHS_NEGATIVE,
|
|
DIAG_SHIFT_NEGATIVE,
|
|
DIAG_SHIFT_GT_TYPEWIDTH,
|
|
DIAG_END_SENTINEL
|
|
} DiagnosticsType;
|
|
|
|
typedef enum
|
|
{
|
|
DIAG_IGNORE = 0,
|
|
DIAG_WARN,
|
|
DIAG_ERROR,
|
|
} DiagnosticsSeverity;
|
|
|
|
typedef enum
|
|
{
|
|
COMPILE_NORMAL,
|
|
COMPILE_LEX_ONLY,
|
|
COMPILE_LEX_PARSE_ONLY,
|
|
COMPILE_LEX_PARSE_CHECK_ONLY,
|
|
COMPILE_OUTPUT_HEADERS,
|
|
COMPILE_OUTPUT_AST,
|
|
} CompileOption;
|
|
|
|
typedef enum
|
|
{
|
|
OPT_SETTING_NOT_SET = -1,
|
|
OPT_SETTING_O0 = 0,
|
|
OPT_SETTING_O1 = 1,
|
|
OPT_SETTING_O2 = 2,
|
|
OPT_SETTING_O3 = 3,
|
|
OPT_SETTING_OSMALL = 4,
|
|
OPT_SETTING_OTINY = 5,
|
|
} OptimizationSetting;
|
|
|
|
typedef enum
|
|
{
|
|
OPTIMIZATION_NOT_SET = -1,
|
|
OPTIMIZATION_NONE = 0, // -O0
|
|
OPTIMIZATION_LESS = 1, // -O1
|
|
OPTIMIZATION_DEFAULT = 2, // -O2
|
|
OPTIMIZATION_AGGRESSIVE = 3, // -O3
|
|
} OptimizationLevel;
|
|
|
|
typedef enum
|
|
{
|
|
SIZE_OPTIMIZATION_NOT_SET = -1,
|
|
SIZE_OPTIMIZATION_NONE = 0, // None
|
|
SIZE_OPTIMIZATION_SMALL = 1, // -Os
|
|
SIZE_OPTIMIZATION_TINY = 2, // -Oz
|
|
} SizeOptimizationLevel;
|
|
|
|
typedef enum
|
|
{
|
|
SOFT_FLOAT_DEFAULT = -1,
|
|
SOFT_FLOAT_NONE = 0,
|
|
SOFT_FLOAT_YES = 1
|
|
} SoftFloat;
|
|
|
|
typedef enum
|
|
{
|
|
STRUCT_RETURN_DEFAULT = -1,
|
|
STRUCT_RETURN_STACK = 0,
|
|
STRUCT_RETURN_REG = 1
|
|
} StructReturn;
|
|
|
|
typedef enum
|
|
{
|
|
X86VECTOR_DEFAULT = -1,
|
|
X86VECTOR_NONE = 0,
|
|
X86VECTOR_MMX = 1,
|
|
X86VECTOR_SSE = 2,
|
|
X86VECTOR_AVX = 3,
|
|
X86VECTOR_AVX512 = 4,
|
|
} X86VectorCapability;
|
|
|
|
static const char *vector_capability[5] = {
|
|
[X86VECTOR_NONE] = "none",
|
|
[X86VECTOR_MMX] = "mmx",
|
|
[X86VECTOR_SSE] = "sse",
|
|
[X86VECTOR_AVX] = "avx",
|
|
[X86VECTOR_AVX512] = "avx512",
|
|
};
|
|
|
|
typedef enum
|
|
{
|
|
WIN_CRT_DEFAULT = -1,
|
|
WIN_CRT_NONE = 0,
|
|
WIN_CRT_DYNAMIC = 1,
|
|
WIN_CRT_STATIC = 2,
|
|
} WinCrtLinking;
|
|
|
|
static const char *wincrt_linking[3] = {
|
|
[WIN_CRT_NONE] = "none",
|
|
[WIN_CRT_DYNAMIC] = "dynamic",
|
|
[WIN_CRT_STATIC] = "static",
|
|
};
|
|
|
|
typedef enum
|
|
{
|
|
RELOC_DEFAULT = -1,
|
|
RELOC_NONE = 0,
|
|
RELOC_SMALL_PIC = 1,
|
|
RELOC_BIG_PIC = 2,
|
|
RELOC_SMALL_PIE = 3,
|
|
RELOC_BIG_PIE = 4,
|
|
} RelocModel;
|
|
|
|
static const char *reloc_models[5] = {
|
|
[RELOC_NONE] = "none",
|
|
[RELOC_SMALL_PIC] = "pic",
|
|
[RELOC_BIG_PIC] = "PIC",
|
|
[RELOC_SMALL_PIE] = "pie",
|
|
[RELOC_BIG_PIE] = "PIE",
|
|
};
|
|
|
|
typedef enum
|
|
{
|
|
DEBUG_INFO_NOT_SET = -1,
|
|
DEBUG_INFO_NONE,
|
|
DEBUG_INFO_LINE_TABLES,
|
|
DEBUG_INFO_FULL
|
|
} DebugInfo;
|
|
|
|
typedef enum
|
|
{
|
|
ARCH_OS_TARGET_DEFAULT = 0,
|
|
LINUX_X86,
|
|
LINUX_X64,
|
|
WINDOWS_X86,
|
|
WINDOWS_X64,
|
|
MINGW_X64,
|
|
MACOS_X64,
|
|
MACOS_AARCH64,
|
|
LINUX_AARCH64,
|
|
LINUX_RISCV32,
|
|
LINUX_RISCV64,
|
|
WASM32,
|
|
WASM64,
|
|
ELF_X86,
|
|
ELF_X64,
|
|
ELF_AARCH64,
|
|
ELF_RISCV32,
|
|
ELF_RISCV64,
|
|
FREEBSD_X86,
|
|
FREEBSD_X64,
|
|
OPENBSD_X86,
|
|
OPENBSD_X64,
|
|
NETBSD_X86,
|
|
NETBSD_X64,
|
|
MCU_X86,
|
|
ARCH_OS_TARGET_LAST = MCU_X86
|
|
} ArchOsTarget;
|
|
|
|
typedef struct BuildOptions_
|
|
{
|
|
const char *lib_dir[MAX_LIB_DIRS];
|
|
int lib_dir_count;
|
|
const char *libs[MAX_LIB_DIRS];
|
|
int lib_count;
|
|
const char* linker_args[MAX_LIB_DIRS];
|
|
int linker_arg_count;
|
|
const char* linker_lib_dir[MAX_LIB_DIRS];
|
|
int linker_lib_dir_count;
|
|
const char* linker_libs[MAX_LIB_DIRS];
|
|
int linker_lib_count;
|
|
const char* std_lib_dir;
|
|
struct {
|
|
const char *sdk;
|
|
WinCrtLinking crt_linking;
|
|
} win;
|
|
struct {
|
|
const char *sdk;
|
|
} macos;
|
|
int build_threads;
|
|
const char** files;
|
|
const char* output_name;
|
|
const char* project_name;
|
|
const char* target_select;
|
|
const char* path;
|
|
uint32_t symtab_size;
|
|
unsigned version;
|
|
CompilerBackend backend;
|
|
CompilerCommand command;
|
|
CompileOption compile_option;
|
|
DiagnosticsSeverity severity[DIAG_END_SENTINEL];
|
|
OptimizationSetting optimization_setting_override;
|
|
DebugInfo debug_info_override;
|
|
ArchOsTarget arch_os_target_override;
|
|
int safe_mode;
|
|
bool emit_llvm;
|
|
bool emit_bitcode;
|
|
bool test_mode;
|
|
bool no_stdlib;
|
|
bool force_linker;
|
|
const char *panicfn;
|
|
RelocModel reloc_model;
|
|
X86VectorCapability x86_vector_capability;
|
|
bool print_keywords;
|
|
bool print_attributes;
|
|
bool print_builtins;
|
|
bool print_operators;
|
|
bool print_precedence;
|
|
bool print_build_settings;
|
|
} BuildOptions;
|
|
|
|
|
|
|
|
|
|
typedef enum
|
|
{
|
|
TARGET_TYPE_EXECUTABLE,
|
|
TARGET_TYPE_STATIC_LIB,
|
|
TARGET_TYPE_DYNAMIC_LIB,
|
|
TARGET_TYPE_TEST
|
|
} TargetType;
|
|
|
|
typedef struct
|
|
{
|
|
ArchOsTarget arch_os;
|
|
const char **link_flags;
|
|
const char **linked_libs;
|
|
const char **depends;
|
|
} LibraryTarget;
|
|
|
|
typedef struct
|
|
{
|
|
const char *dir;
|
|
const char *provides;
|
|
const char **depends;
|
|
LibraryTarget *target_used;
|
|
LibraryTarget **targets;
|
|
} Library;
|
|
|
|
typedef struct
|
|
{
|
|
TargetType type;
|
|
Library **library_list;
|
|
const char *name;
|
|
const char *version;
|
|
const char *langrev;
|
|
const char **source_dirs;
|
|
const char **sources;
|
|
const char **libdirs;
|
|
const char **libs;
|
|
const char **linker_libdirs;
|
|
const char *cpu;
|
|
const char **link_args;
|
|
bool run_after_compile : 1;
|
|
bool test_output : 1;
|
|
bool output_headers : 1;
|
|
bool output_ast : 1;
|
|
bool lex_only : 1;
|
|
bool parse_only : 1;
|
|
bool check_only : 1;
|
|
bool emit_llvm : 1;
|
|
bool no_stdlib : 1;
|
|
bool emit_object_files : 1;
|
|
bool no_link : 1;
|
|
bool force_linker : 1;
|
|
OptimizationLevel optimization_level;
|
|
SizeOptimizationLevel size_optimization_level;
|
|
DebugInfo debug_info;
|
|
RelocModel reloc_model;
|
|
ArchOsTarget arch_os_target;
|
|
CompilerBackend backend;
|
|
uint32_t symtab_size;
|
|
uint32_t switchrange_max_size;
|
|
const char *panicfn;
|
|
const char *cc;
|
|
const char *cflags;
|
|
const char **csource_dirs;
|
|
const char **csources;
|
|
struct
|
|
{
|
|
SoftFloat soft_float : 3;
|
|
StructReturn x86_struct_return : 3;
|
|
X86VectorCapability x86_vector_capability : 4;
|
|
bool trap_on_wrap : 1;
|
|
bool safe_mode : 1;
|
|
} feature;
|
|
struct
|
|
{
|
|
const char *sdk;
|
|
} macos;
|
|
struct
|
|
{
|
|
const char *sdk;
|
|
WinCrtLinking crt_linking;
|
|
} win;
|
|
} BuildTarget;
|
|
|
|
|
|
BuildOptions parse_arguments(int argc, const char *argv[]);
|
|
ArchOsTarget arch_os_target_from_string(const char *target);
|