[llvm] [XCOFF] make related SD symbols as isFunction (PR #69553)
Chen Zheng via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 13 00:33:51 PST 2023
================
@@ -1242,25 +1242,55 @@ 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;
- const int16_t SectNum = getSectionNumber();
- Expected<DataRefImpl> SI = getObject()->getSectionByNum(SectNum);
- if (!SI) {
- // If we could not get the section, then this symbol should not be
- // a function. So consume the error and return `false` to move on.
- consumeError(SI.takeError());
- 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:
----------------
chenzheng1030 wrote:
I added a FIXME here for further investigation.
https://github.com/llvm/llvm-project/pull/69553
More information about the llvm-commits
mailing list