[llvm] [XCOFF] make related SD symbols as isFunction (PR #69553)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 6 06:54:54 PST 2023
================
@@ -1242,15 +1242,64 @@ bool XCOFFSymbolRef::isFunction() const {
const XCOFFCsectAuxRef CsectAuxRef = ExpCsectAuxEnt.get();
- // A function definition should be a label definition.
- // FIXME: This is not necessarily the case when -ffunction-sections is
- // enabled.
- if (!CsectAuxRef.isLabel())
+ if (CsectAuxRef.getStorageMappingClass() != XCOFF::XMC_PR &&
+ CsectAuxRef.getStorageMappingClass() != XCOFF::XMC_GL)
return false;
- if (CsectAuxRef.getStorageMappingClass() != XCOFF::XMC_PR)
+ // A function definition should not be a common type symbol or a external
+ // symbol.
+ if (CsectAuxRef.getSymbolType() == XCOFF::XTY_CM ||
+ CsectAuxRef.getSymbolType() == XCOFF::XTY_ER)
return false;
+ // If the next symbol is a XTY_LD type symbol with same address, this XTY_SD
+ // symbol is not a function. Otherwise this is a function symbol for
+ // -ffunction-sections.
+ if (CsectAuxRef.getSymbolType() == XCOFF::XTY_SD) {
+ // If this is a csect with size 0, it won't be a function definition.
+ // This is used to hack situation that llvm always generates below symbol
+ // for -ffunction-sections:
+ // m 0x00000000 .text 1 unamex **No Symbol**
+ // a4 0x00000000 0 0 SD PR 0 0
+ if (getSize() == 0)
+ return false;
+
+ uint8_t NumberOfAuxEntries = getNumberOfAuxEntries();
+
+ // If this is the last main symbol table entry, there won't be XTY_LD type
+ // symbol below.
+ if (getEntryAddress() == getObject()->getSymbolEntryAddressByIndex(
+ getObject()->getNumberOfSymbolTableEntries() -
+ NumberOfAuxEntries - 1))
+ return true;
+
+ DataRefImpl Ref;
+ Ref.p = XCOFFObjectFile::getAdvancedSymbolEntryAddress(
+ getEntryAddress(), NumberOfAuxEntries + 1);
+ XCOFFSymbolRef NextSym = getObject()->toSymbolRef(Ref);
----------------
diggerlin wrote:
I think we can change the code from line 1271~1279 to
```
xcoff_symbol_iterator It(this); (we need to add a new constructor from xcoff_symbol_iterator(XCOFFSymbolRef) )
if(++CurIt == OwningObject->symbol_end())
return true;
```
NextSym will be *CurIt in above code.
https://github.com/llvm/llvm-project/pull/69553
More information about the llvm-commits
mailing list