<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/57950>57950</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Confusing argument interaction between -m(32/64) and --target
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang:driver
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          hvdijk
      </td>
    </tr>
</table>

<pre>
    Assume an x86 build of LLVM/clang running on a multilib GNU/Linux system. For the most part, the options -m32 and --target=i386-linux-gnu should be equivalent, as should -m64 and --target=x86_64-linux-gnu. However, when it comes to letting later options override earlier ones, that is not the case.

First, to see that the options in general work:
```
$ clang -m32 --print-libgcc-file-name
/usr/lib/clang/14.0.6/lib/linux/libclang_rt.builtins-i386.a
$ clang --target=i386-linux-gnu --print-libgcc-file-name
/usr/lib/clang/14.0.6/lib/linux/libclang_rt.builtins-i386.a
$ clang -m64 --print-libgcc-file-name
/usr/lib/clang/14.0.6/lib/linux/libclang_rt.builtins-x86_64.a
$ clang --target=x86_64-linux-gnu --print-libgcc-file-name
/usr/lib/clang/14.0.6/lib/linux/libclang_rt.builtins-x86_64.a
```
Next, to see that later options usually override earlier ones:
```
$ clang -m32 -m64 --print-libgcc-file-name
/usr/lib/clang/14.0.6/lib/linux/libclang_rt.builtins-x86_64.a
$ clang -m64 -m32 --print-libgcc-file-name
/usr/lib/clang/14.0.6/lib/linux/libclang_rt.builtins-i386.a
$ clang --target=i386-linux-gnu --target=x86_64-linux-gnu --print-libgcc-file-name
/usr/lib/clang/14.0.6/lib/linux/libclang_rt.builtins-x86_64.a
$ clang --target=x86_64-linux-gnu --target=i386-linux-gnu --print-libgcc-file-name
/usr/lib/clang/14.0.6/lib/linux/libclang_rt.builtins-i386.a
```
All is still as expected. Now, look at what happens when mixing the two:
```
$ clang -m64 --target=i386-linux-gnu --print-libgcc-file-name
/usr/lib/clang/14.0.6/lib/linux/libclang_rt.builtins-x86_64.a
$ clang -m32 --target=x86_64-linux-gnu --print-libgcc-file-name
/usr/lib/clang/14.0.6/lib/linux/libclang_rt.builtins-i386.a
```
This happens because `--target` is processed first even if it appears later in the command line arguments. I think it would make more sense and be more consistent with how other options are handled to let a later `--target` override earlier `-m` options.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzNVlFvpDgM_jXwYoGYwDDMAw_drWbvpF6f7u51FcBAdkIyl4Qy_ffnhE67bdVVX-5aCYHAsf3Z_rDd6O6-vrJ2nhC4gnNVQjML2YHu4ebm7z8idmglVwOYWSlBT62AwzRLJ6Ro4NvtX3TiRqj5DPbeOpxSOGgDbkSYtHVw4sZF7Gv4oE9OaGUhmXJGzjpIEsfNgC7Kr0VelYn0dpJBzWBHPROIBgH_mcUdl6iCGW4vomQqi5dGCP33sngyk8JvesE7NF51GVGBcNDqCS04DRKd8xFJ7tA8gtN03IiOHHMjhRcotGsE3IGwoLQL0bTcYhpl11F2td4Pwtg1Vg0WcVX4OW6hYECFhktYtDlG-YNiVGYP1_rKClhzHhKVJCcjlKOomqFtk15ITBSf8HL4MFuK70DiS63ouSnSLC0fP4eMrG_hxHfjUl9mit8mPvUpf-X7zdp8FCBf8P_c90qhX6bjJcv-d1DP6XKL51ese07p2c5cyvs3qP1OFn5s9oP3T_o3fB5ivJOtn-PHfk63Kyl9c7U0VqTv8ng-YeuwS-FWL57eUusjELUXz--Rn05IzA49fRJn38Z9p3WLfg-fA5U_LAtvkzzw-wPp9Iv6_DlSdS5pb7Dls0Ug6SPeMvP1OxndorXYQe-nIdDwpaHb-7nrdbmxD72JZmEYonqa_BAnWLR_mIHWEOVsCr-TVKij11vCuJ_40W8UBqnJKYth8jcPX1pqcoJ2D0WHhRth1Atosv7UATmdGklFErB18tMSswJ5EcOrHunlU5CsttIY601Z5vuqqHZ53NV5t8_3PHbCSay_atXP1tPxEgxFSm5465UJsVuQMkIWWZUzqkNZRGz_bI-JZyPr0blTaM3sQNdAUc1NSsnylZN3lwfxQf-g34ReBa1wfk85bHf7bRaP9Q67osrYbtd2VdX1bN9vyg1vtkVflVXBtrHkDUpbR9svEWMrW_KrzoiwLrFoex2LmmWMZXtWZCzbbFhadlm1y9q-yPq2r_Y8KjKcuJCpB5NqM8SmDriaebAklFQV-yTk1opBIQafZJ_PbtSmHu868eMYhwjqAP9fC6RiCg">