[llvm] Do not generate the special .ref for zero-sized sections (PR #66805)
Wael Yehia via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 19 12:19:57 PDT 2023
https://github.com/w2yehia created https://github.com/llvm/llvm-project/pull/66805
None
>From c205629c44a9bb27fdcac54a9f22bfd42b9353d1 Mon Sep 17 00:00:00 2001
From: Wael Yehia <wyehia at ca.ibm.com>
Date: Tue, 19 Sep 2023 13:49:39 -0400
Subject: [PATCH] Do not generate the special .ref for zero-sized sections
---
llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp | 26 ++++++++++++++++++-----
1 file changed, 21 insertions(+), 5 deletions(-)
diff --git a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
index 4b97e3e1a09152f..826cfd4caa066ce 100644
--- a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
+++ b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
@@ -280,7 +280,7 @@ class PPCAIXAsmPrinter : public PPCAsmPrinter {
void emitFunctionBodyEnd() override;
- void emitPGORefs();
+ void emitPGORefs(Module &M);
void emitEndOfAsmFile(Module &) override;
@@ -2652,10 +2652,26 @@ 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;
+
+ // An XCOFF .ref directive translates into a relocation entry from the source
+ // (referring) csect to the destination (referred-to) csect. When the source
+ // csect has zero length, the relocation is ambiguous and should not be
+ // generated.
+ 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),
@@ -2689,7 +2705,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());
More information about the llvm-commits
mailing list