[llvm] [XCOFF] make related SD symbols as isFunction (PR #69553)
Chen Zheng via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 20 17:50:45 PST 2023
================
@@ -1242,21 +1242,59 @@ Expected<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 an 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)
- return SI.takeError();
+ // If the next symbol is an XTY_LD type symbol with the 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 work around the fact that LLVM always generates below
+ // symbol for -ffunction-sections:
+ // m 0x00000000 .text 1 unamex **No Symbol**
+ // a4 0x00000000 0 0 SD PR 0 0
+ // FIXME: remove or replace this meaningless symbol.
+ if (getSize() == 0)
+ return false;
+
+ xcoff_symbol_iterator NextIt(this);
+ // If this is the last main symbol table entry, there won't be an XTY_LD
+ // type symbol below.
+ if (++NextIt == getObject()->symbol_end())
+ return true;
+
+ if (cantFail(getAddress()) != cantFail(NextIt->getAddress()))
+ return true;
+
+ // Check next symbol is XTY_LD. If so, this symbol is not a function.
+ Expected<XCOFFCsectAuxRef> NextCsectAuxEnt = NextIt->getXCOFFCsectAuxRef();
+ if (!NextCsectAuxEnt)
+ return NextCsectAuxEnt.takeError();
+
+ if (NextCsectAuxEnt.get().getSymbolType() == XCOFF::XTY_LD)
+ return false;
- return (getObject()->getSectionFlags(SI.get()) & XCOFF::STYP_TEXT);
+ return true;
+ }
+
+ if (CsectAuxRef.getSymbolType() == XCOFF::XTY_LD)
+ return true;
+
+ Expected<StringRef> NameOrErr = getName();
+ if (!NameOrErr)
+ return NameOrErr.takeError();
+
+ return createError("csect symbol " + *NameOrErr +
----------------
chenzheng1030 wrote:
Done. Cases added and use symbol index like you suggested.
https://github.com/llvm/llvm-project/pull/69553
More information about the llvm-commits
mailing list