<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/97124>97124</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[LLD] Adding a modern target-selection flag to the drivers
</td>
</tr>
<tr>
<th>Labels</th>
<td>
enhancement
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Ericson2314
</td>
</tr>
</table>
<pre>
LLD's frontends are currently very faithful to the linkers they are based on. But that means the target-selection mechanisms they have are rather underpowered. I think would be good to have modern flags that would allow us to set the `EM_*` choice, `ELFOSABI_*` choice, and `ELFKind` independently (for valid combinations)
A good use for this would be better handling of the "OSABI" field. For example:
## Problems
### FreeBSD existing hacks
https://github.com/llvm/llvm-project/blob/9572388a849c494d45df334f9facd8ee6663953f/lld/ELF/Driver.cpp#L174-L177
is an ad-hoc hack for FreeBSD. The corresponding code in Clang to use it is even uglier:
https://github.com/llvm/llvm-project/blob/9572388a849c494d45df334f9facd8ee6663953f/clang/lib/Driver/ToolChains/FreeBSD.cpp#L174-L218
If Clang could use "regular" code to transform the CPU into a `-m` flag, and then separately tell LLD that the `ELFOSABI_*` is `ELFOSABI_FREEBSD`, that would be much cleaner.
### OpenBSD has similar needs
As discussed in https://github.com/llvm/llvm-project/pull/92675, we ought to have CI for OpenBSD, but OpenBSD has some outstanding downstream changes that need to be upstreamed before upstream-tool-produced binaries will work, and many of those changes today assume OpenBSD->OpenBSD native compilation and so are unfit to upstream as is
https://github.com/llvm/llvm-project/pull/97122 is the first such patch I've rebased. This is a somewhat borderline case, as there is already blanket handling to `.openbsd.random` regardless of the `ELFOSABI_*` in use. Still, "stealing names" from all ELF usages of LLD doesn't seem very elegant, even if the `.openbsd.random` case is grandfathered in --- I much rather start requiring `ELFOSABI_OPENBSD` with the `.openbsd.random` case deprecated with a warning. That said, if doing this would require a `_obsd` hack like FreeBSD's `_fbsd`, I can't help but think the medicine is as almost as bad is the disease.
## Solutions
### Proposal A: `--target` flag
Add a flag for "regular" LLVM triples --- like Clang's `--target` or LLVM's `-mtriple` --- so we have more expressive power. Those triples should be mostly possible to map to the choices above, and `-m` flags could still be used to fill in the gaps.
Advantages:
- "no new syntax"
- tools like Clang can just forward their `--target` argument as-is and hope for the best
Disadvantages:
LLVM triples can both say to much and too little
### Proposal B: New greenfield flags
Add multiple new flags for specifying the these parts independently. Certainly `ELFOSABI_` needs one. `-m` does the `EM_` and `ELFKind` residual alright, perhaps, or perhaps they get fresh new flags too.
Advantages: No syntax vs semantics mismatch / friction / corner cases.
Disadvantage: Greenfield new flags for other tooling to have to learn about.
----
CC @brad0 because OpenBSD
C @mstorsjo because I am curious if Windows stuff has similar needs / not sure what to do about `lld-link` (`clang-cl` takes `--target` and many other GNU-style flags, but `lld-link` only takes `/flag` MS-style-flags)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8V0tv4zgS_jXypSDDpp85-JCXB8F6uhubmd3joCSWJHYoUsui7Pa_XxRlx3bSg8FggT10xxLJYj2--uoTMpvaEW2yxUO2eBphHxsfNs_BlOydmk3no8Lr42a3e8rUiqEK3kVymgEDQdmHQC7aI-wpHKFCE5uqtxA9xIbAGvdGgeX3Me0vkEmDd2N46CPEBiO0hC7tgIihppgzWSqj8Q5aKht0htuThQb3lMwEjA0F6J2m0PkDBdJjeIHYGPcGB99bDQVB7b0WT9Kx1msKDiqLNQ8XD_vQWn-AnmUjU0yOZMvJ869_ZOo-W06gbLwpKVOP6fVu-_X1_uHl8yI6fdrwD-O0rBmnqSOnh_xkal35AHu0RkPp28I4lCA5U3cA2eQpm9wP_98PjvdMICdiY_gSU0ExUoAGnbbG1eCrwWOlkl-ZUlAZsnoMWx-AfmDbWcpm99cXZGqWqRl8C76w1PLnJVndBqKH1yegH4aj3NRg-Xazt4mxYzGttpna1iY2fTEufZuprbX785-8C_47lTFT28L6IlPbu8VKzdZrXM_vyvndXM8XuprN5tVdhaVeEy2Xy9ndYlYlAzpT2-edXPAUzJ7CuOy6TM1209U8301Xq1PmDAM6QJ03vkyeptSdYhjDbw1B6UMg7rzTEk3pNYFx8GjR1VJ7SbeJYBhoTw762hoKHxL3f4i4FH_EkCneY87U9jfv7WODRuCyPYd1nQo1XV97-lKdIisTcCS4TKlAdW8xCEhS_NKlAR1XPrQJRo_ffgfjogcULOetwFg65gzw2JADpg4DRrJHiGQt7HZPQ0OdW-dDjxi-ebv95_Pzw-tTtpyI1atOLAjavmygtISOwvgGlx_Q-bUjJ-hskIFNaywGcET6BqD3DNpw2bNwjnHwt8vX9dZK-dRytRBnDwS-r5v4TiqPLwlnJ29kS9HHW-d8K4ciRxyAp_3BcQyELQi51XRiI_Fe7BYEfTdsIMlJ5cPlTR69t-Kg7ktZNQ6DIYaDsRYOPrydC9WiOw7c4JkuF3mNR0DmvqWzl3k2ez47LIy0l05pO2MTOyVj7BPp9q4yKfSzN4Ccivu_dMg5xaupUmJMMFSZwBFYsNBhLBt4ydRqTxAojQ9pZ5NuxpTeg6Sv8EFTsMYRlMgDIydrgdJOGwj1EQqL7o3ihT-jF3COfUeuYD0O6LRPsA9UY9CWmN859ifQdtJaY3iNRsJ4lCbjSJhMO2yJEyEH38qcgefdFnpGKYWvUt9oT-wytYrARO0wRMlSjS6KuURF5v36n7gpwUqAtbyq0lgcwJ7nObwMDXWalhwxRAj0n94E8e86nq_fnr8MTQkHE5u_ulBTF6jESHrYjnDA4IyrpTYYgdFo8d9UoH1K82WIDQ7QQDF_-ILTsEycbc0bnUk7iQ3ZUQ07xNwLlDhkqyHbpV4bRr6425I2pdRfyi0Vbz1H-VWgPiNLGyZkGv9kGr562w_z-KeE8y34zjNauM9m94kc80GuvFPkNfFoDZjeJnq4Zd7d7l-_Qgyms8SpSinqx4H3h5ivbfuQTrwvtcNRWZLD7IWVTgonENCPLhCztHESRlIQoYDzhdy8c61n0SWdZzaFTcOgxe6s3AZhw4CF31_rm8tM4NNsYcF-oi0eGKySZ-OSmRo7Ht-mZo8uSgt8mK25pMl5cHQAPrqIPzKlzktCe3yVKMEBfO85Sn4PGNJkMuFj7jDUfUtOUJAnhaCh8d1ZVomY4njtw5Nh_DP_bsom1xc-NsB4TImTNksD0nuwJkZLfwGjB4HRFzpAHYhckmxDVj_iqO1tlEtTYoa8i_vcUWmq49BbJP-YoMMQ-VZ3jgEeKUQ0TjToNYMtJ8PEBO9ofCmtMNK1CJY0fpK2gdjoHq3wqqmbxFUdhQY7lp8-nJ8G3V5ThCoQN1dBRO__HBjwxZ9AAHsGphZdNCVDa7hNEyFTW6iCGT4T5KH0wVFI7HQLuOuaiuVfLvm-zahPJClIO82F1FTRgyUMThqhjzeW8zzPr58fHyGbT4qAegIFlSii66wMrrfJrpajD_zdv298AREEfTC-Z6HNfxun_YGBY19Vn2VOitl5mZKBIE3A6EH7wU2plrU6l88vKVem1tlykqRlXlp5E_GNPlHNRTikVPzy5fec49HSCZgndfPBthdgvZvL1DaR4XICv74Op_PT6buR3sz03ewOR7SZrqZ3y-l6PlmMms10tcDFtJwup_NqrZdLWqtZpaezyWyymFYljsxGTdR8slRrNZsv54vxej5b43yCeqUny3JWZfMJtWjsWNTF2Id6ZJh72oismI8sFmQ5feAqRa5BV5LQghDM4mkUNkmTFH3N2XxiDUe-2Ikm2vRtLN-_iye410nF4fl78tM3a2L9E4nqJN951Ae7-dvKKEXAJ200H-036r8BAAD__ztsEwc">