1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 19:12:56 +02:00

ARM: locate user-defined text sections next to default text.

Make sure functions located in user specified text sections (via the
section attribute) are located together with the default text sections.
Otherwise, for large object files, the relocations for call instructions
are more likely to be out of range. This becomes even more likely in the
presence of LTO.

rdar://12402636

llvm-svn: 165254
This commit is contained in:
Jim Grosbach 2012-10-04 21:33:24 +00:00
parent f89fff64e1
commit 3237e667f1
2 changed files with 41 additions and 4 deletions

View File

@ -23,6 +23,8 @@
#include "InstPrinter/ARMInstPrinter.h"
#include "MCTargetDesc/ARMAddressingModes.h"
#include "MCTargetDesc/ARMMCExpr.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/Constants.h"
#include "llvm/DebugInfo.h"
#include "llvm/Module.h"
@ -42,7 +44,6 @@
#include "llvm/Target/Mangler.h"
#include "llvm/Target/TargetData.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
@ -592,9 +593,24 @@ void ARMAsmPrinter::EmitStartOfAsmFile(Module &M) {
const TargetLoweringObjectFileMachO &TLOFMacho =
static_cast<const TargetLoweringObjectFileMachO &>(
getObjFileLowering());
OutStreamer.SwitchSection(TLOFMacho.getTextSection());
OutStreamer.SwitchSection(TLOFMacho.getTextCoalSection());
OutStreamer.SwitchSection(TLOFMacho.getConstTextCoalSection());
// Collect the set of sections our functions will go into.
SetVector<const MCSection *, SmallVector<const MCSection *, 8>,
SmallPtrSet<const MCSection *, 8> > TextSections;
// Default text section comes first.
TextSections.insert(TLOFMacho.getTextSection());
// Now any user defined text sections from function attributes.
for (Module::iterator F = M.begin(), e = M.end(); F != e; ++F)
if (!F->isDeclaration() && !F->hasAvailableExternallyLinkage())
TextSections.insert(TLOFMacho.SectionForGlobal(F, Mang, TM));
// Now the coalescable sections.
TextSections.insert(TLOFMacho.getTextCoalSection());
TextSections.insert(TLOFMacho.getConstTextCoalSection());
// Emit the sections in the .s file header to fix the order.
for (unsigned i = 0, e = TextSections.size(); i != e; ++i)
OutStreamer.SwitchSection(TextSections[i]);
if (RelocM == Reloc::DynamicNoPIC) {
const MCSection *sect =
OutContext.getMachOSection("__TEXT", "__symbol_stub4",

View File

@ -0,0 +1,21 @@
; RUN: llc < %s -mtriple=armv7-apple-darwin | FileCheck %s
; CHECK: .section __TEXT,__text,regular,pure_instructions
; CHECK: .section __TEXT,myprecious
; CHECK: .section __TEXT,__textcoal_nt,coalesced,pure_instructions
; CHECK: .section __TEXT,__const_coal,coalesced
; CHECK: .section __TEXT,__picsymbolstub4,symbol_stubs,none,16
; CHECK: .section __TEXT,__StaticInit,regular,pure_instructions
define void @normal() nounwind readnone {
; CHECK: .section __TEXT,__text,regular,pure_instructions
; CHECK: _normal:
ret void
}
define void @special() nounwind readnone section "__TEXT,myprecious" {
; CHECK: .section __TEXT,myprecious
; CHECK: _special:
ret void
}