mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-22 04:22:57 +02:00
[AIX] Use csect reference for function address constants
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
This commit is contained in:
parent
9ec7402b13
commit
6c72101f26
@ -177,6 +177,8 @@ public:
|
||||
|
||||
void SetupMachineFunction(MachineFunction &MF) override;
|
||||
|
||||
const MCExpr *lowerConstant(const Constant *CV) override;
|
||||
|
||||
void EmitGlobalVariable(const GlobalVariable *GV) override;
|
||||
|
||||
void EmitFunctionDescriptor() override;
|
||||
@ -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);
|
||||
|
||||
|
32
test/CodeGen/PowerPC/aix-reference-func-addr-const.ll
Normal file
32
test/CodeGen/PowerPC/aix-reference-func-addr-const.ll
Normal file
@ -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]
|
Loading…
Reference in New Issue
Block a user