Skip to content

Commit

Permalink
[AIX] Use csect reference for function address constants
Browse files Browse the repository at this point in the history
SUMMARY:
We currently emit a reference for function address constants as labels;
for example:

foo_ptr:
.long foo
however, there may be no such label in the case where the function is
undefined. Although the label exists when the function is defined, we
will (to be consistent) also use a csect reference in that case.

Reviewers: daltenty,hubert.reinterpretcast,jasonliu,Xiangling_L
Subscribers: cebowleratibm, wuzish, nemanjai

Differential Revision: https://reviews.llvm.org/D71144
  • Loading branch information
diggerlin committed Jan 6, 2020
1 parent eec0240 commit 61b5e72
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 0 deletions.
22 changes: 22 additions & 0 deletions llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
Expand Up @@ -177,6 +177,8 @@ class PPCAIXAsmPrinter : public PPCAsmPrinter {

void SetupMachineFunction(MachineFunction &MF) override;

const MCExpr *lowerConstant(const Constant *CV) override;

void EmitGlobalVariable(const GlobalVariable *GV) override;

void EmitFunctionDescriptor() override;
Expand Down Expand Up @@ -1763,6 +1765,26 @@ void PPCAIXAsmPrinter::ValidateGV(const GlobalVariable *GV) {
report_fatal_error("COMDAT not yet supported by AIX.");
}

const MCExpr *PPCAIXAsmPrinter::lowerConstant(const Constant *CV) {
if (const Function *F = dyn_cast<Function>(CV)) {
MCSymbolXCOFF *FSym = cast<MCSymbolXCOFF>(getSymbol(F));
if (!FSym->hasContainingCsect()) {
const XCOFF::StorageClass SC =
F->isDeclaration()
? TargetLoweringObjectFileXCOFF::getStorageClassForGlobal(F)
: XCOFF::C_HIDEXT;
MCSectionXCOFF *Csect = OutStreamer->getContext().getXCOFFSection(
FSym->getName(), XCOFF::XMC_DS,
F->isDeclaration() ? XCOFF::XTY_ER : XCOFF::XTY_SD, SC,
SectionKind::getMetadata());
FSym->setContainingCsect(Csect);
}
return MCSymbolRefExpr::create(
FSym->getContainingCsect()->getQualNameSymbol(), OutContext);
}
return PPCAsmPrinter::lowerConstant(CV);
}

void PPCAIXAsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
ValidateGV(GV);

Expand Down
32 changes: 32 additions & 0 deletions llvm/test/CodeGen/PowerPC/aix-reference-func-addr-const.ll
@@ -0,0 +1,32 @@
; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mtriple powerpc-ibm-aix-xcoff < %s | FileCheck %s
; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mtriple powerpc64-ibm-aix-xcoff < %s | FileCheck --check-prefix=CHECK64 %s

@foo_ptr = global void (...)* @foo
declare void @foo(...)

@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]

;CHECK64: .csect .data[RW]
;CHECK64-NEXT: .globl foo_ptr
;CHECK64-NEXT: .align 3
;CHECK64-NEXT: foo_ptr:
;CHECK64-NEXT: .llong foo[DS]
;CHECK64-NEXT: .globl bar_ptr1
;CHECK64-NEXT: .align 3
;CHECK64-NEXT: bar_ptr1:
;CHECK64-NEXT: .llong bar[DS]

0 comments on commit 61b5e72

Please sign in to comment.