|
@@ -223,8 +223,7 @@ gb_internal i32 linker_stage(lbGenerator *gen) {
|
|
string_set_init(&asm_files, 64);
|
|
string_set_init(&asm_files, 64);
|
|
defer (string_set_destroy(&asm_files));
|
|
defer (string_set_destroy(&asm_files));
|
|
|
|
|
|
- for_array(j, gen->foreign_libraries) {
|
|
|
|
- Entity *e = gen->foreign_libraries[j];
|
|
|
|
|
|
+ for (Entity *e : gen->foreign_libraries) {
|
|
GB_ASSERT(e->kind == Entity_LibraryName);
|
|
GB_ASSERT(e->kind == Entity_LibraryName);
|
|
for_array(i, e->LibraryName.paths) {
|
|
for_array(i, e->LibraryName.paths) {
|
|
String lib = string_trim_whitespace(e->LibraryName.paths[i]);
|
|
String lib = string_trim_whitespace(e->LibraryName.paths[i]);
|
|
@@ -287,8 +286,7 @@ gb_internal i32 linker_stage(lbGenerator *gen) {
|
|
|
|
|
|
gbString object_files = gb_string_make(heap_allocator(), "");
|
|
gbString object_files = gb_string_make(heap_allocator(), "");
|
|
defer (gb_string_free(object_files));
|
|
defer (gb_string_free(object_files));
|
|
- for_array(i, gen->output_object_paths) {
|
|
|
|
- String object_path = gen->output_object_paths[i];
|
|
|
|
|
|
+ for (String const &object_path : gen->output_object_paths) {
|
|
object_files = gb_string_append_fmt(object_files, "\"%.*s\" ", LIT(object_path));
|
|
object_files = gb_string_append_fmt(object_files, "\"%.*s\" ", LIT(object_path));
|
|
}
|
|
}
|
|
|
|
|
|
@@ -331,9 +329,9 @@ gb_internal i32 linker_stage(lbGenerator *gen) {
|
|
result = system_exec_command_line_app("msvc-link",
|
|
result = system_exec_command_line_app("msvc-link",
|
|
"\"%.*slink.exe\" %s %.*s -OUT:\"%.*s\" %s "
|
|
"\"%.*slink.exe\" %s %.*s -OUT:\"%.*s\" %s "
|
|
"/nologo /incremental:no /opt:ref /subsystem:%s "
|
|
"/nologo /incremental:no /opt:ref /subsystem:%s "
|
|
- " %.*s "
|
|
|
|
- " %.*s "
|
|
|
|
- " %s "
|
|
|
|
|
|
+ "%.*s "
|
|
|
|
+ "%.*s "
|
|
|
|
+ "%s "
|
|
"",
|
|
"",
|
|
LIT(vs_exe_path), object_files, LIT(res_path), LIT(output_filename),
|
|
LIT(vs_exe_path), object_files, LIT(res_path), LIT(output_filename),
|
|
link_settings,
|
|
link_settings,
|
|
@@ -349,9 +347,9 @@ gb_internal i32 linker_stage(lbGenerator *gen) {
|
|
result = system_exec_command_line_app("msvc-lld-link",
|
|
result = system_exec_command_line_app("msvc-lld-link",
|
|
"\"%.*s\\bin\\lld-link\" %s -OUT:\"%.*s\" %s "
|
|
"\"%.*s\\bin\\lld-link\" %s -OUT:\"%.*s\" %s "
|
|
"/nologo /incremental:no /opt:ref /subsystem:%s "
|
|
"/nologo /incremental:no /opt:ref /subsystem:%s "
|
|
- " %.*s "
|
|
|
|
- " %.*s "
|
|
|
|
- " %s "
|
|
|
|
|
|
+ "%.*s "
|
|
|
|
+ "%.*s "
|
|
|
|
+ "%s "
|
|
"",
|
|
"",
|
|
LIT(build_context.ODIN_ROOT), object_files, LIT(output_filename),
|
|
LIT(build_context.ODIN_ROOT), object_files, LIT(output_filename),
|
|
link_settings,
|
|
link_settings,
|
|
@@ -384,11 +382,10 @@ gb_internal i32 linker_stage(lbGenerator *gen) {
|
|
string_set_init(&libs, 64);
|
|
string_set_init(&libs, 64);
|
|
defer (string_set_destroy(&libs));
|
|
defer (string_set_destroy(&libs));
|
|
|
|
|
|
- for_array(j, gen->foreign_libraries) {
|
|
|
|
- Entity *e = gen->foreign_libraries[j];
|
|
|
|
|
|
+ for (Entity *e : gen->foreign_libraries) {
|
|
GB_ASSERT(e->kind == Entity_LibraryName);
|
|
GB_ASSERT(e->kind == Entity_LibraryName);
|
|
- for_array(i, e->LibraryName.paths) {
|
|
|
|
- String lib = string_trim_whitespace(e->LibraryName.paths[i]);
|
|
|
|
|
|
+ for (String lib : e->LibraryName.paths) {
|
|
|
|
+ lib = string_trim_whitespace(lib);
|
|
if (lib.len == 0) {
|
|
if (lib.len == 0) {
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
@@ -440,8 +437,7 @@ gb_internal i32 linker_stage(lbGenerator *gen) {
|
|
|
|
|
|
gbString object_files = gb_string_make(heap_allocator(), "");
|
|
gbString object_files = gb_string_make(heap_allocator(), "");
|
|
defer (gb_string_free(object_files));
|
|
defer (gb_string_free(object_files));
|
|
- for_array(i, gen->output_object_paths) {
|
|
|
|
- String object_path = gen->output_object_paths[i];
|
|
|
|
|
|
+ for (String object_path : gen->output_object_paths) {
|
|
object_files = gb_string_append_fmt(object_files, "\"%.*s\" ", LIT(object_path));
|
|
object_files = gb_string_append_fmt(object_files, "\"%.*s\" ", LIT(object_path));
|
|
}
|
|
}
|
|
|
|
|
|
@@ -856,8 +852,7 @@ gb_internal bool parse_build_flags(Array<String> args) {
|
|
bool set_flags[BuildFlag_COUNT] = {};
|
|
bool set_flags[BuildFlag_COUNT] = {};
|
|
|
|
|
|
bool bad_flags = false;
|
|
bool bad_flags = false;
|
|
- for_array(i, flag_args) {
|
|
|
|
- String flag = flag_args[i];
|
|
|
|
|
|
+ for (String flag : flag_args) {
|
|
if (flag[0] != '-') {
|
|
if (flag[0] != '-') {
|
|
gb_printf_err("Invalid flag: %.*s\n", LIT(flag));
|
|
gb_printf_err("Invalid flag: %.*s\n", LIT(flag));
|
|
continue;
|
|
continue;
|
|
@@ -886,8 +881,7 @@ gb_internal bool parse_build_flags(Array<String> args) {
|
|
bool found = false;
|
|
bool found = false;
|
|
|
|
|
|
BuildFlag found_bf = {};
|
|
BuildFlag found_bf = {};
|
|
- for_array(build_flag_index, build_flags) {
|
|
|
|
- BuildFlag bf = build_flags[build_flag_index];
|
|
|
|
|
|
+ for (BuildFlag const &bf : build_flags) {
|
|
if (bf.name == name) {
|
|
if (bf.name == name) {
|
|
found = true;
|
|
found = true;
|
|
found_bf = bf;
|
|
found_bf = bf;
|
|
@@ -1646,10 +1640,9 @@ gb_internal void timings_export_all(Timings *t, Checker *c, bool timings_are_fin
|
|
isize files = 0;
|
|
isize files = 0;
|
|
isize packages = p->packages.count;
|
|
isize packages = p->packages.count;
|
|
isize total_file_size = 0;
|
|
isize total_file_size = 0;
|
|
- for_array(i, p->packages) {
|
|
|
|
- files += p->packages[i]->files.count;
|
|
|
|
- for_array(j, p->packages[i]->files) {
|
|
|
|
- AstFile *file = p->packages[i]->files[j];
|
|
|
|
|
|
+ for (AstPackage *pkg : p->packages) {
|
|
|
|
+ files += pkg->files.count;
|
|
|
|
+ for (AstFile *file : pkg->files) {
|
|
total_file_size += file->tokenizer.end - file->tokenizer.start;
|
|
total_file_size += file->tokenizer.end - file->tokenizer.start;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -1673,8 +1666,7 @@ gb_internal void timings_export_all(Timings *t, Checker *c, bool timings_are_fin
|
|
gb_fprintf(&f, "\t\t{\"name\": \"%.*s\", \"millis\": %.3f},\n",
|
|
gb_fprintf(&f, "\t\t{\"name\": \"%.*s\", \"millis\": %.3f},\n",
|
|
LIT(t->total.label), total_time);
|
|
LIT(t->total.label), total_time);
|
|
|
|
|
|
- for_array(i, t->sections) {
|
|
|
|
- TimeStamp ts = t->sections[i];
|
|
|
|
|
|
+ for (TimeStamp const &ts : t->sections) {
|
|
f64 section_time = time_stamp(ts, t->freq, unit);
|
|
f64 section_time = time_stamp(ts, t->freq, unit);
|
|
gb_fprintf(&f, "\t\t{\"name\": \"%.*s\", \"millis\": %.3f},\n",
|
|
gb_fprintf(&f, "\t\t{\"name\": \"%.*s\", \"millis\": %.3f},\n",
|
|
LIT(ts.label), section_time);
|
|
LIT(ts.label), section_time);
|
|
@@ -1695,8 +1687,7 @@ gb_internal void timings_export_all(Timings *t, Checker *c, bool timings_are_fin
|
|
*/
|
|
*/
|
|
gb_fprintf(&f, "\"%.*s\", %d\n", LIT(t->total.label), int(total_time));
|
|
gb_fprintf(&f, "\"%.*s\", %d\n", LIT(t->total.label), int(total_time));
|
|
|
|
|
|
- for_array(i, t->sections) {
|
|
|
|
- TimeStamp ts = t->sections[i];
|
|
|
|
|
|
+ for (TimeStamp const &ts : t->sections) {
|
|
f64 section_time = time_stamp(ts, t->freq, unit);
|
|
f64 section_time = time_stamp(ts, t->freq, unit);
|
|
gb_fprintf(&f, "\"%.*s\", %d\n", LIT(ts.label), int(section_time));
|
|
gb_fprintf(&f, "\"%.*s\", %d\n", LIT(ts.label), int(section_time));
|
|
}
|
|
}
|
|
@@ -1714,10 +1705,9 @@ gb_internal void show_timings(Checker *c, Timings *t) {
|
|
isize total_file_size = 0;
|
|
isize total_file_size = 0;
|
|
f64 total_tokenizing_time = 0;
|
|
f64 total_tokenizing_time = 0;
|
|
f64 total_parsing_time = 0;
|
|
f64 total_parsing_time = 0;
|
|
- for_array(i, p->packages) {
|
|
|
|
- files += p->packages[i]->files.count;
|
|
|
|
- for_array(j, p->packages[i]->files) {
|
|
|
|
- AstFile *file = p->packages[i]->files[j];
|
|
|
|
|
|
+ for (AstPackage *pkg : p->packages) {
|
|
|
|
+ files += pkg->files.count;
|
|
|
|
+ for (AstFile *file : pkg->files) {
|
|
total_tokenizing_time += file->time_to_tokenize;
|
|
total_tokenizing_time += file->time_to_tokenize;
|
|
total_parsing_time += file->time_to_parse;
|
|
total_parsing_time += file->time_to_parse;
|
|
total_file_size += file->tokenizer.end - file->tokenizer.start;
|
|
total_file_size += file->tokenizer.end - file->tokenizer.start;
|
|
@@ -1778,8 +1768,7 @@ gb_internal void show_timings(Checker *c, Timings *t) {
|
|
}
|
|
}
|
|
{
|
|
{
|
|
TimeStamp ts = {};
|
|
TimeStamp ts = {};
|
|
- for_array(i, t->sections) {
|
|
|
|
- TimeStamp s = t->sections[i];
|
|
|
|
|
|
+ for (TimeStamp const &s : t->sections) {
|
|
if (s.label == "parse files") {
|
|
if (s.label == "parse files") {
|
|
ts = s;
|
|
ts = s;
|
|
break;
|
|
break;
|
|
@@ -1802,8 +1791,7 @@ gb_internal void show_timings(Checker *c, Timings *t) {
|
|
{
|
|
{
|
|
TimeStamp ts = {};
|
|
TimeStamp ts = {};
|
|
TimeStamp ts_end = {};
|
|
TimeStamp ts_end = {};
|
|
- for_array(i, t->sections) {
|
|
|
|
- TimeStamp s = t->sections[i];
|
|
|
|
|
|
+ for (TimeStamp const &s : t->sections) {
|
|
if (s.label == "type check") {
|
|
if (s.label == "type check") {
|
|
ts = s;
|
|
ts = s;
|
|
}
|
|
}
|
|
@@ -1849,8 +1837,7 @@ gb_internal void remove_temp_files(lbGenerator *gen) {
|
|
|
|
|
|
TIME_SECTION("remove keep temp files");
|
|
TIME_SECTION("remove keep temp files");
|
|
|
|
|
|
- for_array(i, gen->output_temp_paths) {
|
|
|
|
- String path = gen->output_temp_paths[i];
|
|
|
|
|
|
+ for (String const &path : gen->output_temp_paths) {
|
|
gb_file_remove(cast(char const *)path.text);
|
|
gb_file_remove(cast(char const *)path.text);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1858,8 +1845,7 @@ gb_internal void remove_temp_files(lbGenerator *gen) {
|
|
switch (build_context.build_mode) {
|
|
switch (build_context.build_mode) {
|
|
case BuildMode_Executable:
|
|
case BuildMode_Executable:
|
|
case BuildMode_DynamicLibrary:
|
|
case BuildMode_DynamicLibrary:
|
|
- for_array(i, gen->output_object_paths) {
|
|
|
|
- String path = gen->output_object_paths[i];
|
|
|
|
|
|
+ for (String const &path : gen->output_object_paths) {
|
|
gb_file_remove(cast(char const *)path.text);
|
|
gb_file_remove(cast(char const *)path.text);
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
@@ -2216,8 +2202,7 @@ gb_internal void print_show_unused(Checker *c) {
|
|
CheckerInfo *info = &c->info;
|
|
CheckerInfo *info = &c->info;
|
|
|
|
|
|
auto unused = array_make<Entity *>(permanent_allocator(), 0, info->entities.count);
|
|
auto unused = array_make<Entity *>(permanent_allocator(), 0, info->entities.count);
|
|
- for_array(i, info->entities) {
|
|
|
|
- Entity *e = info->entities[i];
|
|
|
|
|
|
+ for (Entity *e : info->entities) {
|
|
if (e == nullptr) {
|
|
if (e == nullptr) {
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
@@ -2264,8 +2249,7 @@ gb_internal void print_show_unused(Checker *c) {
|
|
|
|
|
|
AstPackage *curr_pkg = nullptr;
|
|
AstPackage *curr_pkg = nullptr;
|
|
EntityKind curr_entity_kind = Entity_Invalid;
|
|
EntityKind curr_entity_kind = Entity_Invalid;
|
|
- for_array(i, unused) {
|
|
|
|
- Entity *e = unused[i];
|
|
|
|
|
|
+ for (Entity *e : unused) {
|
|
if (curr_pkg != e->pkg) {
|
|
if (curr_pkg != e->pkg) {
|
|
curr_pkg = e->pkg;
|
|
curr_pkg = e->pkg;
|
|
curr_entity_kind = Entity_Invalid;
|
|
curr_entity_kind = Entity_Invalid;
|
|
@@ -2318,19 +2302,18 @@ gb_internal gbFileError write_file_with_stripped_tokens(gbFile *f, AstFile *file
|
|
u8 const *file_data = file->tokenizer.start;
|
|
u8 const *file_data = file->tokenizer.start;
|
|
i32 prev_offset = 0;
|
|
i32 prev_offset = 0;
|
|
i32 const end_offset = cast(i32)(file->tokenizer.end - file->tokenizer.start);
|
|
i32 const end_offset = cast(i32)(file->tokenizer.end - file->tokenizer.start);
|
|
- for_array(i, file->tokens) {
|
|
|
|
- Token *token = &file->tokens[i];
|
|
|
|
- if (token->flags & (TokenFlag_Remove|TokenFlag_Replace)) {
|
|
|
|
- i32 offset = token->pos.offset;
|
|
|
|
|
|
+ for (Token const &token : file->tokens) {
|
|
|
|
+ if (token.flags & (TokenFlag_Remove|TokenFlag_Replace)) {
|
|
|
|
+ i32 offset = token.pos.offset;
|
|
i32 to_write = offset-prev_offset;
|
|
i32 to_write = offset-prev_offset;
|
|
if (!gb_file_write(f, file_data+prev_offset, to_write)) {
|
|
if (!gb_file_write(f, file_data+prev_offset, to_write)) {
|
|
return gbFileError_Invalid;
|
|
return gbFileError_Invalid;
|
|
}
|
|
}
|
|
written += to_write;
|
|
written += to_write;
|
|
- prev_offset = token_pos_end(*token).offset;
|
|
|
|
|
|
+ prev_offset = token_pos_end(token).offset;
|
|
}
|
|
}
|
|
- if (token->flags & TokenFlag_Replace) {
|
|
|
|
- if (token->kind == Token_Ellipsis) {
|
|
|
|
|
|
+ if (token.flags & TokenFlag_Replace) {
|
|
|
|
+ if (token.kind == Token_Ellipsis) {
|
|
if (!gb_file_write(f, "..=", 3)) {
|
|
if (!gb_file_write(f, "..=", 3)) {
|
|
return gbFileError_Invalid;
|
|
return gbFileError_Invalid;
|
|
}
|
|
}
|
|
@@ -2354,22 +2337,17 @@ gb_internal gbFileError write_file_with_stripped_tokens(gbFile *f, AstFile *file
|
|
|
|
|
|
gb_internal int strip_semicolons(Parser *parser) {
|
|
gb_internal int strip_semicolons(Parser *parser) {
|
|
isize file_count = 0;
|
|
isize file_count = 0;
|
|
- for_array(i, parser->packages) {
|
|
|
|
- AstPackage *pkg = parser->packages[i];
|
|
|
|
|
|
+ for (AstPackage *pkg : parser->packages) {
|
|
file_count += pkg->files.count;
|
|
file_count += pkg->files.count;
|
|
}
|
|
}
|
|
|
|
|
|
auto generated_files = array_make<StripSemicolonFile>(permanent_allocator(), 0, file_count);
|
|
auto generated_files = array_make<StripSemicolonFile>(permanent_allocator(), 0, file_count);
|
|
|
|
|
|
- for_array(i, parser->packages) {
|
|
|
|
- AstPackage *pkg = parser->packages[i];
|
|
|
|
- for_array(j, pkg->files) {
|
|
|
|
- AstFile *file = pkg->files[j];
|
|
|
|
-
|
|
|
|
|
|
+ for (AstPackage *pkg : parser->packages) {
|
|
|
|
+ for (AstFile *file : pkg->files) {
|
|
bool nothing_to_change = true;
|
|
bool nothing_to_change = true;
|
|
- for_array(i, file->tokens) {
|
|
|
|
- Token *token = &file->tokens[i];
|
|
|
|
- if (token->flags) {
|
|
|
|
|
|
+ for (Token const &token : file->tokens) {
|
|
|
|
+ if (token.flags) {
|
|
nothing_to_change = false;
|
|
nothing_to_change = false;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -2397,9 +2375,8 @@ gb_internal int strip_semicolons(Parser *parser) {
|
|
isize generated_count = 0;
|
|
isize generated_count = 0;
|
|
bool failed = false;
|
|
bool failed = false;
|
|
|
|
|
|
- for_array(i, generated_files) {
|
|
|
|
- auto *file = &generated_files[i];
|
|
|
|
- char const *filename = cast(char const *)file->new_fullpath.text;
|
|
|
|
|
|
+ for (StripSemicolonFile &file : generated_files) {
|
|
|
|
+ char const *filename = cast(char const *)file.new_fullpath.text;
|
|
gbFileError err = gbFileError_None;
|
|
gbFileError err = gbFileError_None;
|
|
defer (if (err != gbFileError_None) {
|
|
defer (if (err != gbFileError_None) {
|
|
failed = true;
|
|
failed = true;
|
|
@@ -2417,11 +2394,11 @@ gb_internal int strip_semicolons(Parser *parser) {
|
|
defer (err = gb_file_truncate(&f, written));
|
|
defer (err = gb_file_truncate(&f, written));
|
|
|
|
|
|
debugf("Write file with stripped tokens: %s\n", filename);
|
|
debugf("Write file with stripped tokens: %s\n", filename);
|
|
- err = write_file_with_stripped_tokens(&f, file->file, &written);
|
|
|
|
|
|
+ err = write_file_with_stripped_tokens(&f, file.file, &written);
|
|
if (err) {
|
|
if (err) {
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
- file->written = written;
|
|
|
|
|
|
+ file.written = written;
|
|
}
|
|
}
|
|
|
|
|
|
if (failed) {
|
|
if (failed) {
|
|
@@ -2436,12 +2413,10 @@ gb_internal int strip_semicolons(Parser *parser) {
|
|
|
|
|
|
isize overwritten_files = 0;
|
|
isize overwritten_files = 0;
|
|
|
|
|
|
- for_array(i, generated_files) {
|
|
|
|
- auto *file = &generated_files[i];
|
|
|
|
-
|
|
|
|
- char const *old_fullpath = cast(char const *)file->old_fullpath.text;
|
|
|
|
- char const *old_fullpath_backup = cast(char const *)file->old_fullpath_backup.text;
|
|
|
|
- char const *new_fullpath = cast(char const *)file->new_fullpath.text;
|
|
|
|
|
|
+ for (StripSemicolonFile const &file : generated_files) {
|
|
|
|
+ char const *old_fullpath = cast(char const *)file.old_fullpath.text;
|
|
|
|
+ char const *old_fullpath_backup = cast(char const *)file.old_fullpath_backup.text;
|
|
|
|
+ char const *new_fullpath = cast(char const *)file.new_fullpath.text;
|
|
|
|
|
|
debugf("Copy '%s' to '%s'\n", old_fullpath, old_fullpath_backup);
|
|
debugf("Copy '%s' to '%s'\n", old_fullpath, old_fullpath_backup);
|
|
if (!gb_file_copy(old_fullpath, old_fullpath_backup, false)) {
|
|
if (!gb_file_copy(old_fullpath, old_fullpath_backup, false)) {
|