[llvm] [XCOFF] make related SD symbols as isFunction (PR #69553)

Chen Zheng via llvm-commits llvm-commits at lists.llvm.org
Sun Nov 19 17:36:56 PST 2023


================
@@ -1242,21 +1242,53 @@ 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;
+
+  return false;
----------------
chenzheng1030 wrote:

Done

https://github.com/llvm/llvm-project/pull/69553


More information about the llvm-commits mailing list