[llvm-branch-commits] [llvm] cb23434 - [XCOFF] Do not generate the special .ref for zero-length sections (#66805)

Tobias Hieta via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Thu Sep 28 23:26:28 PDT 2023


Author: Wael Yehia
Date: 2023-09-29T08:23:28+02:00
New Revision: cb23434f9e6354407ad75436356536d72179fa75

URL: https://github.com/llvm/llvm-project/commit/cb23434f9e6354407ad75436356536d72179fa75
DIFF: https://github.com/llvm/llvm-project/commit/cb23434f9e6354407ad75436356536d72179fa75.diff

LOG: [XCOFF] Do not generate the special .ref for zero-length sections (#66805)

Co-authored-by: Wael Yehia <wyehia at ca.ibm.com>
(cherry picked from commit da55b1b52fbce80093eee8dd4185df4861a44ba5)

Added: 
    

Modified: 
    llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
    llvm/test/CodeGen/PowerPC/pgo-ref-directive.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
index a089d61616e1a08..5c10d6307c769ba 100644
--- a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
+++ b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
@@ -279,7 +279,7 @@ class PPCAIXAsmPrinter : public PPCAsmPrinter {
 
   void emitFunctionBodyEnd() override;
 
-  void emitPGORefs();
+  void emitPGORefs(Module &M);
 
   void emitEndOfAsmFile(Module &) override;
 
@@ -2636,10 +2636,28 @@ void PPCAIXAsmPrinter::emitFunctionEntryLabel() {
         getObjFileLowering().getFunctionEntryPointSymbol(Alias, TM));
 }
 
-void PPCAIXAsmPrinter::emitPGORefs() {
-  if (OutContext.hasXCOFFSection(
+void PPCAIXAsmPrinter::emitPGORefs(Module &M) {
+  if (!OutContext.hasXCOFFSection(
           "__llvm_prf_cnts",
-          XCOFF::CsectProperties(XCOFF::XMC_RW, XCOFF::XTY_SD))) {
+          XCOFF::CsectProperties(XCOFF::XMC_RW, XCOFF::XTY_SD)))
+    return;
+
+  // When inside a csect `foo`, a .ref directive referring to a csect `bar`
+  // translates into a relocation entry from `foo` to` bar`. The referring
+  // csect, `foo`, is identified by its address.  If multiple csects have the
+  // same address (because one or more of them are zero-length), the referring
+  // csect cannot be determined. Hence, we don't generate the .ref directives
+  // if `__llvm_prf_cnts` is an empty section.
+  bool HasNonZeroLengthPrfCntsSection = false;
+  const DataLayout &DL = M.getDataLayout();
+  for (GlobalVariable &GV : M.globals())
+    if (GV.hasSection() && GV.getSection().equals("__llvm_prf_cnts") &&
+        DL.getTypeAllocSize(GV.getValueType()) > 0) {
+      HasNonZeroLengthPrfCntsSection = true;
+      break;
+    }
+
+  if (HasNonZeroLengthPrfCntsSection) {
     MCSection *CntsSection = OutContext.getXCOFFSection(
         "__llvm_prf_cnts", SectionKind::getData(),
         XCOFF::CsectProperties(XCOFF::XMC_RW, XCOFF::XTY_SD),
@@ -2673,7 +2691,7 @@ void PPCAIXAsmPrinter::emitEndOfAsmFile(Module &M) {
   if (M.empty() && TOCDataGlobalVars.empty())
     return;
 
-  emitPGORefs();
+  emitPGORefs(M);
 
   // Switch to section to emit TOC base.
   OutStreamer->switchSection(getObjFileLowering().getTOCBaseSection());

diff  --git a/llvm/test/CodeGen/PowerPC/pgo-ref-directive.ll b/llvm/test/CodeGen/PowerPC/pgo-ref-directive.ll
index 32aa95d7de6c82a..480b44caaded7a5 100644
--- a/llvm/test/CodeGen/PowerPC/pgo-ref-directive.ll
+++ b/llvm/test/CodeGen/PowerPC/pgo-ref-directive.ll
@@ -18,6 +18,24 @@
 ; RUN:     -xcoff-traceback-table=false --filetype=obj < %t/with-vnds.ll -o %t/with-vnds.o
 ; RUN: llvm-objdump %t/with-vnds.o -tr | FileCheck %s --check-prefix=WITHVNDS-OBJ
 
+; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
+; RUN:     -xcoff-traceback-table=false < %t/zero-size-cnts-section.ll | FileCheck %s --check-prefixes=ZERO-SIZE-CNTS
+; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
+; RUN:     -xcoff-traceback-table=false --filetype=obj < %t/zero-size-cnts-section.ll -o %t/zero-size-cnts-section.o
+; RUN: llvm-objdump %t/zero-size-cnts-section.o -tr | FileCheck %s --check-prefix=ZERO-SIZE-CNTS-OBJ
+
+; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
+; RUN:     -xcoff-traceback-table=false < %t/zero-size-other-section.ll | FileCheck %s --check-prefixes=ZERO-SIZE-OTHER
+; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc64-ibm-aix-xcoff \
+; RUN:     -xcoff-traceback-table=false < %t/zero-size-other-section.ll | FileCheck %s --check-prefixes=ZERO-SIZE-OTHER
+; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
+; RUN:     -xcoff-traceback-table=false --filetype=obj < %t/zero-size-other-section.ll -o %t/zero-size-other-section.o
+; RUN: llvm-objdump %t/zero-size-other-section.o -tr | FileCheck %s --check-prefix=ZERO-SIZE-OTHER-OBJ
+; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc64-ibm-aix-xcoff \
+; RUN:     -xcoff-traceback-table=false --filetype=obj < %t/zero-size-other-section.ll -o %t/zero-size-other-section.o
+; RUN: llvm-objdump %t/zero-size-other-section.o -tr | FileCheck %s --check-prefix=ZERO-SIZE-OTHER-OBJ
+
+
 ;--- no-ref.ll
 ; The absence of a __llvm_prf_cnts section should stop generating the .refs.
 ;
@@ -120,3 +138,60 @@ entry:
 ; WITHVNDS-OBJ-NEXT: 00000000 R_REF                    __llvm_prf_vnds
 ; WITHVNDS-OBJ-NEXT: 00000100 R_POS                    .main
 ; WITHVNDS-OBJ-NEXT: 00000104 R_POS                    TOC
+
+;--- zero-size-cnts-section.ll
+; If __llvm_prf_cnts is of zero size, do not generate the .ref directive.
+; The size of the other sections does not matter.
+
+ at dummy_cnts = private global [0 x i32] zeroinitializer, section "__llvm_prf_cnts", align 4
+ at dummy_data = private global [1 x i64] zeroinitializer, section "__llvm_prf_data", align 8
+ at dummy_name = private constant [0 x i32] zeroinitializer, section "__llvm_prf_names", align 4
+
+ at llvm.used = appending global [3 x ptr]
+  [ptr @dummy_cnts,
+   ptr @dummy_data,
+   ptr @dummy_name], section "llvm.metadata"
+
+define i32 @main() #0 {
+entry:
+  ret i32 1
+}
+
+; ZERO-SIZE-CNTS-NOT: .ref __llvm_prf_data[RW]
+; ZERO-SIZE-CNTS-NOT: .ref __llvm_prf_names[RO]
+; ZERO-SIZE-CNTS-NOT: .ref __llvm_prf_vnds
+
+; ZERO-SIZE-CNTS-OBJ-NOT: R_REF  __llvm_prf_data
+; ZERO-SIZE-CNTS-OBJ-NOT: R_REF  __llvm_prf_names
+; ZERO-SIZE-CNTS-OBJ-NOT: R_REF  __llvm_prf_vnds
+
+;--- zero-size-other-section.ll
+; If __llvm_prf_cnts is of non-zero size, generate the .ref directive even if other sections
+; are zero-sized;
+
+ at __profc_main = private global [1 x i64] zeroinitializer, section "__llvm_prf_cnts", align 8
+ at __profd_main = private global [0 x i64] zeroinitializer, section "__llvm_prf_data", align 8
+ at __llvm_prf_nm = private constant [0 x i8] zeroinitializer, section "__llvm_prf_names", align 1
+ at __llvm_prf_vnodes = private global [0 x { i64, i64, ptr }] zeroinitializer, section "__llvm_prf_vnds"
+
+ at llvm.used = appending global [4 x ptr]
+  [ptr @__profc_main,
+   ptr @__profd_main,
+   ptr @__llvm_prf_nm,
+   ptr @__llvm_prf_vnodes], section "llvm.metadata"
+
+define i32 @main() #0 {
+entry:
+  ret i32 1
+}
+
+; ZERO-SIZE-OTHER:      .csect __llvm_prf_cnts[RW],3
+; ZERO-SIZE-OTHER:      .csect __llvm_prf_cnts[RW],3
+; ZERO-SIZE-OTHER-NEXT: .ref __llvm_prf_data[RW]
+; ZERO-SIZE-OTHER-NEXT: .ref __llvm_prf_names[RO]
+; ZERO-SIZE-OTHER-NEXT: .ref __llvm_prf_vnds[RW]
+
+; ZERO-SIZE-OTHER-OBJ:      R_REF __llvm_prf_data
+; ZERO-SIZE-OTHER-OBJ-NEXT: R_REF __llvm_prf_names
+; ZERO-SIZE-OTHER-OBJ-NEXT: R_REF __llvm_prf_vnds
+


        


More information about the llvm-branch-commits mailing list