authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-11-26 19:59:33-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-11-26 19:59:33-07:00
logb097545a5f2b01392c60014e1caded9dccc4b34d
tree5e3dfe2fb35fa1cc121cf1c4a26839ac64113f40
parenteec825cea21048461aa4bb6a057e7179d9a118bc

zig cc: honor all -m and -mno- CPU feature flags

closes #9196

5 files changed, 453 insertions(+), 320 deletions(-)

lib/std/zig/cross_target.zig+15
......@@ -323,6 +323,21 @@ pub const CrossTarget = struct {
323323 return result;
324324 }
325325
326 /// Similar to `parse` except instead of fully parsing, it only determines the CPU
327 /// architecture and returns it if it can be determined, and returns `null` otherwise.
328 /// This is intended to be used if the API user of CrossTarget needs to learn the
329 /// target CPU architecture in order to fully populate `ParseOptions`.
330 pub fn parseCpuArch(args: ParseOptions) ?Target.Cpu.Arch {
331 var it = mem.split(u8, args.arch_os_abi, "-");
332 const arch_name = it.next().?;
333 const arch_is_native = mem.eql(u8, arch_name, "native");
334 if (arch_is_native) {
335 return builtin.cpu.arch;
336 } else {
337 return std.meta.stringToEnum(Target.Cpu.Arch, arch_name);
338 }
339 }
340
326341 /// TODO deprecated, use `std.zig.system.NativeTargetInfo.detect`.
327342 pub fn getCpu(self: CrossTarget) Target.Cpu {
328343 switch (self.cpu_model) {
src/clang_options.zig+10
......@@ -132,3 +132,13 @@ pub fn sepd1(name: []const u8) CliArg {
132132 .pd1 = true,
133133 };
134134}
135
136/// Shortcut function for initializing a `CliArg`
137pub fn m(name: []const u8) CliArg {
138 return .{
139 .name = name,
140 .syntax = .flag,
141 .zig_equivalent = .m,
142 .pd1 = true,
143 };
144}
src/clang_options_data.zig+309-308
......@@ -7,6 +7,7 @@ const flagpsl = clang_options.flagpsl;
77const joinpd1 = clang_options.joinpd1;
88const jspd1 = clang_options.jspd1;
99const sepd1 = clang_options.sepd1;
10const m = clang_options.m;
1011pub const data = blk: { @setEvalBranchQuota(6000); break :blk &[_]CliArg{
1112flagpd1("C"),
1213flagpd1("CC"),
......@@ -3771,8 +3772,8 @@ sepd1("lazy_library"),
37713772sepd1("load"),
37723773flagpd1("m16"),
37733774flagpd1("m32"),
3774flagpd1("m3dnow"),
3775flagpd1("m3dnowa"),
3775m("m3dnow"),
3776m("m3dnowa"),
37763777flagpd1("m64"),
37773778flagpd1("m68000"),
37783779flagpd1("m68010"),
......@@ -3781,110 +3782,110 @@ flagpd1("m68030"),
37813782flagpd1("m68040"),
37823783flagpd1("m68060"),
37833784flagpd1("m80387"),
3784flagpd1("mseses"),
3785m("mseses"),
37853786flagpd1("mabi=ieeelongdouble"),
37863787flagpd1("mabi=vec-default"),
37873788flagpd1("mabi=vec-extabi"),
37883789flagpd1("mabicalls"),
3789flagpd1("madx"),
3790flagpd1("maes"),
3790m("madx"),
3791m("maes"),
37913792sepd1("main-file-name"),
37923793flagpd1("maix-struct-return"),
37933794flagpd1("malign-double"),
3794flagpd1("maltivec"),
3795m("maltivec"),
37953796flagpd1("mamdgpu-ieee"),
3796flagpd1("mamx-bf16"),
3797flagpd1("mamx-tile"),
3797m("mamx-bf16"),
3798m("mamx-tile"),
37983799flagpd1("marm"),
37993800flagpd1("massembler-fatal-warnings"),
38003801flagpd1("massembler-no-warn"),
3801flagpd1("matomics"),
3802flagpd1("mavx"),
3803flagpd1("mavx2"),
3804flagpd1("mavx512bf16"),
3805flagpd1("mavx512bitalg"),
3806flagpd1("mavx512bw"),
3807flagpd1("mavx512cd"),
3808flagpd1("mavx512dq"),
3809flagpd1("mavx512er"),
3810flagpd1("mavx512f"),
3811flagpd1("mavx512ifma"),
3812flagpd1("mavx512pf"),
3813flagpd1("mavx512vbmi"),
3814flagpd1("mavx512vbmi2"),
3815flagpd1("mavx512vl"),
3816flagpd1("mavx512vnni"),
3817flagpd1("mavx512vp2intersect"),
3818flagpd1("mavx512vpopcntdq"),
3819flagpd1("mavxvnni"),
3802m("matomics"),
3803m("mavx"),
3804m("mavx2"),
3805m("mavx512bf16"),
3806m("mavx512bitalg"),
3807m("mavx512bw"),
3808m("mavx512cd"),
3809m("mavx512dq"),
3810m("mavx512er"),
3811m("mavx512f"),
3812m("mavx512ifma"),
3813m("mavx512pf"),
3814m("mavx512vbmi"),
3815m("mavx512vbmi2"),
3816m("mavx512vl"),
3817m("mavx512vnni"),
3818m("mavx512vp2intersect"),
3819m("mavx512vpopcntdq"),
3820m("mavxvnni"),
38203821flagpd1("mbackchain"),
38213822flagpd1("mbig-endian"),
3822flagpd1("mbmi"),
3823flagpd1("mbmi2"),
3823m("mbmi"),
3824m("mbmi2"),
38243825flagpd1("mbranch-likely"),
38253826flagpd1("mbranch-target-enforce"),
38263827flagpd1("mbranches-within-32B-boundaries"),
3827flagpd1("mbulk-memory"),
3828m("mbulk-memory"),
38283829flagpd1("mcheck-zero-division"),
3829flagpd1("mcldemote"),
3830flagpd1("mclflushopt"),
3831flagpd1("mclwb"),
3832flagpd1("mclzero"),
3830m("mcldemote"),
3831m("mclflushopt"),
3832m("mclwb"),
3833m("mclzero"),
38333834flagpd1("mcmodel=medany"),
38343835flagpd1("mcmodel=medlow"),
3835flagpd1("mcmpb"),
3836m("mcmpb"),
38363837flagpd1("mcmse"),
38373838flagpd1("mcode-object-v3"),
38383839flagpd1("mconstant-cfstrings"),
38393840flagpd1("mconstructor-aliases"),
38403841flagpd1("mcpu=?"),
3841flagpd1("mcrbits"),
3842flagpd1("mcrc"),
3843flagpd1("mcumode"),
3844flagpd1("mcx16"),
3842m("mcrbits"),
3843m("mcrc"),
3844m("mcumode"),
3845m("mcx16"),
38453846sepd1("mdebug-pass"),
3846flagpd1("mdirect-move"),
3847m("mdirect-move"),
38473848flagpd1("mdisable-tail-calls"),
38483849flagpd1("mdouble-float"),
3849flagpd1("mdsp"),
3850flagpd1("mdspr2"),
3850m("mdsp"),
3851m("mdspr2"),
38513852sepd1("meabi"),
3852flagpd1("mefpu2"),
3853m("mefpu2"),
38533854flagpd1("membedded-data"),
38543855flagpd1("menable-experimental-extensions"),
38553856flagpd1("menable-no-infs"),
38563857flagpd1("menable-no-nans"),
38573858flagpd1("menable-unsafe-fp-math"),
3858flagpd1("menqcmd"),
3859flagpd1("mexception-handling"),
3860flagpd1("mexecute-only"),
3859m("menqcmd"),
3860m("mexception-handling"),
3861m("mexecute-only"),
38613862flagpd1("mextern-sdata"),
3862flagpd1("mf16c"),
3863m("mf16c"),
38633864flagpd1("mfancy-math-387"),
38643865flagpd1("mfentry"),
38653866flagpd1("mfix-and-continue"),
38663867flagpd1("mfix-cortex-a53-835769"),
3867flagpd1("mfloat128"),
3868m("mfloat128"),
38683869sepd1("mfloat-abi"),
3869flagpd1("mfma"),
3870flagpd1("mfma4"),
3870m("mfma"),
3871m("mfma4"),
38713872flagpd1("mfp32"),
3872flagpd1("mfp64"),
3873m("mfp64"),
38733874sepd1("mfpmath"),
3874flagpd1("mfprnd"),
3875flagpd1("mfpxx"),
3876flagpd1("mfsgsbase"),
3877flagpd1("mfxsr"),
3875m("mfprnd"),
3876m("mfpxx"),
3877m("mfsgsbase"),
3878m("mfxsr"),
38783879flagpd1("mgeneral-regs-only"),
3879flagpd1("mgfni"),
3880flagpd1("mginv"),
3880m("mgfni"),
3881m("mginv"),
38813882flagpd1("mglibc"),
38823883flagpd1("mglobal-merge"),
38833884flagpd1("mgpopt"),
3884flagpd1("mhard-float"),
3885flagpd1("mhvx"),
3886flagpd1("mhreset"),
3887flagpd1("mhtm"),
3885m("mhard-float"),
3886m("mhvx"),
3887m("mhreset"),
3888m("mhtm"),
38883889flagpd1("miamcu"),
38893890flagpd1("mieee-fp"),
38903891flagpd1("mieee-rnd-near"),
......@@ -3895,8 +3896,8 @@ flagpd1("no-ns-alloc-error"),
38953896flagpd1("mimplicit-float"),
38963897flagpd1("mincremental-linker-compatible"),
38973898flagpd1("minline-all-stringops"),
3898flagpd1("minvariant-function-descriptors"),
3899flagpd1("minvpcid"),
3899m("minvariant-function-descriptors"),
3900m("minvpcid"),
39003901flagpd1("mips1"),
39013902flagpd1("mips16"),
39023903flagpd1("mips2"),
......@@ -3913,9 +3914,9 @@ flagpd1("mips64r2"),
39133914flagpd1("mips64r3"),
39143915flagpd1("mips64r5"),
39153916flagpd1("mips64r6"),
3916flagpd1("misel"),
3917m("misel"),
39173918flagpd1("mkernel"),
3918flagpd1("mkl"),
3919m("mkl"),
39193920flagpd1("mldc1-sdc1"),
39203921sepd1("mlimit-float-precision"),
39213922sepd1("mlink-bitcode-file"),
......@@ -3924,166 +3925,166 @@ sepd1("mlink-cuda-bitcode"),
39243925flagpd1("mlittle-endian"),
39253926sepd1("mllvm"),
39263927flagpd1("mlocal-sdata"),
3927flagpd1("mlong-calls"),
3928m("mlong-calls"),
39283929flagpd1("mlong-double-128"),
39293930flagpd1("mlong-double-64"),
39303931flagpd1("mlong-double-80"),
3931flagpd1("mlongcall"),
3932flagpd1("mlvi-cfi"),
3932m("mlongcall"),
3933m("mlvi-cfi"),
39333934flagpd1("mlvi-hardening"),
3934flagpd1("mlwp"),
3935flagpd1("mlzcnt"),
3935m("mlwp"),
3936m("mlzcnt"),
39363937flagpd1("mmadd4"),
39373938flagpd1("mmark-bti-property"),
3938flagpd1("mmemops"),
3939m("mmemops"),
39393940flagpd1("mmfcrf"),
3940flagpd1("mmfocrf"),
3941flagpd1("mmicromips"),
3942flagpd1("mmma"),
3943flagpd1("mmmx"),
3944flagpd1("mmovbe"),
3945flagpd1("mmovdir64b"),
3946flagpd1("mmovdiri"),
3941m("mmfocrf"),
3942m("mmicromips"),
3943m("mmma"),
3944m("mmmx"),
3945m("mmovbe"),
3946m("mmovdir64b"),
3947m("mmovdiri"),
39473948flagpd1("mmpx"),
39483949flagpd1("mms-bitfields"),
3949flagpd1("mmsa"),
3950flagpd1("mmt"),
3951flagpd1("mmultivalue"),
3952flagpd1("mmutable-globals"),
3953flagpd1("mmwaitx"),
3954flagpd1("mno-3dnow"),
3955flagpd1("mno-3dnowa"),
3950m("mmsa"),
3951m("mmt"),
3952m("mmultivalue"),
3953m("mmutable-globals"),
3954m("mmwaitx"),
3955m("mno-3dnow"),
3956m("mno-3dnowa"),
39563957flagpd1("mno-80387"),
39573958flagpd1("mno-abicalls"),
3958flagpd1("mno-adx"),
3959flagpd1("mno-aes"),
3960flagpd1("mno-altivec"),
3959m("mno-adx"),
3960m("mno-aes"),
3961m("mno-altivec"),
39613962flagpd1("mno-amdgpu-ieee"),
3962flagpd1("mno-amx-bf16"),
3963flagpd1("mno-amx-int8"),
3964flagpd1("mno-amx-tile"),
3965flagpd1("mno-atomics"),
3966flagpd1("mno-avx"),
3967flagpd1("mno-avx2"),
3968flagpd1("mno-avx512bf16"),
3969flagpd1("mno-avx512bitalg"),
3970flagpd1("mno-avx512bw"),
3971flagpd1("mno-avx512cd"),
3972flagpd1("mno-avx512dq"),
3973flagpd1("mno-avx512er"),
3974flagpd1("mno-avx512f"),
3975flagpd1("mno-avx512ifma"),
3976flagpd1("mno-avx512pf"),
3977flagpd1("mno-avx512vbmi"),
3978flagpd1("mno-avx512vbmi2"),
3979flagpd1("mno-avx512vl"),
3980flagpd1("mno-avx512vnni"),
3981flagpd1("mno-avx512vp2intersect"),
3982flagpd1("mno-avx512vpopcntdq"),
3983flagpd1("mno-avxvnni"),
3963m("mno-amx-bf16"),
3964m("mno-amx-int8"),
3965m("mno-amx-tile"),
3966m("mno-atomics"),
3967m("mno-avx"),
3968m("mno-avx2"),
3969m("mno-avx512bf16"),
3970m("mno-avx512bitalg"),
3971m("mno-avx512bw"),
3972m("mno-avx512cd"),
3973m("mno-avx512dq"),
3974m("mno-avx512er"),
3975m("mno-avx512f"),
3976m("mno-avx512ifma"),
3977m("mno-avx512pf"),
3978m("mno-avx512vbmi"),
3979m("mno-avx512vbmi2"),
3980m("mno-avx512vl"),
3981m("mno-avx512vnni"),
3982m("mno-avx512vp2intersect"),
3983m("mno-avx512vpopcntdq"),
3984m("mno-avxvnni"),
39843985flagpd1("mno-backchain"),
3985flagpd1("mno-bmi"),
3986flagpd1("mno-bmi2"),
3986m("mno-bmi"),
3987m("mno-bmi2"),
39873988flagpd1("mno-branch-likely"),
3988flagpd1("mno-bulk-memory"),
3989m("mno-bulk-memory"),
39893990flagpd1("mno-check-zero-division"),
3990flagpd1("mno-cldemote"),
3991flagpd1("mno-clflushopt"),
3992flagpd1("mno-clwb"),
3993flagpd1("mno-clzero"),
3994flagpd1("mno-cmpb"),
3991m("mno-cldemote"),
3992m("mno-clflushopt"),
3993m("mno-clwb"),
3994m("mno-clzero"),
3995m("mno-cmpb"),
39953996flagpd1("mno-code-object-v3"),
39963997flagpd1("mno-constant-cfstrings"),
3997flagpd1("mno-crbits"),
3998flagpd1("mno-crc"),
3999flagpd1("mno-cumode"),
4000flagpd1("mno-cx16"),
4001flagpd1("mno-dsp"),
4002flagpd1("mno-dspr2"),
3998m("mno-crbits"),
3999m("mno-crc"),
4000m("mno-cumode"),
4001m("mno-cx16"),
4002m("mno-dsp"),
4003m("mno-dspr2"),
40034004flagpd1("mno-embedded-data"),
4004flagpd1("mno-enqcmd"),
4005flagpd1("mno-exception-handling"),
4005m("mno-enqcmd"),
4006m("mno-exception-handling"),
40064007flagpd1("mnoexecstack"),
4007flagpd1("mno-execute-only"),
4008m("mno-execute-only"),
40084009flagpd1("mno-extern-sdata"),
4009flagpd1("mno-f16c"),
4010m("mno-f16c"),
40104011flagpd1("mno-fix-cortex-a53-835769"),
4011flagpd1("mno-float128"),
4012flagpd1("mno-fma"),
4013flagpd1("mno-fma4"),
4014flagpd1("mno-fprnd"),
4015flagpd1("mno-fsgsbase"),
4016flagpd1("mno-fxsr"),
4017flagpd1("mno-gfni"),
4018flagpd1("mno-ginv"),
4012m("mno-float128"),
4013m("mno-fma"),
4014m("mno-fma4"),
4015m("mno-fprnd"),
4016m("mno-fsgsbase"),
4017m("mno-fxsr"),
4018m("mno-gfni"),
4019m("mno-ginv"),
40194020flagpd1("mno-global-merge"),
40204021flagpd1("mno-gpopt"),
4021flagpd1("mno-hvx"),
4022flagpd1("mno-hreset"),
4023flagpd1("mno-htm"),
4022m("mno-hvx"),
4023m("mno-hreset"),
4024m("mno-htm"),
40244025flagpd1("mno-iamcu"),
40254026flagpd1("mno-implicit-float"),
40264027flagpd1("mno-incremental-linker-compatible"),
40274028flagpd1("mno-inline-all-stringops"),
4028flagpd1("mno-invariant-function-descriptors"),
4029flagpd1("mno-invpcid"),
4030flagpd1("mno-isel"),
4031flagpd1("mno-kl"),
4029m("mno-invariant-function-descriptors"),
4030m("mno-invpcid"),
4031m("mno-isel"),
4032m("mno-kl"),
40324033flagpd1("mno-ldc1-sdc1"),
40334034flagpd1("mno-local-sdata"),
4034flagpd1("mno-long-calls"),
4035flagpd1("mno-longcall"),
4036flagpd1("mno-lvi-cfi"),
4035m("mno-long-calls"),
4036m("mno-longcall"),
4037m("mno-lvi-cfi"),
40374038flagpd1("mno-lvi-hardening"),
4038flagpd1("mno-lwp"),
4039flagpd1("mno-lzcnt"),
4039m("mno-lwp"),
4040m("mno-lzcnt"),
40404041flagpd1("mno-madd4"),
4041flagpd1("mno-memops"),
4042m("mno-memops"),
40424043flagpd1("mno-mfcrf"),
4043flagpd1("mno-mfocrf"),
4044flagpd1("mno-micromips"),
4045flagpd1("mno-mips16"),
4046flagpd1("mno-mma"),
4047flagpd1("mno-mmx"),
4048flagpd1("mno-movbe"),
4049flagpd1("mno-movdir64b"),
4050flagpd1("mno-movdiri"),
4051flagpd1("mno-movt"),
4044m("mno-mfocrf"),
4045m("mno-micromips"),
4046m("mno-mips16"),
4047m("mno-mma"),
4048m("mno-mmx"),
4049m("mno-movbe"),
4050m("mno-movdir64b"),
4051m("mno-movdiri"),
4052m("mno-movt"),
40524053flagpd1("mno-mpx"),
40534054flagpd1("mno-ms-bitfields"),
4054flagpd1("mno-msa"),
4055flagpd1("mno-mt"),
4056flagpd1("mno-multivalue"),
4057flagpd1("mno-mutable-globals"),
4058flagpd1("mno-mwaitx"),
4059flagpd1("mno-neg-immediates"),
4060flagpd1("mno-nontrapping-fptoint"),
4061flagpd1("mno-nvj"),
4062flagpd1("mno-nvs"),
4055m("mno-msa"),
4056m("mno-mt"),
4057m("mno-multivalue"),
4058m("mno-mutable-globals"),
4059m("mno-mwaitx"),
4060m("mno-neg-immediates"),
4061m("mno-nontrapping-fptoint"),
4062m("mno-nvj"),
4063m("mno-nvs"),
40634064flagpd1("mno-odd-spreg"),
40644065flagpd1("mno-omit-leaf-frame-pointer"),
40654066flagpd1("mno-outline"),
4066flagpd1("mno-outline-atomics"),
4067m("mno-outline-atomics"),
40674068flagpd1("mno-packed-stack"),
4068flagpd1("mno-packets"),
4069m("mno-packets"),
40694070flagpd1("mno-pascal-strings"),
4070flagpd1("mno-pclmul"),
4071flagpd1("mno-pconfig"),
4071m("mno-pclmul"),
4072m("mno-pconfig"),
40724073flagpd1("mno-pcrel"),
4073flagpd1("mno-pku"),
4074flagpd1("mno-popcnt"),
4075flagpd1("mno-popcntd"),
4076flagpd1("mno-power10-vector"),
4077flagpd1("mno-power8-vector"),
4078flagpd1("mno-power9-vector"),
4079flagpd1("mno-prefetchwt1"),
4074m("mno-pku"),
4075m("mno-popcnt"),
4076m("mno-popcntd"),
4077m("mno-power10-vector"),
4078m("mno-power8-vector"),
4079m("mno-power9-vector"),
4080m("mno-prefetchwt1"),
40804081flagpd1("mno-prefixed"),
4081flagpd1("mno-prfchw"),
4082flagpd1("mno-ptwrite"),
4082m("mno-prfchw"),
4083m("mno-ptwrite"),
40834084flagpd1("mno-pure-code"),
4084flagpd1("mno-rdpid"),
4085flagpd1("mno-rdrnd"),
4086flagpd1("mno-rdseed"),
4085m("mno-rdpid"),
4086m("mno-rdrnd"),
4087m("mno-rdseed"),
40874088.{
40884089 .name = "mno-red-zone",
40894090 .syntax = .flag,
......@@ -4092,73 +4093,73 @@ flagpd1("mno-rdseed"),
40924093 .pd2 = false,
40934094 .psl = false,
40944095},
4095flagpd1("mno-reference-types"),
4096flagpd1("mno-relax"),
4096m("mno-reference-types"),
4097m("mno-relax"),
40974098flagpd1("mno-relax-all"),
40984099flagpd1("mno-relax-pic-calls"),
40994100flagpd1("mno-restrict-it"),
4100flagpd1("mno-retpoline"),
4101flagpd1("mno-retpoline-external-thunk"),
4101m("mno-retpoline"),
4102m("mno-retpoline-external-thunk"),
41024103flagpd1("mno-rtd"),
4103flagpd1("mno-rtm"),
4104flagpd1("mno-sahf"),
4105flagpd1("mno-save-restore"),
4106flagpd1("mno-serialize"),
4107flagpd1("mno-seses"),
4108flagpd1("mno-sgx"),
4109flagpd1("mno-sha"),
4110flagpd1("mno-shstk"),
4111flagpd1("mno-sign-ext"),
4112flagpd1("mno-simd128"),
4113flagpd1("mno-soft-float"),
4114flagpd1("mno-spe"),
4104m("mno-rtm"),
4105m("mno-sahf"),
4106m("mno-save-restore"),
4107m("mno-serialize"),
4108m("mno-seses"),
4109m("mno-sgx"),
4110m("mno-sha"),
4111m("mno-shstk"),
4112m("mno-sign-ext"),
4113m("mno-simd128"),
4114m("mno-soft-float"),
4115m("mno-spe"),
41154116flagpd1("mno-speculative-load-hardening"),
4116flagpd1("mno-sse"),
4117flagpd1("mno-sse2"),
4118flagpd1("mno-sse3"),
4117m("mno-sse"),
4118m("mno-sse2"),
4119m("mno-sse3"),
41194120flagpd1("mno-sse4"),
4120flagpd1("mno-sse4.1"),
4121flagpd1("mno-sse4.2"),
4122flagpd1("mno-sse4a"),
4123flagpd1("mno-ssse3"),
4121m("mno-sse4.1"),
4122m("mno-sse4.2"),
4123m("mno-sse4a"),
4124m("mno-ssse3"),
41244125flagpd1("mno-stack-arg-probe"),
41254126flagpd1("mno-stackrealign"),
4126flagpd1("mno-tail-call"),
4127flagpd1("mno-tbm"),
4128flagpd1("mno-tgsplit"),
4127m("mno-tail-call"),
4128m("mno-tbm"),
4129m("mno-tgsplit"),
41294130flagpd1("mno-thumb"),
41304131flagpd1("mno-tls-direct-seg-refs"),
4131flagpd1("mno-tsxldtrk"),
4132flagpd1("mno-uintr"),
4132m("mno-tsxldtrk"),
4133m("mno-uintr"),
41334134flagpd1("mno-unaligned-access"),
41344135flagpd1("mno-unsafe-fp-atomics"),
4135flagpd1("mno-vaes"),
4136flagpd1("mno-virt"),
4137flagpd1("mno-vpclmulqdq"),
4138flagpd1("mno-vsx"),
4136m("mno-vaes"),
4137m("mno-virt"),
4138m("mno-vpclmulqdq"),
4139m("mno-vsx"),
41394140flagpd1("mno-vx"),
4140flagpd1("mno-vzeroupper"),
4141flagpd1("mno-waitpkg"),
4141m("mno-vzeroupper"),
4142m("mno-waitpkg"),
41424143flagpd1("mno-warn-nonportable-cfstrings"),
4143flagpd1("mno-wavefrontsize64"),
4144flagpd1("mno-wbnoinvd"),
4145flagpd1("mno-widekl"),
4146flagpd1("mno-x87"),
4147flagpd1("mno-xgot"),
4148flagpd1("mno-xop"),
4149flagpd1("mno-xsave"),
4150flagpd1("mno-xsavec"),
4151flagpd1("mno-xsaveopt"),
4152flagpd1("mno-xsaves"),
4144m("mno-wavefrontsize64"),
4145m("mno-wbnoinvd"),
4146m("mno-widekl"),
4147m("mno-x87"),
4148m("mno-xgot"),
4149m("mno-xop"),
4150m("mno-xsave"),
4151m("mno-xsavec"),
4152m("mno-xsaveopt"),
4153m("mno-xsaves"),
41534154flagpd1("mno-zvector"),
41544155flagpd1("mnocrc"),
4155flagpd1("mno-direct-move"),
4156flagpd1("mnontrapping-fptoint"),
4156m("mno-direct-move"),
4157m("mnontrapping-fptoint"),
41574158flagpd1("mnop-mcount"),
4158flagpd1("mno-paired-vector-memops"),
4159flagpd1("mno-crypto"),
4160flagpd1("mnvj"),
4161flagpd1("mnvs"),
4159m("mno-paired-vector-memops"),
4160m("mno-crypto"),
4161m("mnvj"),
4162m("mnvs"),
41624163flagpd1("modd-spreg"),
41634164sepd1("module-dependency-dir"),
41644165sepd1("module-dir"),
......@@ -4167,31 +4168,31 @@ flagpd1("module-file-info"),
41674168sepd1("module-suffix"),
41684169flagpd1("momit-leaf-frame-pointer"),
41694170flagpd1("moutline"),
4170flagpd1("moutline-atomics"),
4171m("moutline-atomics"),
41714172flagpd1("mpacked-stack"),
4172flagpd1("mpackets"),
4173flagpd1("mpaired-vector-memops"),
4173m("mpackets"),
4174m("mpaired-vector-memops"),
41744175flagpd1("mpascal-strings"),
4175flagpd1("mpclmul"),
4176flagpd1("mpconfig"),
4176m("mpclmul"),
4177m("mpconfig"),
41774178flagpd1("mpcrel"),
4178flagpd1("mpku"),
4179flagpd1("mpopcnt"),
4180flagpd1("mpopcntd"),
4181flagpd1("mpower10-vector"),
4182flagpd1("mcrypto"),
4183flagpd1("mpower8-vector"),
4184flagpd1("mpower9-vector"),
4185flagpd1("mprefetchwt1"),
4179m("mpku"),
4180m("mpopcnt"),
4181m("mpopcntd"),
4182m("mpower10-vector"),
4183m("mcrypto"),
4184m("mpower8-vector"),
4185m("mpower9-vector"),
4186m("mprefetchwt1"),
41864187flagpd1("mprefixed"),
4187flagpd1("mprfchw"),
4188flagpd1("mprivileged"),
4189flagpd1("mptwrite"),
4188m("mprfchw"),
4189m("mprivileged"),
4190m("mptwrite"),
41904191flagpd1("mpure-code"),
41914192flagpd1("mqdsp6-compat"),
4192flagpd1("mrdpid"),
4193flagpd1("mrdrnd"),
4194flagpd1("mrdseed"),
4193m("mrdpid"),
4194m("mrdrnd"),
4195m("mrdseed"),
41954196flagpd1("mreassociate"),
41964197flagpd1("mrecip"),
41974198flagpd1("mrecord-mcount"),
......@@ -4203,9 +4204,9 @@ flagpd1("mrecord-mcount"),
42034204 .pd2 = false,
42044205 .psl = false,
42054206},
4206flagpd1("mreference-types"),
4207m("mreference-types"),
42074208sepd1("mregparm"),
4208flagpd1("mrelax"),
4209m("mrelax"),
42094210flagpd1("mrelax-all"),
42104211flagpd1("mrelax-pic-calls"),
42114212.{
......@@ -4218,86 +4219,86 @@ flagpd1("mrelax-pic-calls"),
42184219},
42194220sepd1("mrelocation-model"),
42204221flagpd1("mrestrict-it"),
4221flagpd1("mretpoline"),
4222flagpd1("mretpoline-external-thunk"),
4223flagpd1("mrop-protect"),
4222m("mretpoline"),
4223m("mretpoline-external-thunk"),
4224m("mrop-protect"),
42244225flagpd1("mrtd"),
4225flagpd1("mrtm"),
4226flagpd1("msahf"),
4227flagpd1("msave-restore"),
4226m("mrtm"),
4227m("msahf"),
4228m("msave-restore"),
42284229flagpd1("msave-temp-labels"),
4229flagpd1("msecure-plt"),
4230flagpd1("mserialize"),
4231flagpd1("msgx"),
4232flagpd1("msha"),
4233flagpd1("mshstk"),
4234flagpd1("msign-ext"),
4230m("msecure-plt"),
4231m("mserialize"),
4232m("msgx"),
4233m("msha"),
4234m("mshstk"),
4235m("msign-ext"),
42354236flagpd1("msim"),
4236flagpd1("msimd128"),
4237flagpd1("msingle-float"),
4237m("msimd128"),
4238m("msingle-float"),
42384239sepd1("msmall-data-limit"),
4239flagpd1("msoft-float"),
4240flagpd1("mspe"),
4240m("msoft-float"),
4241m("mspe"),
42414242flagpd1("mspeculative-load-hardening"),
4242flagpd1("msse"),
4243flagpd1("msse2"),
4244flagpd1("msse3"),
4243m("msse"),
4244m("msse2"),
4245m("msse3"),
42454246flagpd1("msse4"),
4246flagpd1("msse4.1"),
4247flagpd1("msse4.2"),
4248flagpd1("msse4a"),
4249flagpd1("mssse3"),
4247m("msse4.1"),
4248m("msse4.2"),
4249m("msse4a"),
4250m("mssse3"),
42504251flagpd1("mstack-arg-probe"),
42514252flagpd1("mstackrealign"),
4252flagpd1("mstrict-align"),
4253m("mstrict-align"),
42534254flagpd1("msvr4-struct-return"),
42544255sepd1("mt-migrate-directory"),
4255flagpd1("mtail-call"),
4256flagpd1("mamx-int8"),
4257flagpd1("mtbm"),
4258flagpd1("mtgsplit"),
4256m("mtail-call"),
4257m("mamx-int8"),
4258m("mtbm"),
4259m("mtgsplit"),
42594260sepd1("mthread-model"),
42604261flagpd1("mthumb"),
42614262flagpd1("mtls-direct-seg-refs"),
42624263sepd1("mtp"),
4263flagpd1("mtsxldtrk"),
4264m("mtsxldtrk"),
42644265flagpd1("mtune=?"),
42654266flagpd1("muclibc"),
4266flagpd1("muintr"),
4267m("muintr"),
42674268flagpd1("multi_module"),
42684269sepd1("multiply_defined"),
42694270sepd1("multiply_defined_unused"),
42704271flagpd1("munaligned-access"),
42714272flagpd1("munsafe-fp-atomics"),
42724273flagpd1("munwind-tables"),
4273flagpd1("mv5"),
4274flagpd1("mv55"),
4275flagpd1("mv60"),
4276flagpd1("mv62"),
4277flagpd1("mv65"),
4278flagpd1("mv66"),
4279flagpd1("mv67"),
4274m("mv5"),
4275m("mv55"),
4276m("mv60"),
4277m("mv62"),
4278m("mv65"),
4279m("mv66"),
4280m("mv67"),
42804281flagpd1("mv67t"),
4281flagpd1("mv68"),
4282flagpd1("mvaes"),
4283flagpd1("mvirt"),
4284flagpd1("mvpclmulqdq"),
4285flagpd1("mvsx"),
4282m("mv68"),
4283m("mvaes"),
4284m("mvirt"),
4285m("mvpclmulqdq"),
4286m("mvsx"),
42864287flagpd1("mvx"),
4287flagpd1("mvzeroupper"),
4288flagpd1("mwaitpkg"),
4288m("mvzeroupper"),
4289m("mwaitpkg"),
42894290flagpd1("mwarn-nonportable-cfstrings"),
4290flagpd1("mwavefrontsize64"),
4291flagpd1("mwbnoinvd"),
4292flagpd1("mwidekl"),
4291m("mwavefrontsize64"),
4292m("mwbnoinvd"),
4293m("mwidekl"),
42934294flagpd1("mx32"),
4294flagpd1("mx87"),
4295flagpd1("mxgot"),
4296flagpd1("mxop"),
4297flagpd1("mxsave"),
4298flagpd1("mxsavec"),
4299flagpd1("mxsaveopt"),
4300flagpd1("mxsaves"),
4295m("mx87"),
4296m("mxgot"),
4297m("mxop"),
4298m("mxsave"),
4299m("mxsavec"),
4300m("mxsaveopt"),
4301m("mxsaves"),
43014302flagpd1("mzvector"),
43024303flagpd1("n"),
43034304flagpd1("new-struct-path-tbaa"),
src/main.zig+67-4
......@@ -665,6 +665,12 @@ fn buildOutputType(
665665 var enable_link_snapshots: bool = false;
666666 var native_darwin_sdk: ?std.zig.system.darwin.DarwinSDK = null;
667667
668 // e.g. -m3dnow or -mno-outline-atomics. They correspond to std.Target llvm cpu feature names.
669 // This array is populated by zig cc frontend and then has to be converted to zig-style
670 // CPU features.
671 var llvm_m_args = std.ArrayList([]const u8).init(gpa);
672 defer llvm_m_args.deinit();
673
668674 var system_libs = std.StringArrayHashMap(Compilation.SystemLib).init(gpa);
669675 defer system_libs.deinit();
670676
......@@ -1412,7 +1418,9 @@ fn buildOutputType(
14121418 .dry_run => {
14131419 verbose_link = true;
14141420 try clang_argv.append("-###");
1415 // XXX: Don't execute anything!
1421 // This flag is supposed to mean "dry run" but currently this
1422 // will actually still execute. The tracking issue for this is
1423 // https://github.com/ziglang/zig/issues/7170
14161424 },
14171425 .for_linker => try linker_args.append(it.only_arg),
14181426 .linker_input_z => {
......@@ -1421,6 +1429,7 @@ fn buildOutputType(
14211429 },
14221430 .lib_dir => try lib_dirs.append(it.only_arg),
14231431 .mcpu => target_mcpu = it.only_arg,
1432 .m => try llvm_m_args.append(it.only_arg),
14241433 .dep_file => {
14251434 disable_c_depfile = true;
14261435 try clang_argv.appendSlice(it.other_args);
......@@ -1798,12 +1807,62 @@ fn buildOutputType(
17981807 }
17991808 };
18001809
1801 const cross_target = try parseCrossTargetOrReportFatalError(arena, .{
1810 var target_parse_options: std.zig.CrossTarget.ParseOptions = .{
18021811 .arch_os_abi = target_arch_os_abi,
18031812 .cpu_features = target_mcpu,
18041813 .dynamic_linker = target_dynamic_linker,
1805 });
1814 };
1815
1816 // Before passing the mcpu string in for parsing, we convert any -m flags that were
1817 // passed in via zig cc to zig-style.
1818 if (llvm_m_args.items.len != 0) {
1819 // If this returns null, we let it fall through to the case below which will
1820 // run the full parse function and do proper error handling.
1821 if (std.zig.CrossTarget.parseCpuArch(target_parse_options)) |cpu_arch| {
1822 var llvm_to_zig_name = std.StringHashMap([]const u8).init(gpa);
1823 defer llvm_to_zig_name.deinit();
1824
1825 for (cpu_arch.allFeaturesList()) |feature| {
1826 const llvm_name = feature.llvm_name orelse continue;
1827 try llvm_to_zig_name.put(llvm_name, feature.name);
1828 }
18061829
1830 var mcpu_buffer = std.ArrayList(u8).init(gpa);
1831 defer mcpu_buffer.deinit();
1832
1833 try mcpu_buffer.appendSlice(target_mcpu orelse "baseline");
1834
1835 for (llvm_m_args.items) |llvm_m_arg| {
1836 if (mem.startsWith(u8, llvm_m_arg, "mno-")) {
1837 const llvm_name = llvm_m_arg["mno-".len..];
1838 const zig_name = llvm_to_zig_name.get(llvm_name) orelse {
1839 fatal("target architecture {s} has no LLVM CPU feature named '{s}'", .{
1840 @tagName(cpu_arch), llvm_name,
1841 });
1842 };
1843 try mcpu_buffer.append('-');
1844 try mcpu_buffer.appendSlice(zig_name);
1845 } else if (mem.startsWith(u8, llvm_m_arg, "m")) {
1846 const llvm_name = llvm_m_arg["m".len..];
1847 const zig_name = llvm_to_zig_name.get(llvm_name) orelse {
1848 fatal("target architecture {s} has no LLVM CPU feature named '{s}'", .{
1849 @tagName(cpu_arch), llvm_name,
1850 });
1851 };
1852 try mcpu_buffer.append('+');
1853 try mcpu_buffer.appendSlice(zig_name);
1854 } else {
1855 unreachable;
1856 }
1857 }
1858
1859 const adjusted_target_mcpu = try arena.dupe(u8, mcpu_buffer.items);
1860 std.log.debug("adjusted target_mcpu: {s}", .{adjusted_target_mcpu});
1861 target_parse_options.cpu_features = adjusted_target_mcpu;
1862 }
1863 }
1864
1865 const cross_target = try parseCrossTargetOrReportFatalError(arena, target_parse_options);
18071866 const target_info = try detectNativeTargetInfo(gpa, cross_target);
18081867
18091868 if (target_info.target.os.tag != .freestanding) {
......@@ -2580,7 +2639,10 @@ fn buildOutputType(
25802639 return cleanExit();
25812640}
25822641
2583fn parseCrossTargetOrReportFatalError(allocator: *Allocator, opts: std.zig.CrossTarget.ParseOptions) !std.zig.CrossTarget {
2642fn parseCrossTargetOrReportFatalError(
2643 allocator: *Allocator,
2644 opts: std.zig.CrossTarget.ParseOptions,
2645) !std.zig.CrossTarget {
25842646 var opts_with_diags = opts;
25852647 var diags: std.zig.CrossTarget.ParseOptions.Diagnostics = .{};
25862648 if (opts_with_diags.diagnostics == null) {
......@@ -3948,6 +4010,7 @@ pub const ClangArgIterator = struct {
39484010 target,
39494011 o,
39504012 c,
4013 m,
39514014 other,
39524015 positional,
39534016 l,
tools/update_clang_options.zig+52-8
......@@ -426,11 +426,32 @@ fn knownOption(name: []const u8) ?[]const u8 {
426426 return null;
427427}
428428
429const cpu_targets = struct {
430 pub const aarch64 = std.Target.aarch64;
431 pub const arc = std.Target.arc;
432 pub const amdgpu = std.Target.amdgpu;
433 pub const arm = std.Target.arm;
434 pub const avr = std.Target.avr;
435 pub const bpf = std.Target.bpf;
436 pub const hexagon = std.Target.hexagon;
437 pub const mips = std.Target.mips;
438 pub const msp430 = std.Target.msp430;
439 pub const nvptx = std.Target.nvptx;
440 pub const powerpc = std.Target.powerpc;
441 pub const riscv = std.Target.riscv;
442 pub const sparc = std.Target.sparc;
443 pub const spirv = std.Target.spirv;
444 pub const systemz = std.Target.systemz;
445 pub const ve = std.Target.ve;
446 pub const wasm = std.Target.wasm;
447 pub const x86 = std.Target.x86;
448};
449
429450pub fn main() anyerror!void {
430451 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
431452 defer arena.deinit();
432
433453 const allocator = &arena.allocator;
454
434455 const args = try std.process.argsAlloc(allocator);
435456
436457 if (args.len <= 1) {
......@@ -453,6 +474,20 @@ pub fn main() anyerror!void {
453474 usageAndExit(std.io.getStdErr(), args[0], 1);
454475 }
455476
477 var llvm_to_zig_cpu_features = std.StringHashMap([]const u8).init(allocator);
478
479 inline for (@typeInfo(cpu_targets).Struct.decls) |decl| {
480 const Feature = @field(cpu_targets, decl.name).Feature;
481 const all_features = @field(cpu_targets, decl.name).all_features;
482
483 for (all_features) |feat, i| {
484 const llvm_name = feat.llvm_name orelse continue;
485 const zig_feat = @intToEnum(Feature, i);
486 const zig_name = @tagName(zig_feat);
487 try llvm_to_zig_cpu_features.put(llvm_name, zig_name);
488 }
489 }
490
456491 const child_args = [_][]const u8{
457492 llvm_tblgen_exe,
458493 "--dump-json",
......@@ -467,15 +502,15 @@ pub fn main() anyerror!void {
467502 .max_output_bytes = 100 * 1024 * 1024,
468503 });
469504
470 std.debug.warn("{s}\n", .{child_result.stderr});
505 std.debug.print("{s}\n", .{child_result.stderr});
471506
472507 const json_text = switch (child_result.term) {
473508 .Exited => |code| if (code == 0) child_result.stdout else {
474 std.debug.warn("llvm-tblgen exited with code {d}\n", .{code});
509 std.debug.print("llvm-tblgen exited with code {d}\n", .{code});
475510 std.process.exit(1);
476511 },
477512 else => {
478 std.debug.warn("llvm-tblgen crashed\n", .{});
513 std.debug.print("llvm-tblgen crashed\n", .{});
479514 std.process.exit(1);
480515 },
481516 };
......@@ -516,6 +551,7 @@ pub fn main() anyerror!void {
516551 \\const joinpd1 = clang_options.joinpd1;
517552 \\const jspd1 = clang_options.jspd1;
518553 \\const sepd1 = clang_options.sepd1;
554 \\const m = clang_options.m;
519555 \\pub const data = blk: { @setEvalBranchQuota(6000); break :blk &[_]CliArg{
520556 \\
521557 );
......@@ -534,7 +570,7 @@ pub fn main() anyerror!void {
534570 } else if (std.mem.eql(u8, prefix, "/")) {
535571 pslash = true;
536572 } else {
537 std.debug.warn("{s} has unrecognized prefix '{s}'\n", .{ name, prefix });
573 std.debug.print("{s} has unrecognized prefix '{s}'\n", .{ name, prefix });
538574 std.process.exit(1);
539575 }
540576 }
......@@ -562,7 +598,15 @@ pub fn main() anyerror!void {
562598 \\
563599 , .{ name, final_syntax, ident, pd1, pd2, pslash });
564600 } else if (pd1 and !pd2 and !pslash and syntax == .flag) {
565 try stdout.print("flagpd1(\"{s}\"),\n", .{name});
601 if ((std.mem.startsWith(u8, name, "mno-") and
602 llvm_to_zig_cpu_features.contains(name["mno-".len..])) or
603 (std.mem.startsWith(u8, name, "m") and
604 llvm_to_zig_cpu_features.contains(name["m".len..])))
605 {
606 try stdout.print("m(\"{s}\"),\n", .{name});
607 } else {
608 try stdout.print("flagpd1(\"{s}\"),\n", .{name});
609 }
566610 } else if (!pd1 and !pd2 and pslash and syntax == .flag) {
567611 try stdout.print("flagpsl(\"{s}\"),\n", .{name});
568612 } else if (pd1 and !pd2 and !pslash and syntax == .joined) {
......@@ -683,9 +727,9 @@ fn objSyntax(obj: *json.ObjectMap) Syntax {
683727 return .flag;
684728 }
685729 const key = obj.get("!name").?.String;
686 std.debug.warn("{s} (key {s}) has unrecognized superclasses:\n", .{ name, key });
730 std.debug.print("{s} (key {s}) has unrecognized superclasses:\n", .{ name, key });
687731 for (obj.get("!superclasses").?.Array.items) |superclass_json| {
688 std.debug.warn(" {s}\n", .{superclass_json.String});
732 std.debug.print(" {s}\n", .{superclass_json.String});
689733 }
690734 std.process.exit(1);
691735}