[PATCH] D71144: Not emit correct Assembly for Global Function pointer initiated with function.

Digger via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 10 10:37:16 PST 2019


DiggerLin updated this revision to Diff 233142.
DiggerLin marked 4 inline comments as done.

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D71144/new/

https://reviews.llvm.org/D71144

Files:
  llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
  llvm/test/CodeGen/PowerPC/aix-xcoff-FuntionDS.ll


Index: llvm/test/CodeGen/PowerPC/aix-xcoff-FuntionDS.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/PowerPC/aix-xcoff-FuntionDS.ll
@@ -0,0 +1,21 @@
+; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mtriple powerpc-ibm-aix-xcoff < %s | FileCheck %s
+
+ at foo_ptr = global void (...)* @foo
+declare void @foo(...) 
+
+ at bar_ptr1 = global void (...)* bitcast (void ()* @bar to void (...)*)
+define void @bar() {
+entry:
+  ret void
+}
+
+
+;CHECK:          .csect .data[RW]
+;CHECK-NEXT:     .globl  foo_ptr
+;CHECK-NEXT:     .align  2
+;CHECK-NEXT:     foo_ptr:
+;CHECK-NEXT:     .long   foo[DS]
+;CHECK-NEXT:     .globl  bar_ptr1
+;CHECK-NEXT:     .align  2
+;CHECK-NEXT:     bar_ptr1:
+;CHECK-NEXT:     .long   bar[DS]
Index: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
===================================================================
--- llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
+++ llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
@@ -177,6 +177,8 @@
 
   void SetupMachineFunction(MachineFunction &MF) override;
 
+  const MCExpr *lowerConstant(const Constant *CV) override;
+
   void EmitGlobalVariable(const GlobalVariable *GV) override;
 
   void EmitFunctionDescriptor() override;
@@ -1755,6 +1757,26 @@
     report_fatal_error("COMDAT not yet supported by AIX.");
 }
 
+const MCExpr *PPCAIXAsmPrinter::lowerConstant(const Constant *CV) {
+  if (const GlobalObject *GO = dyn_cast<GlobalObject>(CV)) {
+    if (isa<Function>(GO)) {
+      MCSymbolXCOFF *GOSym = cast<MCSymbolXCOFF>(getSymbol(GO));
+      if (!GOSym->hasContainingCsect()) {
+        const XCOFF::StorageClass SC =
+            TargetLoweringObjectFileXCOFF::getStorageClassForGlobal(GO);
+        GOSym->setStorageClass(SC);
+        MCSectionXCOFF *Csect = OutStreamer->getContext().getXCOFFSection(
+            GOSym->getName(), XCOFF::XMC_DS,
+            GO->isDeclaration() ? XCOFF::XTY_ER : XCOFF::XTY_SD, SC,
+            SectionKind::getMetadata());
+        GOSym->setContainingCsect(Csect);
+      }
+      return MCSymbolRefExpr::create(
+          GOSym->getContainingCsect()->getQualNameSymbol(), OutContext);
+    }
+  }
+  return AsmPrinter::lowerConstant(CV);
+}
 void PPCAIXAsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
   ValidateGV(GV);
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D71144.233142.patch
Type: text/x-patch
Size: 2293 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191210/cafda6e3/attachment.bin>


More information about the llvm-commits mailing list