From 7defe1736c641641ced1eeb8a827f9d11893a888 Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Wed, 20 Nov 2019 11:01:45 -0500 Subject: [PATCH] [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 --- lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 22 +++++++++++++-- lib/Target/PowerPC/PPCAsmPrinter.cpp | 3 +- .../PowerPC/aix-xcoff-mergeable-str.ll | 28 +++++++++++++++++++ 3 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 test/CodeGen/PowerPC/aix-xcoff-mergeable-str.ll diff --git a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index 5d5f77b83ef..34ed476112f 100644 --- a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -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(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: diff --git a/lib/Target/PowerPC/PPCAsmPrinter.cpp b/lib/Target/PowerPC/PPCAsmPrinter.cpp index e4b3d468476..1b1d27ee3cc 100644 --- a/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -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."); diff --git a/test/CodeGen/PowerPC/aix-xcoff-mergeable-str.ll b/test/CodeGen/PowerPC/aix-xcoff-mergeable-str.ll new file mode 100644 index 00000000000..1b12ebb7169 --- /dev/null +++ b/test/CodeGen/PowerPC/aix-xcoff-mergeable-str.ll @@ -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