From 82dd03ed9db110527130c027c570e03a7d238836 Mon Sep 17 00:00:00 2001 From: Akira Hatanaka Date: Wed, 14 Oct 2015 23:48:10 +0000 Subject: [PATCH] [MachO] Stop generating *coal* sections. Recommit r250342: add -arch=ppc32 to the RUN lines of powerpc tests. Some background on why we don't have to use *coal* sections anymore: Long ago when C++ was new and "weak" had not been standardized, an attempt was made in cctools to support C++ inlines that can be coalesced by putting them into their own section (TEXT/textcoal_nt instead of TEXT/text). The current macho linker supports the weak-def bit on any symbol to allow it to be coalesced, but the compiler still puts weak-def functions/data into alternate section names, which the linker must map back to the base section name. This patch makes changes that are necessary to prevent the compiler from using the "coal" sections and have it use the non-coal sections instead when the target architecture is not powerpc: TEXT/textcoal_nt instead use TEXT/text TEXT/const_coal instead use TEXT/const DATA/datacoal_nt instead use DATA/data If the target is powerpc, we continue to use the *coal* sections since anyone targeting powerpc is probably using an old linker that doesn't have support for the weak-def bits. Also, have the assembler issue a warning if it encounters a *coal* section in the assembly file and inform the users to use the non-coal sections instead. rdar://problem/14265330 Differential Revision: http://reviews.llvm.org/D13188 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@250349 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCObjectFileInfo.cpp | 41 +++++++++++++++-------- lib/MC/MCParser/DarwinAsmParser.cpp | 25 ++++++++++++++ test/CodeGen/PowerPC/coal-sections.ll | 24 ++++++++++++++ test/CodeGen/X86/coal-sections.ll | 23 +++++++++++++ test/CodeGen/X86/global-sections.ll | 7 ++-- test/MC/MachO/coal-sections-powerpc.s | 46 +++++++++++++++++++++++++ test/MC/MachO/coal-sections-x86_64.s | 48 +++++++++++++++++++++++++++ 7 files changed, 197 insertions(+), 17 deletions(-) create mode 100644 test/CodeGen/PowerPC/coal-sections.ll create mode 100644 test/CodeGen/X86/coal-sections.ll create mode 100644 test/MC/MachO/coal-sections-powerpc.s create mode 100644 test/MC/MachO/coal-sections-x86_64.s diff --git a/lib/MC/MCObjectFileInfo.cpp b/lib/MC/MCObjectFileInfo.cpp index 31091ef284a..666a1c306c5 100644 --- a/lib/MC/MCObjectFileInfo.cpp +++ b/lib/MC/MCObjectFileInfo.cpp @@ -114,22 +114,37 @@ void MCObjectFileInfo::initMachOMCObjectFileInfo(Triple T) { = Ctx->getMachOSection("__TEXT", "__const", 0, SectionKind::getReadOnly()); - TextCoalSection - = Ctx->getMachOSection("__TEXT", "__textcoal_nt", - MachO::S_COALESCED | - MachO::S_ATTR_PURE_INSTRUCTIONS, - SectionKind::getText()); - ConstTextCoalSection - = Ctx->getMachOSection("__TEXT", "__const_coal", - MachO::S_COALESCED, - SectionKind::getReadOnly()); + // If the target is not powerpc, map the coal sections to the non-coal + // sections. + // + // "__TEXT/__textcoal_nt" => section "__TEXT/__text" + // "__TEXT/__const_coal" => section "__TEXT/__const" + // "__DATA/__datacoal_nt" => section "__DATA/__data" + Triple::ArchType ArchTy = T.getArch(); + + if (ArchTy == Triple::ppc || ArchTy == Triple::ppc64) { + TextCoalSection + = Ctx->getMachOSection("__TEXT", "__textcoal_nt", + MachO::S_COALESCED | + MachO::S_ATTR_PURE_INSTRUCTIONS, + SectionKind::getText()); + ConstTextCoalSection + = Ctx->getMachOSection("__TEXT", "__const_coal", + MachO::S_COALESCED, + SectionKind::getReadOnly()); + DataCoalSection + = Ctx->getMachOSection("__DATA","__datacoal_nt", + MachO::S_COALESCED, + SectionKind::getDataRel()); + } else { + TextCoalSection = TextSection; + ConstTextCoalSection = ReadOnlySection; + DataCoalSection = DataSection; + } + ConstDataSection // .const_data = Ctx->getMachOSection("__DATA", "__const", 0, SectionKind::getReadOnlyWithRel()); - DataCoalSection - = Ctx->getMachOSection("__DATA","__datacoal_nt", - MachO::S_COALESCED, - SectionKind::getDataRel()); DataCommonSection = Ctx->getMachOSection("__DATA","__common", MachO::S_ZEROFILL, diff --git a/lib/MC/MCParser/DarwinAsmParser.cpp b/lib/MC/MCParser/DarwinAsmParser.cpp index dc664e8a8f6..5e99ad092f7 100644 --- a/lib/MC/MCParser/DarwinAsmParser.cpp +++ b/lib/MC/MCParser/DarwinAsmParser.cpp @@ -10,8 +10,10 @@ #include "llvm/MC/MCParser/MCAsmParserExtension.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSwitch.h" +#include "llvm/ADT/Triple.h" #include "llvm/ADT/Twine.h" #include "llvm/MC/MCContext.h" +#include "llvm/MC/MCObjectFileInfo.h" #include "llvm/MC/MCParser/MCAsmLexer.h" #include "llvm/MC/MCParser/MCAsmParser.h" #include "llvm/MC/MCSectionMachO.h" @@ -579,6 +581,29 @@ bool DarwinAsmParser::parseDirectiveSection(StringRef, SMLoc) { if (!ErrorStr.empty()) return Error(Loc, ErrorStr.c_str()); + // Issue a warning if the target is not powerpc and Section is a *coal* section. + Triple TT = getParser().getContext().getObjectFileInfo()->getTargetTriple(); + Triple::ArchType ArchTy = TT.getArch(); + + if (ArchTy != Triple::ppc && ArchTy != Triple::ppc64) { + StringRef NonCoalSection = StringSwitch(Section) + .Case("__textcoal_nt", "__text") + .Case("__const_coal", "__const") + .Case("__datacoal_nt", "__data") + .Default(Section); + + if (!Section.equals(NonCoalSection)) { + StringRef SectionVal(Loc.getPointer()); + size_t B = SectionVal.find(',') + 1, E = SectionVal.find(',', B); + SMLoc BLoc = SMLoc::getFromPointer(SectionVal.data() + B); + SMLoc ELoc = SMLoc::getFromPointer(SectionVal.data() + E); + getParser().Warning(Loc, "section \"" + Section + "\" is deprecated", + SMRange(BLoc, ELoc)); + getParser().Note(Loc, "change section name to \"" + NonCoalSection + + "\"", SMRange(BLoc, ELoc)); + } + } + // FIXME: Arch specific. bool isText = Segment == "__TEXT"; // FIXME: Hack. getStreamer().SwitchSection(getContext().getMachOSection( diff --git a/test/CodeGen/PowerPC/coal-sections.ll b/test/CodeGen/PowerPC/coal-sections.ll new file mode 100644 index 00000000000..377891c4714 --- /dev/null +++ b/test/CodeGen/PowerPC/coal-sections.ll @@ -0,0 +1,24 @@ +; RUN: llc < %s -mtriple powerpc-apple-darwin8 -march=ppc32 | FileCheck %s + +; Check that *coal* sections are emitted. + +; CHECK: .section __TEXT,__textcoal_nt,coalesced,pure_instructions +; CHECK: .section __TEXT,__textcoal_nt,coalesced,pure_instructions +; CHECK-NEXT: .globl _foo + +; CHECK: .section __TEXT,__const_coal,coalesced +; CHECK-NEXT: .globl _a + +; CHECK: .section __DATA,__datacoal_nt,coalesced +; CHECK-NEXT: .globl _b + +@a = weak_odr constant [4 x i32] [i32 1, i32 2, i32 3, i32 4], align 16 +@b = weak global i32 5, align 4 +@g = common global i32* null, align 8 + +; Function Attrs: nounwind ssp uwtable +define weak i32* @foo() { +entry: + store i32* getelementptr inbounds ([4 x i32], [4 x i32]* @a, i64 0, i64 0), i32** @g, align 8 + ret i32* @b +} diff --git a/test/CodeGen/X86/coal-sections.ll b/test/CodeGen/X86/coal-sections.ll new file mode 100644 index 00000000000..05b2a8c8bf8 --- /dev/null +++ b/test/CodeGen/X86/coal-sections.ll @@ -0,0 +1,23 @@ +; RUN: llc < %s -mtriple x86_64-apple-darwin | FileCheck %s + +; Check that *coal* sections are not emitted. + +; CHECK: .section __TEXT,__text,regular,pure_instructions{{$}} +; CHECK-NEXT: .globl _foo + +; CHECK: .section __TEXT,__const{{$}} +; CHECK-NEXT: .globl _a + +; CHECK: .section __DATA,__data{{$}} +; CHECK-NEXT: .globl _b + +@a = weak_odr constant [4 x i32] [i32 1, i32 2, i32 3, i32 4], align 16 +@b = weak global i32 5, align 4 +@g = common global i32* null, align 8 + +; Function Attrs: nounwind ssp uwtable +define weak i32* @foo() { +entry: + store i32* getelementptr inbounds ([4 x i32], [4 x i32]* @a, i64 0, i64 0), i32** @g, align 8 + ret i32* @b +} diff --git a/test/CodeGen/X86/global-sections.ll b/test/CodeGen/X86/global-sections.ll index 82547a60674..92440f2b331 100644 --- a/test/CodeGen/X86/global-sections.ll +++ b/test/CodeGen/X86/global-sections.ll @@ -117,7 +117,7 @@ bb7: ; TODO: linux drops this into .rodata, we drop it into ".gnu.linkonce.r.G2" -; DARWIN: .section __TEXT,__const_coal,coalesced +; DARWIN: .section __TEXT,__const{{$}} ; DARWIN: _G2: ; DARWIN: .long 42 @@ -176,7 +176,6 @@ bb7: ; LINUX: .weak "foo bar" ; LINUX: "foo bar": -; DARWIN: .section __DATA,__datacoal_nt,coalesced ; DARWIN: .globl "_foo bar" ; DARWIN: .weak_definition "_foo bar" ; DARWIN: "_foo bar": @@ -190,7 +189,7 @@ bb7: ; LINUX: .byte 1 ; LINUX: .size G6, 1 -; DARWIN: .section __TEXT,__const_coal,coalesced +; DARWIN: .section __TEXT,__const{{$}} ; DARWIN: .globl _G6 ; DARWIN: .weak_definition _G6 ; DARWIN:_G6: @@ -239,7 +238,7 @@ bb7: @G10 = weak global [100 x i32] zeroinitializer, align 32 ; <[100 x i32]*> [#uses=0] -; DARWIN: .section __DATA,__datacoal_nt,coalesced +; DARWIN: .section __DATA,__data{{$}} ; DARWIN: .globl _G10 ; DARWIN: .weak_definition _G10 ; DARWIN: .align 5 diff --git a/test/MC/MachO/coal-sections-powerpc.s b/test/MC/MachO/coal-sections-powerpc.s new file mode 100644 index 00000000000..1c3dc37d5bd --- /dev/null +++ b/test/MC/MachO/coal-sections-powerpc.s @@ -0,0 +1,46 @@ +// RUN: llvm-mc -triple powerpc-apple-darwin8 -arch=ppc32 -filetype=obj %s -o - | llvm-readobj -sections | FileCheck %s + +// CHECK: Section { +// CHECK-NEXT: Index: 0 + +// CHECK: Section { +// CHECK-NEXT: Index: 1 +// CHECK-NEXT: Name: __textcoal_nt ( + +// CHECK: Section { +// CHECK-NEXT: Index: 2 + +// CHECK: Section { +// CHECK-NEXT: Index: 3 +// CHECK-NEXT: Name: __const_coal ( + +// CHECK: Section { +// CHECK-NEXT: Index: 4 +// CHECK-NEXT: Name: __datacoal_nt ( + + .section __TEXT,__text,regular,pure_instructions + .machine ppc + .section __TEXT,__textcoal_nt,coalesced,pure_instructions + .section __TEXT,__symbol_stub1,symbol_stubs,pure_instructions,16 + .section __TEXT,__text,regular,pure_instructions + .section __TEXT,__textcoal_nt,coalesced,pure_instructions + .globl _foo + .weak_definition _foo + .align 4 +_foo: + blr + +.subsections_via_symbols + .section __TEXT,__const_coal,coalesced + .globl _a ; @a + .weak_definition _a + .align 4 +_a: + .long 1 ; 0x1 + + .section __DATA,__datacoal_nt,coalesced + .globl _b ; @b + .weak_definition _b + .align 2 +_b: + .long 5 ; 0x5 diff --git a/test/MC/MachO/coal-sections-x86_64.s b/test/MC/MachO/coal-sections-x86_64.s new file mode 100644 index 00000000000..5ecdc578dbb --- /dev/null +++ b/test/MC/MachO/coal-sections-x86_64.s @@ -0,0 +1,48 @@ +// RUN: llvm-mc -triple x86_64-apple-darwin -filetype=obj %s -o - 2>%t.err | llvm-readobj -sections | FileCheck %s +// RUN: FileCheck --check-prefix=WARNING < %t.err %s + +// CHECK: Section { +// CHECK-NEXT: Index: 0 +// CHECK-NEXT: Name: __text ( + +// CHECK: Section { +// CHECK-NEXT: Index: 1 +// CHECK-NEXT: Name: __textcoal_nt ( + +// CHECK: Section { +// CHECK-NEXT: Index: 2 +// CHECK-NEXT: Name: __const_coal ( + +// CHECK: Section { +// CHECK-NEXT: Index: 3 +// CHECK-NEXT: Name: __datacoal_nt ( + +// WARNING: warning: section "__textcoal_nt" is deprecated +// WARNING: note: change section name to "__text" +// WARNING: warning: section "__const_coal" is deprecated +// WARNING: note: change section name to "__const" +// WARNING: warning: section "__datacoal_nt" is deprecated +// WARNING: note: change section name to "__data" + + .section __TEXT,__textcoal_nt,coalesced,pure_instructions + .globl _foo + .weak_definition _foo + .align 4, 0x90 +_foo: + retq + + .section __TEXT,__const_coal,coalesced + .globl _a ## @a + .weak_definition _a + .align 4 +_a: + .long 1 ## 0x1 + + .section __DATA,__datacoal_nt,coalesced + .globl _b ## @b + .weak_definition _b + .align 2 +_b: + .long 5 ## 0x5 + +.subsections_via_symbols -- 2.34.1