It seems like we are overly asserting when running -dead_strip with
exported symbols. ld64 treats exported private extern symbols as a liveness
root. Loosen the assert to match ld64's behavior.
Details
- Reviewers
int3 - Group Reviewers
Restricted Project - Commits
- rG9f2272ff51b1: [lld-macho] Allow dead_strip to work with exported private extern symbols
Diff Detail
- Repository
- rG LLVM Github Monorepo
Event Timeline
lld/MachO/MarkLive.cpp | ||
---|---|---|
233 | Should we call addSym for privateExterns? That seems wrong (?) |
lld/MachO/MarkLive.cpp | ||
---|---|---|
233 |
normally we shouldn't but if a symbol is both private extern and autohide, then i think it should be ok, relatedly, stray comment should be deleted or moved? |
lld/MachO/MarkLive.cpp | ||
---|---|---|
233 | I thought the comment was referring to the addSym, but I don't think it will be changed so I'm happy to remove it.
This is what I found from testing as well. Happy to re-add the assert back and only skip it if it is both privateExtern and autohide. I think that's the one I'm fixing in my local builds. |
lld/MachO/MarkLive.cpp | ||
---|---|---|
233 | So with some further testing, this is looking fairly strange. I think ld64 is just preserving all the symbols that are exported even if they cannot be exported. It does feel strange to preserve the symbol if it's privateExtern... I can skip "unable to be exported syms" from being marked live which seems like the correct behavior, but this will deviate from the ld64's behavior. What do y'all think should be the correct approach here? |
lld/MachO/MarkLive.cpp | ||
---|---|---|
233 |
The comment was referring to the fact that we shouldn't see "privateExtern" on a symbol from symtab and that such check could have been done in Driver (when we process the exported symbols). (btw, the comment was lacking the case where a symbol is both privateExtern and autohide) |
lld/MachO/MarkLive.cpp | ||
---|---|---|
233 | We have some pretty convoluted logic with privateExterns and autohides. For symbols that are both privateExterns and autohide, we end up nullifying the flag. We've effectively removed lost that information and can't distinguish if a particular symbol was originally privateExtern and autohide which makes checking for that case a harder. Although, from empirical testing w/ ld64, it looks like it just preserves them when symbols from the exported list cannot be exported. |
lld/MachO/MarkLive.cpp | ||
---|---|---|
233 | it looks like ld64 does treat a private extern symbol as a liveness root if it's exported, regardless of whether it is autohide. Let's just leave a comment to that effect and follow ld64's behavior. It doesn't cost us in terms of code complexity and it is one less thing for new adopters of LLD to worry about | |
lld/test/MachO/export-options.s | ||
148–149 | it's better to describe what the test should cover (exported-hidden) rather than what it shouldn't do (no_crash). (The comment itself can note that this used to crash.) let's also mention explicitly that we expect _foo to be treated as a liveness root due to -exported_symbol also nit: use hyphens instead of underscores for the file names |
lld/test/MachO/export-options.s | ||
---|---|---|
148–149 | or maybe AUTOHIDE-PRIVATE-DEAD-STRIP to make it clear that it's an extension to the AUTOHIDE-PRIVATE cases above |
maybe something like "NOTE: we are purposely not checking for privateExtern here because ..."
could also mention that exporting private externs is technically an ill-defined operation, so we are just following ld64's behavior