1515
1616module build_target;
1717
18- import library_list ;
18+ import file_list local ;
1919import src_loc local;
2020import string_list;
2121import string_pool;
@@ -35,6 +35,7 @@ public type Kind enum u8 {
3535 Executable,
3636 StaticLibrary,
3737 DynamicLibrary,
38+ SourceLibrary,
3839}
3940
4041public fn bool has_dynamic(Kind k) {
@@ -47,6 +48,8 @@ public fn bool has_dynamic(Kind k) {
4748 return false;
4849 case DynamicLibrary:
4950 return true;
51+ case SourceLibrary:
52+ return false;
5053 }
5154 return false;
5255}
@@ -94,11 +97,6 @@ public fn void PluginList.add(PluginList* l, u32 name, u32 options, SrcLoc loc)
9497 l.count++;
9598}
9699
97- public type File struct {
98- u32 name; // index into auxPool
99- SrcLoc loc;
100- }
101-
102100public type Target struct @(opaque) {
103101 u32 name_idx; // index into auxPool
104102 SrcLoc loc;
@@ -112,17 +110,12 @@ public type Target struct @(opaque) {
112110 bool backend_fast;
113111
114112 string_list.List features;
115- library_list. List libs;
113+ List libs;
116114 string_list.List exports;
117115 PluginList plugins;
118116
119- File* files;
120- u32 num_files;
121- u32 max_files;
122-
123- File* asm_files;
124- u32 asm_file_count;
125- u32 asm_file_max;
117+ FileList files;
118+ FileList asm_files;
126119}
127120
128121public fn Target* create(u32 name_idx, SrcLoc loc, Kind kind, string_pool.Pool* pool) {
@@ -132,13 +125,11 @@ public fn Target* create(u32 name_idx, SrcLoc loc, Kind kind, string_pool.Pool*
132125 // remove this once the bootstrap handles improved flow analysis
133126 t.warnings.no_unreachable_code = true;
134127 t.kind = kind;
135- t.max_files = 8;
136128 t.features.init(pool);
137129 t.libs.init();
138130 t.exports.init(pool);
139- t.files = stdlib.malloc(t.max_files * sizeof(File));
140- t.asm_file_max = 4;
141- t.asm_files = stdlib.malloc(t.asm_file_max * sizeof(File));
131+ t.files.init(8);
132+ t.asm_files.init(0);
142133 return t;
143134}
144135
@@ -147,8 +138,8 @@ public fn void Target.free(Target* t) {
147138 t.plugins.free();
148139 t.libs.free();
149140 t.features.free();
150- stdlib. free(t.files );
151- stdlib. free(t.asm_files );
141+ t.asm_files. free();
142+ t.files. free();
152143 stdlib.free(t);
153144}
154145
@@ -158,9 +149,9 @@ public fn void Target.setNameIdx(Target* t, u32 name_idx) {
158149 t.name_idx = name_idx;
159150}
160151
161- public fn u32 Target.numFiles(const Target* t) { return t.num_files ; }
152+ public fn u32 Target.numFiles(const Target* t) { return t.files.getCount() ; }
162153
163- public fn u32 Target.numAsmFiles(const Target* t) { return t.asm_file_count ; }
154+ public fn u32 Target.numAsmFiles(const Target* t) { return t.asm_files.getCount() ; }
164155
165156public fn const string_list.List* Target.getFeatures(const Target* t) { return &t.features; }
166157
@@ -179,16 +170,18 @@ public fn void Target.disableAsserts(Target* t) { t.disable_asserts = true; }
179170
180171public fn bool Target.hasAsserts(const Target* t) { return !t.disable_asserts; }
181172
182- public fn void Target.visitLibs(const Target* t, library_list.Visitor visitor, void* arg) {
173+ public type Visitor fn void (void* arg, u32 name, Kind kind);
174+
175+ public fn void Target.visitLibs(const Target* t, Visitor visitor, void* arg) {
183176 t.libs.visit(visitor, arg);
184177}
185178
186179public fn bool Target.hasLib(const Target* t, u32 lib) {
187180 return t.libs.contains(lib);
188181}
189182
190- public fn void Target.addLib(Target* t, u32 lib, bool is_static ) {
191- t.libs.add(lib, is_static );
183+ public fn void Target.addLib(Target* t, u32 lib, Kind kind ) {
184+ t.libs.add(lib, kind );
192185}
193186
194187public fn void Target.disableWarnings(Target* t) {
@@ -242,57 +235,26 @@ public fn bool Target.needsMain(const Target* t) {
242235 return true;
243236 case StaticLibrary:
244237 case DynamicLibrary:
238+ case SourceLibrary:
245239 break;
246240 }
247241 return false;
248242}
249243
250244public fn bool Target.addFile(Target* t, u32 filename, SrcLoc loc) {
251- // check for duplicates
252- for (u32 i=0; i<t.num_files; i++) {
253- if (t.files[i].name == filename) return false;
254- }
255-
256- if (t.num_files == t.max_files) {
257- t.max_files *= 2;
258- File* files2 = stdlib.malloc(t.max_files * sizeof(File));
259- string.memcpy(files2, t.files, t.num_files * sizeof(File));
260- stdlib.free(t.files);
261- t.files = files2;
262- }
263-
264- t.files[t.num_files].name = filename;
265- t.files[t.num_files].loc = loc;
266- t.num_files++;
267- return true;
245+ return t.files.add(filename, loc);
268246}
269247
270248public fn const File* Target.getFile(const Target* t, u32 idx) {
271- return & t.files[ idx] ;
249+ return t.files.get( idx) ;
272250}
273251
274252public fn bool Target.addAsmFile(Target* t, u32 filename, SrcLoc loc) {
275- // check for duplicates
276- for (u32 i=0; i<t.asm_file_count; i++) {
277- if (t.asm_files[i].name == filename) return false;
278- }
279-
280- if (t.asm_file_count == t.asm_file_max) {
281- t.asm_file_max *= 2;
282- File* files2 = stdlib.malloc(t.asm_file_max * sizeof(File));
283- string.memcpy(files2, t.files, t.asm_file_count * sizeof(File));
284- stdlib.free(t.asm_files);
285- t.asm_files = files2;
286- }
287-
288- t.asm_files[t.asm_file_count].name = filename;
289- t.asm_files[t.asm_file_count].loc = loc;
290- t.asm_file_count++;
291- return true;
253+ return t.asm_files.add(filename, loc);
292254}
293255
294256public fn const File* Target.getAsmFile(const Target* t, u32 idx) {
295- return & t.asm_files[ idx] ;
257+ return t.asm_files.get( idx) ;
296258}
297259
298260public fn void Target.setNoLibC(Target* t) {
0 commit comments