Skip to content

Commit

Permalink
[MachO] Stop generating *coal* sections.
Browse files Browse the repository at this point in the history
Recommit r250342: move coal-sections-powerpc.s to subdirectory for powerpc.

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

llvm-svn: 250370
  • Loading branch information
ahatanaka committed Oct 15, 2015
1 parent 1ac9bfb commit 8ad7399
Show file tree
Hide file tree
Showing 8 changed files with 199 additions and 17 deletions.
41 changes: 28 additions & 13 deletions llvm/lib/MC/MCObjectFileInfo.cpp
Expand Up @@ -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,
Expand Down
25 changes: 25 additions & 0 deletions llvm/lib/MC/MCParser/DarwinAsmParser.cpp
Expand Up @@ -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"
Expand Down Expand Up @@ -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<StringRef>(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(
Expand Down
24 changes: 24 additions & 0 deletions llvm/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
}
23 changes: 23 additions & 0 deletions llvm/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
}
7 changes: 3 additions & 4 deletions llvm/test/CodeGen/X86/global-sections.ll
Expand Up @@ -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

Expand Down Expand Up @@ -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":
Expand All @@ -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:
Expand Down Expand Up @@ -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
Expand Down
46 changes: 46 additions & 0 deletions llvm/test/MC/MachO/PowerPC/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
2 changes: 2 additions & 0 deletions llvm/test/MC/MachO/PowerPC/lit.local.cfg
@@ -0,0 +1,2 @@
if not 'PowerPC' in config.root.targets:
config.unsupported = True
48 changes: 48 additions & 0 deletions llvm/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

0 comments on commit 8ad7399

Please sign in to comment.