mirror of
https://github.com/ziglang/zig.git
synced 2026-02-15 13:58:27 +00:00
debug/release mode
This commit is contained in:
parent
cda10f0577
commit
505317a12f
@ -40,7 +40,6 @@ readable, safe, optimal, and concise code to solve any computing problem.
|
||||
|
||||
## Roadmap
|
||||
|
||||
* Debug/Release mode.
|
||||
* don't hardcode the link against libc
|
||||
* C style comments.
|
||||
* Unit tests.
|
||||
|
||||
@ -60,6 +60,8 @@ struct CodeGen {
|
||||
LLVMTargetDataRef target_data_ref;
|
||||
unsigned pointer_size_bytes;
|
||||
bool is_static;
|
||||
bool strip_debug_symbols;
|
||||
CodeGenBuildType build_type;
|
||||
LLVMTargetMachineRef target_machine;
|
||||
Buf in_file;
|
||||
Buf in_dir;
|
||||
@ -77,19 +79,33 @@ struct CodeGenNode {
|
||||
} data;
|
||||
};
|
||||
|
||||
CodeGen *create_codegen(AstNode *root, bool is_static, Buf *in_full_path) {
|
||||
CodeGen *create_codegen(AstNode *root, Buf *in_full_path) {
|
||||
CodeGen *g = allocate<CodeGen>(1);
|
||||
g->root = root;
|
||||
g->fn_defs.init(32);
|
||||
g->fn_table.init(32);
|
||||
g->str_table.init(32);
|
||||
g->type_table.init(32);
|
||||
g->is_static = is_static;
|
||||
g->is_static = false;
|
||||
g->build_type = CodeGenBuildTypeDebug;
|
||||
g->strip_debug_symbols = false;
|
||||
|
||||
os_path_split(in_full_path, &g->in_dir, &g->in_file);
|
||||
return g;
|
||||
}
|
||||
|
||||
void codegen_set_build_type(CodeGen *g, CodeGenBuildType build_type) {
|
||||
g->build_type = build_type;
|
||||
}
|
||||
|
||||
void codegen_set_is_static(CodeGen *g, bool is_static) {
|
||||
g->is_static = is_static;
|
||||
}
|
||||
|
||||
void codegen_set_strip(CodeGen *g, bool strip) {
|
||||
g->strip_debug_symbols = strip;
|
||||
}
|
||||
|
||||
static void add_node_error(CodeGen *g, AstNode *node, Buf *msg) {
|
||||
g->errors.add_one();
|
||||
ErrorMsg *last_msg = &g->errors.last();
|
||||
@ -352,7 +368,8 @@ void semantic_analyze(CodeGen *g) {
|
||||
char *native_cpu = LLVMZigGetHostCPUName();
|
||||
char *native_features = LLVMZigGetNativeFeatures();
|
||||
|
||||
LLVMCodeGenOptLevel opt_level = LLVMCodeGenLevelNone;
|
||||
LLVMCodeGenOptLevel opt_level = (g->build_type == CodeGenBuildTypeDebug) ?
|
||||
LLVMCodeGenLevelNone : LLVMCodeGenLevelAggressive;
|
||||
|
||||
LLVMRelocMode reloc_mode = g->is_static ? LLVMRelocStatic : LLVMRelocPIC;
|
||||
|
||||
@ -522,12 +539,13 @@ static llvm::DISubroutineType *create_di_function_type(CodeGen *g, AstNodeFnProt
|
||||
|
||||
void code_gen(CodeGen *g) {
|
||||
Buf *producer = buf_sprintf("zig %s", ZIG_VERSION_STRING);
|
||||
bool is_optimized = false;
|
||||
bool is_optimized = g->build_type == CodeGenBuildTypeRelease;
|
||||
const char *flags = "";
|
||||
unsigned runtime_version = 0;
|
||||
g->compile_unit = g->dbuilder->createCompileUnit(llvm::dwarf::DW_LANG_C99,
|
||||
buf_ptr(&g->in_file), buf_ptr(&g->in_dir),
|
||||
buf_ptr(producer), is_optimized, flags, runtime_version);
|
||||
buf_ptr(producer), is_optimized, flags, runtime_version,
|
||||
"", llvm::DIBuilder::FullDebug, 0, !g->strip_debug_symbols);
|
||||
|
||||
g->block_scopes.append(g->compile_unit);
|
||||
|
||||
@ -615,6 +633,9 @@ void code_gen_link(CodeGen *g, const char *out_file) {
|
||||
}
|
||||
|
||||
ZigList<const char *> args = {0};
|
||||
if (g->is_static) {
|
||||
args.append("-static");
|
||||
}
|
||||
args.append("-o");
|
||||
args.append(out_file);
|
||||
args.append((const char *)buf_ptr(&out_file_o));
|
||||
|
||||
@ -21,7 +21,15 @@ struct ErrorMsg {
|
||||
};
|
||||
|
||||
|
||||
CodeGen *create_codegen(AstNode *root, bool is_static, Buf *in_file);
|
||||
CodeGen *create_codegen(AstNode *root, Buf *in_file);
|
||||
|
||||
enum CodeGenBuildType {
|
||||
CodeGenBuildTypeDebug,
|
||||
CodeGenBuildTypeRelease,
|
||||
};
|
||||
void codegen_set_build_type(CodeGen *codegen, CodeGenBuildType build_type);
|
||||
void codegen_set_is_static(CodeGen *codegen, bool is_static);
|
||||
void codegen_set_strip(CodeGen *codegen, bool strip);
|
||||
|
||||
void semantic_analyze(CodeGen *g);
|
||||
|
||||
|
||||
23
src/main.cpp
23
src/main.cpp
@ -33,6 +33,9 @@ static int usage(const char *arg0) {
|
||||
" --output output file\n"
|
||||
" --version print version number and exit\n"
|
||||
" -Ipath add path to header include path\n"
|
||||
" --release build with optimizations on\n"
|
||||
" --strip exclude debug symbols\n"
|
||||
" --static build a static executable\n"
|
||||
, arg0);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
@ -55,7 +58,9 @@ static Buf *fetch_file(FILE *f) {
|
||||
return buf;
|
||||
}
|
||||
|
||||
static int build(const char *arg0, const char *in_file, const char *out_file, ZigList<char *> *include_paths) {
|
||||
static int build(const char *arg0, const char *in_file, const char *out_file,
|
||||
ZigList<char *> *include_paths, bool release, bool strip, bool is_static)
|
||||
{
|
||||
static char cur_dir[1024];
|
||||
|
||||
if (!in_file || !out_file)
|
||||
@ -91,7 +96,10 @@ static int build(const char *arg0, const char *in_file, const char *out_file, Zi
|
||||
|
||||
fprintf(stderr, "\nSemantic Analysis:\n");
|
||||
fprintf(stderr, "--------------------\n");
|
||||
CodeGen *codegen = create_codegen(root, false, buf_create_from_str(in_file));
|
||||
CodeGen *codegen = create_codegen(root, buf_create_from_str(in_file));
|
||||
codegen_set_build_type(codegen, release ? CodeGenBuildTypeRelease : CodeGenBuildTypeDebug);
|
||||
codegen_set_strip(codegen, strip);
|
||||
codegen_set_is_static(codegen, is_static);
|
||||
semantic_analyze(codegen);
|
||||
ZigList<ErrorMsg> *errors = codegen_error_messages(codegen);
|
||||
if (errors->length == 0) {
|
||||
@ -128,6 +136,9 @@ int main(int argc, char **argv) {
|
||||
char *in_file = NULL;
|
||||
char *out_file = NULL;
|
||||
ZigList<char *> include_paths = {0};
|
||||
bool release = false;
|
||||
bool strip = false;
|
||||
bool is_static = false;
|
||||
|
||||
Cmd cmd = CmdNone;
|
||||
for (int i = 1; i < argc; i += 1) {
|
||||
@ -136,6 +147,12 @@ int main(int argc, char **argv) {
|
||||
if (strcmp(arg, "--version") == 0) {
|
||||
printf("%s\n", ZIG_VERSION_STRING);
|
||||
return EXIT_SUCCESS;
|
||||
} else if (strcmp(arg, "--release") == 0) {
|
||||
release = true;
|
||||
} else if (strcmp(arg, "--strip") == 0) {
|
||||
strip = true;
|
||||
} else if (strcmp(arg, "--static") == 0) {
|
||||
is_static = true;
|
||||
} else if (i + 1 >= argc) {
|
||||
return usage(arg0);
|
||||
} else {
|
||||
@ -174,7 +191,7 @@ int main(int argc, char **argv) {
|
||||
case CmdNone:
|
||||
return usage(arg0);
|
||||
case CmdBuild:
|
||||
return build(arg0, in_file, out_file, &include_paths);
|
||||
return build(arg0, in_file, out_file, &include_paths, release, strip, is_static);
|
||||
}
|
||||
|
||||
zig_unreachable();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user