| author | |
| committer | |
| log | 783f73c7e3590f05825d66f1f0ccb108be74b5c4 |
| tree | 429e9e06852b06bd6758ab2bd7d53a240a71771c |
| parent | 6695fa4f326e807256b9afc6321e63a90b08e1ba |
| signature |
13 files changed, 122 insertions(+), 90 deletions(-)
src-self-hosted/clang_options_data.zig+5-5| ... | ... | @@ -7,7 +7,7 @@ flagpd1("CC"), |
| 7 | 7 | .{ |
| 8 | 8 | .name = "E", |
| 9 | 9 | .syntax = .flag, |
| 10 | .zig_equivalent = .preprocess, | |
| 10 | .zig_equivalent = .pp_or_asm, | |
| 11 | 11 | .pd1 = true, |
| 12 | 12 | .pd2 = false, |
| 13 | 13 | .psl = false, |
| ... | ... | @@ -53,7 +53,7 @@ flagpd1("Qy"), |
| 53 | 53 | .{ |
| 54 | 54 | .name = "S", |
| 55 | 55 | .syntax = .flag, |
| 56 | .zig_equivalent = .driver_punt, | |
| 56 | .zig_equivalent = .pp_or_asm, | |
| 57 | 57 | .pd1 = true, |
| 58 | 58 | .pd2 = false, |
| 59 | 59 | .psl = false, |
| ... | ... | @@ -154,7 +154,7 @@ sepd1("Zlinker-input"), |
| 154 | 154 | .{ |
| 155 | 155 | .name = "E", |
| 156 | 156 | .syntax = .flag, |
| 157 | .zig_equivalent = .preprocess, | |
| 157 | .zig_equivalent = .pp_or_asm, | |
| 158 | 158 | .pd1 = true, |
| 159 | 159 | .pd2 = false, |
| 160 | 160 | .psl = true, |
| ... | ... | @@ -1442,7 +1442,7 @@ sepd1("Zlinker-input"), |
| 1442 | 1442 | .{ |
| 1443 | 1443 | .name = "assemble", |
| 1444 | 1444 | .syntax = .flag, |
| 1445 | .zig_equivalent = .driver_punt, | |
| 1445 | .zig_equivalent = .pp_or_asm, | |
| 1446 | 1446 | .pd1 = false, |
| 1447 | 1447 | .pd2 = true, |
| 1448 | 1448 | .psl = false, |
| ... | ... | @@ -1770,7 +1770,7 @@ sepd1("Zlinker-input"), |
| 1770 | 1770 | .{ |
| 1771 | 1771 | .name = "preprocess", |
| 1772 | 1772 | .syntax = .flag, |
| 1773 | .zig_equivalent = .preprocess, | |
| 1773 | .zig_equivalent = .pp_or_asm, | |
| 1774 | 1774 | .pd1 = false, |
| 1775 | 1775 | .pd2 = true, |
| 1776 | 1776 | .psl = false, |
src-self-hosted/stage2.zig+1-1| ... | ... | @@ -1280,7 +1280,7 @@ pub const ClangArgIterator = extern struct { |
| 1280 | 1280 | shared, |
| 1281 | 1281 | rdynamic, |
| 1282 | 1282 | wl, |
| 1283 | preprocess, | |
| 1283 | pp_or_asm, | |
| 1284 | 1284 | optimize, |
| 1285 | 1285 | debug, |
| 1286 | 1286 | sanitize, |
src/all_types.hpp+10| ... | ... | @@ -54,6 +54,16 @@ struct ResultLocCast; |
| 54 | 54 | struct ResultLocReturn; |
| 55 | 55 | struct IrExecutableGen; |
| 56 | 56 | |
| 57 | enum FileExt { | |
| 58 | FileExtUnknown, | |
| 59 | FileExtAsm, | |
| 60 | FileExtC, | |
| 61 | FileExtCpp, | |
| 62 | FileExtHeader, | |
| 63 | FileExtLLVMIr, | |
| 64 | FileExtLLVMBitCode, | |
| 65 | }; | |
| 66 | ||
| 57 | 67 | enum PtrLen { |
| 58 | 68 | PtrLenUnknown, |
| 59 | 69 | PtrLenSingle, |
src/analyze.hpp+1-7| ... | ... | @@ -257,14 +257,8 @@ Error create_c_object_cache(CodeGen *g, CacheHash **out_cache_hash, bool verbose |
| 257 | 257 | LLVMTypeRef get_llvm_type(CodeGen *g, ZigType *type); |
| 258 | 258 | ZigLLVMDIType *get_llvm_di_type(CodeGen *g, ZigType *type); |
| 259 | 259 | |
| 260 | enum CSourceKind { | |
| 261 | CSourceKindAsm, | |
| 262 | CSourceKindC, | |
| 263 | CSourceKindCpp, | |
| 264 | }; | |
| 265 | ||
| 266 | 260 | void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_path, bool translate_c, |
| 267 | CSourceKind source_kind); | |
| 261 | FileExt source_kind); | |
| 268 | 262 | |
| 269 | 263 | void src_assert(bool ok, AstNode *source_node); |
| 270 | 264 | bool is_container(ZigType *type_entry); |
src/buffer.hpp+1-4| ... | ... | @@ -178,10 +178,7 @@ static inline bool buf_starts_with_str(Buf *buf, const char *str) { |
| 178 | 178 | } |
| 179 | 179 | |
| 180 | 180 | static inline bool buf_ends_with_mem(Buf *buf, const char *mem, size_t mem_len) { |
| 181 | if (buf_len(buf) < mem_len) { | |
| 182 | return false; | |
| 183 | } | |
| 184 | return memcmp(buf_ptr(buf) + buf_len(buf) - mem_len, mem, mem_len) == 0; | |
| 181 | return mem_ends_with_mem(buf_ptr(buf), buf_len(buf), mem, mem_len); | |
| 185 | 182 | } |
| 186 | 183 | |
| 187 | 184 | static inline bool buf_ends_with_str(Buf *buf, const char *str) { |
src/codegen.cpp+37-45| ... | ... | @@ -9170,20 +9170,13 @@ static void detect_libc(CodeGen *g) { |
| 9170 | 9170 | |
| 9171 | 9171 | // does not add the "cc" arg |
| 9172 | 9172 | void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_path, |
| 9173 | bool translate_c, CSourceKind source_kind) | |
| 9173 | bool translate_c, FileExt source_kind) | |
| 9174 | 9174 | { |
| 9175 | 9175 | if (translate_c) { |
| 9176 | 9176 | args.append("-x"); |
| 9177 | 9177 | args.append("c"); |
| 9178 | 9178 | } |
| 9179 | 9179 | |
| 9180 | if (source_kind != CSourceKindAsm && out_dep_path != nullptr) { | |
| 9181 | args.append("-MD"); | |
| 9182 | args.append("-MV"); | |
| 9183 | args.append("-MF"); | |
| 9184 | args.append(out_dep_path); | |
| 9185 | } | |
| 9186 | ||
| 9187 | 9180 | args.append("-nostdinc"); |
| 9188 | 9181 | args.append("-fno-spell-checking"); |
| 9189 | 9182 | |
| ... | ... | @@ -9191,14 +9184,7 @@ void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_pa |
| 9191 | 9184 | args.append("-ffunction-sections"); |
| 9192 | 9185 | } |
| 9193 | 9186 | |
| 9194 | if (translate_c) { | |
| 9195 | if (source_kind != CSourceKindAsm) { | |
| 9196 | // this gives us access to preprocessing entities, presumably at | |
| 9197 | // the cost of performance | |
| 9198 | args.append("-Xclang"); | |
| 9199 | args.append("-detailed-preprocessing-record"); | |
| 9200 | } | |
| 9201 | } else { | |
| 9187 | if (!translate_c) { | |
| 9202 | 9188 | switch (g->err_color) { |
| 9203 | 9189 | case ErrColorAuto: |
| 9204 | 9190 | break; |
| ... | ... | @@ -9232,24 +9218,25 @@ void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_pa |
| 9232 | 9218 | args.append("-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS"); |
| 9233 | 9219 | } |
| 9234 | 9220 | |
| 9235 | // According to Rich Felker libc headers are supposed to go before C language headers. | |
| 9236 | // However as noted by @dimenus, appending libc headers before c_headers breaks intrinsics | |
| 9237 | // and other compiler specific items. | |
| 9238 | args.append("-isystem"); | |
| 9239 | args.append(buf_ptr(g->zig_c_headers_dir)); | |
| 9240 | ||
| 9241 | for (size_t i = 0; i < g->libc_include_dir_len; i += 1) { | |
| 9242 | const char *include_dir = g->libc_include_dir_list[i]; | |
| 9243 | args.append("-isystem"); | |
| 9244 | args.append(include_dir); | |
| 9245 | } | |
| 9246 | ||
| 9247 | 9221 | args.append("-target"); |
| 9248 | 9222 | args.append(buf_ptr(&g->llvm_triple_str)); |
| 9249 | 9223 | |
| 9250 | 9224 | switch (source_kind) { |
| 9251 | case CSourceKindC: | |
| 9252 | case CSourceKindCpp: | |
| 9225 | case FileExtC: | |
| 9226 | case FileExtCpp: | |
| 9227 | case FileExtHeader: | |
| 9228 | // According to Rich Felker libc headers are supposed to go before C language headers. | |
| 9229 | // However as noted by @dimenus, appending libc headers before c_headers breaks intrinsics | |
| 9230 | // and other compiler specific items. | |
| 9231 | args.append("-isystem"); | |
| 9232 | args.append(buf_ptr(g->zig_c_headers_dir)); | |
| 9233 | ||
| 9234 | for (size_t i = 0; i < g->libc_include_dir_len; i += 1) { | |
| 9235 | const char *include_dir = g->libc_include_dir_list[i]; | |
| 9236 | args.append("-isystem"); | |
| 9237 | args.append(include_dir); | |
| 9238 | } | |
| 9239 | ||
| 9253 | 9240 | if (g->zig_target->llvm_cpu_name != nullptr) { |
| 9254 | 9241 | args.append("-Xclang"); |
| 9255 | 9242 | args.append("-target-cpu"); |
| ... | ... | @@ -9262,8 +9249,23 @@ void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_pa |
| 9262 | 9249 | args.append("-Xclang"); |
| 9263 | 9250 | args.append(g->zig_target->llvm_cpu_features); |
| 9264 | 9251 | } |
| 9252 | if (translate_c) { | |
| 9253 | // this gives us access to preprocessing entities, presumably at | |
| 9254 | // the cost of performance | |
| 9255 | args.append("-Xclang"); | |
| 9256 | args.append("-detailed-preprocessing-record"); | |
| 9257 | } | |
| 9258 | if (out_dep_path != nullptr) { | |
| 9259 | args.append("-MD"); | |
| 9260 | args.append("-MV"); | |
| 9261 | args.append("-MF"); | |
| 9262 | args.append(out_dep_path); | |
| 9263 | } | |
| 9265 | 9264 | break; |
| 9266 | case CSourceKindAsm: | |
| 9265 | case FileExtAsm: | |
| 9266 | case FileExtLLVMIr: | |
| 9267 | case FileExtLLVMBitCode: | |
| 9268 | case FileExtUnknown: | |
| 9267 | 9269 | break; |
| 9268 | 9270 | } |
| 9269 | 9271 | for (size_t i = 0; i < g->zig_target->llvm_cpu_features_asm_len; i += 1) { |
| ... | ... | @@ -9413,7 +9415,7 @@ void codegen_translate_c(CodeGen *g, Buf *full_path) { |
| 9413 | 9415 | } |
| 9414 | 9416 | |
| 9415 | 9417 | ZigList<const char *> clang_argv = {0}; |
| 9416 | add_cc_args(g, clang_argv, out_dep_path_cstr, true, CSourceKindC); | |
| 9418 | add_cc_args(g, clang_argv, out_dep_path_cstr, true, FileExtC); | |
| 9417 | 9419 | |
| 9418 | 9420 | clang_argv.append(buf_ptr(full_path)); |
| 9419 | 9421 | |
| ... | ... | @@ -9751,15 +9753,6 @@ static void gen_c_object(CodeGen *g, Buf *self_exe_path, CFile *c_file) { |
| 9751 | 9753 | Buf *c_source_basename = buf_alloc(); |
| 9752 | 9754 | os_path_split(c_source_file, nullptr, c_source_basename); |
| 9753 | 9755 | |
| 9754 | CSourceKind c_source_kind; | |
| 9755 | if (buf_ends_with_str(c_source_basename, ".s") || | |
| 9756 | buf_ends_with_str(c_source_basename, ".S")) | |
| 9757 | { | |
| 9758 | c_source_kind = CSourceKindAsm; | |
| 9759 | } else { | |
| 9760 | c_source_kind = CSourceKindC; | |
| 9761 | } | |
| 9762 | ||
| 9763 | 9756 | Stage2ProgressNode *child_prog_node = stage2_progress_start(g->sub_progress_node, buf_ptr(c_source_basename), |
| 9764 | 9757 | buf_len(c_source_basename), 0); |
| 9765 | 9758 | |
| ... | ... | @@ -9825,14 +9818,13 @@ static void gen_c_object(CodeGen *g, Buf *self_exe_path, CFile *c_file) { |
| 9825 | 9818 | args.append(buf_ptr(self_exe_path)); |
| 9826 | 9819 | args.append("clang"); |
| 9827 | 9820 | |
| 9828 | if (c_file->preprocessor_only_basename != nullptr) { | |
| 9829 | args.append("-E"); | |
| 9830 | } else { | |
| 9821 | if (c_file->preprocessor_only_basename == nullptr) { | |
| 9831 | 9822 | args.append("-c"); |
| 9832 | 9823 | } |
| 9833 | 9824 | |
| 9834 | 9825 | Buf *out_dep_path = buf_sprintf("%s.d", buf_ptr(out_obj_path)); |
| 9835 | add_cc_args(g, args, buf_ptr(out_dep_path), false, c_source_kind); | |
| 9826 | FileExt ext = classify_file_ext(buf_ptr(c_source_basename), buf_len(c_source_basename)); | |
| 9827 | add_cc_args(g, args, buf_ptr(out_dep_path), false, ext); | |
| 9836 | 9828 | |
| 9837 | 9829 | args.append("-o"); |
| 9838 | 9830 | args.append(buf_ptr(out_obj_path)); |
src/compiler.cpp+22| ... | ... | @@ -164,3 +164,25 @@ Buf *get_global_cache_dir(void) { |
| 164 | 164 | buf_deinit(&app_data_dir); |
| 165 | 165 | return &saved_global_cache_dir; |
| 166 | 166 | } |
| 167 | ||
| 168 | FileExt classify_file_ext(const char *filename_ptr, size_t filename_len) { | |
| 169 | if (mem_ends_with_str(filename_ptr, filename_len, ".c")) { | |
| 170 | return FileExtC; | |
| 171 | } else if (mem_ends_with_str(filename_ptr, filename_len, ".C") || | |
| 172 | mem_ends_with_str(filename_ptr, filename_len, ".cc") || | |
| 173 | mem_ends_with_str(filename_ptr, filename_len, ".cpp") || | |
| 174 | mem_ends_with_str(filename_ptr, filename_len, ".cxx")) | |
| 175 | { | |
| 176 | return FileExtCpp; | |
| 177 | } else if (mem_ends_with_str(filename_ptr, filename_len, ".ll")) { | |
| 178 | return FileExtLLVMIr; | |
| 179 | } else if (mem_ends_with_str(filename_ptr, filename_len, ".bc")) { | |
| 180 | return FileExtLLVMBitCode; | |
| 181 | } else if (mem_ends_with_str(filename_ptr, filename_len, ".s") || | |
| 182 | mem_ends_with_str(filename_ptr, filename_len, ".S")) | |
| 183 | { | |
| 184 | return FileExtAsm; | |
| 185 | } | |
| 186 | // TODO look for .so, .so.X, .so.X.Y, .so.X.Y.Z | |
| 187 | return FileExtUnknown; | |
| 188 | } |
src/compiler.hpp+4-2| ... | ... | @@ -8,8 +8,7 @@ |
| 8 | 8 | #ifndef ZIG_COMPILER_HPP |
| 9 | 9 | #define ZIG_COMPILER_HPP |
| 10 | 10 | |
| 11 | #include "buffer.hpp" | |
| 12 | #include "error.hpp" | |
| 11 | #include "all_types.hpp" | |
| 13 | 12 | |
| 14 | 13 | Error get_compiler_id(Buf **result); |
| 15 | 14 | |
| ... | ... | @@ -19,4 +18,7 @@ Buf *get_zig_std_dir(Buf *zig_lib_dir); |
| 19 | 18 | |
| 20 | 19 | Buf *get_global_cache_dir(void); |
| 21 | 20 | |
| 21 | ||
| 22 | FileExt classify_file_ext(const char *filename_ptr, size_t filename_len); | |
| 23 | ||
| 22 | 24 | #endif |
src/ir.cpp+1-1| ... | ... | @@ -25171,7 +25171,7 @@ static IrInstGen *ir_analyze_instruction_c_import(IrAnalyze *ira, IrInstSrcCImpo |
| 25171 | 25171 | |
| 25172 | 25172 | ZigList<const char *> clang_argv = {0}; |
| 25173 | 25173 | |
| 25174 | add_cc_args(ira->codegen, clang_argv, buf_ptr(tmp_dep_file), true, CSourceKindC); | |
| 25174 | add_cc_args(ira->codegen, clang_argv, buf_ptr(tmp_dep_file), true, FileExtC); | |
| 25175 | 25175 | |
| 25176 | 25176 | clang_argv.append(buf_ptr(&tmp_c_file_path)); |
| 25177 | 25177 |
src/main.cpp+26-20| ... | ... | @@ -455,7 +455,7 @@ static int main0(int argc, char **argv) { |
| 455 | 455 | const char *mcpu = nullptr; |
| 456 | 456 | CodeModel code_model = CodeModelDefault; |
| 457 | 457 | const char *override_soname = nullptr; |
| 458 | bool only_preprocess = false; | |
| 458 | bool only_pp_or_asm = false; | |
| 459 | 459 | bool ensure_libc_on_non_freestanding = false; |
| 460 | 460 | bool ensure_libcpp_on_non_freestanding = false; |
| 461 | 461 | |
| ... | ... | @@ -615,20 +615,22 @@ static int main0(int argc, char **argv) { |
| 615 | 615 | } |
| 616 | 616 | break; |
| 617 | 617 | case Stage2ClangArgPositional: { |
| 618 | Buf *arg_buf = buf_create_from_str(it.only_arg); | |
| 619 | if (buf_ends_with_str(arg_buf, ".c") || | |
| 620 | buf_ends_with_str(arg_buf, ".C") || | |
| 621 | buf_ends_with_str(arg_buf, ".cc") || | |
| 622 | buf_ends_with_str(arg_buf, ".cpp") || | |
| 623 | buf_ends_with_str(arg_buf, ".cxx") || | |
| 624 | buf_ends_with_str(arg_buf, ".s") || | |
| 625 | buf_ends_with_str(arg_buf, ".S")) | |
| 626 | { | |
| 627 | CFile *c_file = heap::c_allocator.create<CFile>(); | |
| 628 | c_file->source_path = it.only_arg; | |
| 629 | c_source_files.append(c_file); | |
| 630 | } else { | |
| 631 | objects.append(it.only_arg); | |
| 618 | FileExt file_ext = classify_file_ext(it.only_arg, strlen(it.only_arg)); | |
| 619 | switch (file_ext) { | |
| 620 | case FileExtAsm: | |
| 621 | case FileExtC: | |
| 622 | case FileExtCpp: | |
| 623 | case FileExtLLVMIr: | |
| 624 | case FileExtLLVMBitCode: | |
| 625 | case FileExtHeader: { | |
| 626 | CFile *c_file = heap::c_allocator.create<CFile>(); | |
| 627 | c_file->source_path = it.only_arg; | |
| 628 | c_source_files.append(c_file); | |
| 629 | break; | |
| 630 | } | |
| 631 | case FileExtUnknown: | |
| 632 | objects.append(it.only_arg); | |
| 633 | break; | |
| 632 | 634 | } |
| 633 | 635 | break; |
| 634 | 636 | } |
| ... | ... | @@ -674,8 +676,12 @@ static int main0(int argc, char **argv) { |
| 674 | 676 | } |
| 675 | 677 | break; |
| 676 | 678 | } |
| 677 | case Stage2ClangArgPreprocess: | |
| 678 | only_preprocess = true; | |
| 679 | case Stage2ClangArgPreprocessOrAsm: | |
| 680 | // this handles both -E and -S | |
| 681 | only_pp_or_asm = true; | |
| 682 | for (size_t i = 0; i < it.other_args_len; i += 1) { | |
| 683 | clang_argv.append(it.other_args_ptr[i]); | |
| 684 | } | |
| 679 | 685 | break; |
| 680 | 686 | case Stage2ClangArgOptimize: |
| 681 | 687 | // alright what release mode do they want? |
| ... | ... | @@ -799,7 +805,7 @@ static int main0(int argc, char **argv) { |
| 799 | 805 | build_mode = BuildModeSafeRelease; |
| 800 | 806 | } |
| 801 | 807 | |
| 802 | if (only_preprocess) { | |
| 808 | if (only_pp_or_asm) { | |
| 803 | 809 | cmd = CmdBuild; |
| 804 | 810 | out_type = OutTypeObj; |
| 805 | 811 | emit_bin = false; |
| ... | ... | @@ -1597,7 +1603,7 @@ static int main0(int argc, char **argv) { |
| 1597 | 1603 | #endif |
| 1598 | 1604 | Buf *dest_path = buf_create_from_str(emit_bin_override_path); |
| 1599 | 1605 | Buf *source_path; |
| 1600 | if (only_preprocess) { | |
| 1606 | if (only_pp_or_asm) { | |
| 1601 | 1607 | source_path = buf_alloc(); |
| 1602 | 1608 | Buf *pp_only_basename = buf_create_from_str( |
| 1603 | 1609 | c_source_files.at(0)->preprocessor_only_basename); |
| ... | ... | @@ -1611,7 +1617,7 @@ static int main0(int argc, char **argv) { |
| 1611 | 1617 | buf_ptr(dest_path), err_str(err)); |
| 1612 | 1618 | return main_exit(root_progress_node, EXIT_FAILURE); |
| 1613 | 1619 | } |
| 1614 | } else if (only_preprocess) { | |
| 1620 | } else if (only_pp_or_asm) { | |
| 1615 | 1621 | #if defined(ZIG_OS_WINDOWS) |
| 1616 | 1622 | buf_replace(g->c_artifact_dir, '/', '\\'); |
| 1617 | 1623 | #endif |
src/stage2.h+1-1| ... | ... | @@ -339,7 +339,7 @@ enum Stage2ClangArg { |
| 339 | 339 | Stage2ClangArgShared, |
| 340 | 340 | Stage2ClangArgRDynamic, |
| 341 | 341 | Stage2ClangArgWL, |
| 342 | Stage2ClangArgPreprocess, | |
| 342 | Stage2ClangArgPreprocessOrAsm, | |
| 343 | 343 | Stage2ClangArgOptimize, |
| 344 | 344 | Stage2ClangArgDebug, |
| 345 | 345 | Stage2ClangArgSanitize, |
src/util.hpp+9| ... | ... | @@ -100,6 +100,15 @@ static inline bool is_power_of_2(uint64_t x) { |
| 100 | 100 | return x != 0 && ((x & (~x + 1)) == x); |
| 101 | 101 | } |
| 102 | 102 | |
| 103 | static inline bool mem_ends_with_mem(const char *mem, size_t mem_len, const char *end, size_t end_len) { | |
| 104 | if (mem_len < end_len) return false; | |
| 105 | return memcmp(mem + mem_len - end_len, end, end_len) == 0; | |
| 106 | } | |
| 107 | ||
| 108 | static inline bool mem_ends_with_str(const char *mem, size_t mem_len, const char *str) { | |
| 109 | return mem_ends_with_mem(mem, mem_len, str, strlen(str)); | |
| 110 | } | |
| 111 | ||
| 103 | 112 | static inline uint64_t round_to_next_power_of_2(uint64_t x) { |
| 104 | 113 | --x; |
| 105 | 114 | x |= x >> 1; |
tools/update_clang_options.zig+4-4| ... | ... | @@ -96,19 +96,19 @@ const known_options = [_]KnownOpt{ |
| 96 | 96 | }, |
| 97 | 97 | .{ |
| 98 | 98 | .name = "E", |
| 99 | .ident = "preprocess", | |
| 99 | .ident = "pp_or_asm", | |
| 100 | 100 | }, |
| 101 | 101 | .{ |
| 102 | 102 | .name = "preprocess", |
| 103 | .ident = "preprocess", | |
| 103 | .ident = "pp_or_asm", | |
| 104 | 104 | }, |
| 105 | 105 | .{ |
| 106 | 106 | .name = "S", |
| 107 | .ident = "driver_punt", | |
| 107 | .ident = "pp_or_asm", | |
| 108 | 108 | }, |
| 109 | 109 | .{ |
| 110 | 110 | .name = "assemble", |
| 111 | .ident = "driver_punt", | |
| 111 | .ident = "pp_or_asm", | |
| 112 | 112 | }, |
| 113 | 113 | .{ |
| 114 | 114 | .name = "O1", |