mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 19:52:54 +01:00
[AIX][XCOFF] Add support for generating assembly code for one-byte mergable strings
This patch adds support for generating assembly code for one-byte mergeable strings. Generating assembly code for multi-byte mergeable strings and the `XCOFF` object code for mergeable strings will be supported later. Reviewers: hubert.reinterpretcast, jasonliu, daltenty, sfertile, DiggerLin, Xiangling_L Reviewed by: daltenty Subscribers: wuzish, nemanjai, hiraditya, kbarton, jsji, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D70310
This commit is contained in:
parent
7cb6af25c8
commit
7defe1736c
@ -1849,6 +1849,24 @@ MCSection *TargetLoweringObjectFileXCOFF::SelectSectionForGlobal(
|
||||
SC, Kind, /* BeginSymbolName */ nullptr);
|
||||
}
|
||||
|
||||
if (Kind.isMergeableCString()) {
|
||||
if (!Kind.isMergeable1ByteCString())
|
||||
report_fatal_error("Unhandled multi-byte mergeable string kind.");
|
||||
|
||||
unsigned Align = GO->getParent()->getDataLayout().getPreferredAlignment(
|
||||
cast<GlobalVariable>(GO));
|
||||
|
||||
unsigned EntrySize = getEntrySizeForKind(Kind);
|
||||
std::string SizeSpec = ".rodata.str" + utostr(EntrySize) + ".";
|
||||
SmallString<128> Name;
|
||||
Name = SizeSpec + utostr(Align);
|
||||
|
||||
return getContext().getXCOFFSection(
|
||||
Name, XCOFF::XMC_RO, XCOFF::XTY_SD,
|
||||
TargetLoweringObjectFileXCOFF::getStorageClassForGlobal(GO),
|
||||
Kind, /* BeginSymbolName */ nullptr);
|
||||
}
|
||||
|
||||
if (Kind.isText())
|
||||
return TextSection;
|
||||
|
||||
@ -1861,8 +1879,7 @@ MCSection *TargetLoweringObjectFileXCOFF::SelectSectionForGlobal(
|
||||
if (Kind.isBSS())
|
||||
return DataSection;
|
||||
|
||||
if (Kind.isReadOnly() && !Kind.isMergeableConst() &&
|
||||
!Kind.isMergeableCString())
|
||||
if (Kind.isReadOnly() && !Kind.isMergeableConst())
|
||||
return ReadOnlySection;
|
||||
|
||||
report_fatal_error("XCOFF other section types not yet implemented.");
|
||||
@ -1920,6 +1937,7 @@ XCOFF::StorageClass TargetLoweringObjectFileXCOFF::getStorageClassForGlobal(
|
||||
const GlobalObject *GO) {
|
||||
switch (GO->getLinkage()) {
|
||||
case GlobalValue::InternalLinkage:
|
||||
case GlobalValue::PrivateLinkage:
|
||||
return XCOFF::C_HIDEXT;
|
||||
case GlobalValue::ExternalLinkage:
|
||||
case GlobalValue::CommonLinkage:
|
||||
|
@ -1749,7 +1749,8 @@ void PPCAIXAsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
|
||||
SectionKind GVKind = getObjFileLowering().getKindForGlobal(GV, TM);
|
||||
if ((!GVKind.isCommon() && !GVKind.isBSS() && !GVKind.isData() &&
|
||||
!GVKind.isReadOnly()) ||
|
||||
GVKind.isMergeableCString() || GVKind.isMergeableConst())
|
||||
GVKind.isMergeable2ByteCString() || GVKind.isMergeable4ByteCString() ||
|
||||
GVKind.isMergeableConst())
|
||||
report_fatal_error("Encountered a global variable kind that is "
|
||||
"not supported yet.");
|
||||
|
||||
|
28
test/CodeGen/PowerPC/aix-xcoff-mergeable-str.ll
Normal file
28
test/CodeGen/PowerPC/aix-xcoff-mergeable-str.ll
Normal file
@ -0,0 +1,28 @@
|
||||
; This file tests the codegen of mergeable strings in AIX assembly only.
|
||||
; Once the codegen of mergeable strings for XCOFF object files is supported
|
||||
; the test in this file should be merged into aix-xcoff-data.ll with additional
|
||||
; tests for XCOFF object files.
|
||||
|
||||
; RUN: llc -verify-machineinstrs -mcpu=pwr7 \
|
||||
; RUN: -mtriple powerpc-ibm-aix-xcoff < %s | FileCheck %s
|
||||
; RUN: llc -verify-machineinstrs -mcpu=pwr7 \
|
||||
; RUN: -mtriple powerpc64-ibm-aix-xcoff < %s | FileCheck %s
|
||||
|
||||
@strA = private unnamed_addr constant [14 x i8] c"hello world!\0A\00", align 1
|
||||
|
||||
; CHECK: .csect .rodata.str1.1[RO]
|
||||
; CHECK-NEXT: .LstrA:
|
||||
; CHECK-NEXT: .byte 104
|
||||
; CHECK-NEXT: .byte 101
|
||||
; CHECK-NEXT: .byte 108
|
||||
; CHECK-NEXT: .byte 108
|
||||
; CHECK-NEXT: .byte 111
|
||||
; CHECK-NEXT: .byte 32
|
||||
; CHECK-NEXT: .byte 119
|
||||
; CHECK-NEXT: .byte 111
|
||||
; CHECK-NEXT: .byte 114
|
||||
; CHECK-NEXT: .byte 108
|
||||
; CHECK-NEXT: .byte 100
|
||||
; CHECK-NEXT: .byte 33
|
||||
; CHECK-NEXT: .byte 10
|
||||
; CHECK-NEXT: .byte 0
|
Loading…
Reference in New Issue
Block a user