[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
Fri Dec 6 12:43:26 PST 2019
DiggerLin created this revision.
DiggerLin added reviewers: daltenty, jasonliu, sfertile, hubert.reinterpretcast, Xiangling_L.
Herald added subscribers: llvm-commits, jsji, kbarton, hiraditya, nemanjai.
Herald added a project: LLVM.
Source:
void foo();
void (*foo_ptr)() = &foo;
void bar() {
return ;
}
void (*bar_ptr1)() = &bar;
Expected asm:
foo_ptr:
.long foo[DS]
bar_ptr1:
.long bar[DS]
but We are now emitting:
foo_ptr:
.long foo
bar_ptr1:
.long bar
Repository:
rG LLVM Github Monorepo
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,22 @@
+; RUN: llc -mtriple powerpc-ibm-aix-xcoff < %s | FileCheck %s
+
+ at foo_ptr = global void (...)* @foo, align 4
+declare void @foo(...) #0
+
+ at bar_ptr1 = global void (...)* bitcast (void ()* @bar to void (...)*), align 4
+; Function Attrs: noinline nounwind optnone
+define void @bar() #0 {
+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.232631.patch
Type: text/x-patch
Size: 2328 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191206/b46a7163/attachment.bin>
More information about the llvm-commits
mailing list