Skip to content

Commit

Permalink
Recommit r224935 with a fix for the ObjC++/AArch64 bug that that revi…
Browse files Browse the repository at this point in the history
…sion

introduced.

A test case for the bug was already committed in r225385.

Patch by Rafael Espindola.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@225534 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
lhames committed Jan 9, 2015
1 parent 98e3b1a commit 4c553e0
Show file tree
Hide file tree
Showing 15 changed files with 83 additions and 104 deletions.
2 changes: 0 additions & 2 deletions include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,6 @@ class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
Mangler &Mang, const TargetMachine &TM) const override;

bool isSectionAtomizableBySymbols(const MCSection &Section) const override;

const MCSection *
SelectSectionForGlobal(const GlobalValue *GV,
SectionKind Kind, Mangler &Mang,
Expand Down
8 changes: 0 additions & 8 deletions include/llvm/MC/MCAsmBackend.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,14 +67,6 @@ class MCAsmBackend {
return false;
}

/// isSectionAtomizable - Check whether the given section can be split into
/// atoms.
///
/// \see MCAssembler::isSymbolLinkerVisible().
virtual bool isSectionAtomizable(const MCSection &Section) const {
return true;
}

/// @name Target Fixup Interfaces
/// @{

Expand Down
6 changes: 6 additions & 0 deletions include/llvm/MC/MCAsmInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,12 @@ class MCAsmInfo {
return nullptr;
}

/// \brief True if the section is atomized using the symbols in it.
/// This is false if the section is not atomized at all (most ELF sections) or
/// if it is atomized based on its contents (MachO' __TEXT,__cstring for
/// example).
virtual bool isSectionAtomizableBySymbols(const MCSection &Section) const;

virtual const MCExpr *getExprForPersonalitySymbol(const MCSymbol *Sym,
unsigned Encoding,
MCStreamer &Streamer) const;
Expand Down
2 changes: 1 addition & 1 deletion include/llvm/MC/MCAsmInfoDarwin.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@

namespace llvm {
class MCAsmInfoDarwin : public MCAsmInfo {
virtual void anchor();
public:
explicit MCAsmInfoDarwin();
bool isSectionAtomizableBySymbols(const MCSection &Section) const override;
};
}

Expand Down
6 changes: 0 additions & 6 deletions include/llvm/Target/TargetLoweringObjectFile.h
Original file line number Diff line number Diff line change
Expand Up @@ -151,12 +151,6 @@ class TargetLoweringObjectFile : public MCObjectFileInfo {
return nullptr;
}

/// \brief True if the section is atomized using the symbols in it.
/// This is false if the section is not atomized at all (most ELF sections) or
/// if it is atomized based on its contents (MachO' __TEXT,__cstring for
/// example).
virtual bool isSectionAtomizableBySymbols(const MCSection &Section) const;

protected:
virtual const MCSection *
SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
Expand Down
54 changes: 0 additions & 54 deletions lib/CodeGen/TargetLoweringObjectFileImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -573,60 +573,6 @@ const MCSection *TargetLoweringObjectFileMachO::getExplicitSectionGlobal(
return S;
}

bool TargetLoweringObjectFileMachO::isSectionAtomizableBySymbols(
const MCSection &Section) const {
const MCSectionMachO &SMO = static_cast<const MCSectionMachO&>(Section);

// Sections holding 1 byte strings are atomized based on the data
// they contain.
// Sections holding 2 byte strings require symbols in order to be
// atomized.
// There is no dedicated section for 4 byte strings.
if (SMO.getKind().isMergeable1ByteCString())
return false;

if (SMO.getSegmentName() == "__TEXT" &&
SMO.getSectionName() == "__objc_classname" &&
SMO.getType() == MachO::S_CSTRING_LITERALS)
return false;

if (SMO.getSegmentName() == "__TEXT" &&
SMO.getSectionName() == "__objc_methname" &&
SMO.getType() == MachO::S_CSTRING_LITERALS)
return false;

if (SMO.getSegmentName() == "__TEXT" &&
SMO.getSectionName() == "__objc_methtype" &&
SMO.getType() == MachO::S_CSTRING_LITERALS)
return false;

if (SMO.getSegmentName() == "__DATA" &&
SMO.getSectionName() == "__cfstring")
return false;

// no_dead_strip sections are not atomized in practice.
if (SMO.hasAttribute(MachO::S_ATTR_NO_DEAD_STRIP))
return false;

switch (SMO.getType()) {
default:
return true;

// These sections are atomized at the element boundaries without using
// symbols.
case MachO::S_4BYTE_LITERALS:
case MachO::S_8BYTE_LITERALS:
case MachO::S_16BYTE_LITERALS:
case MachO::S_LITERAL_POINTERS:
case MachO::S_NON_LAZY_SYMBOL_POINTERS:
case MachO::S_LAZY_SYMBOL_POINTERS:
case MachO::S_MOD_INIT_FUNC_POINTERS:
case MachO::S_MOD_TERM_FUNC_POINTERS:
case MachO::S_INTERPOSING:
return false;
}
}

const MCSection *TargetLoweringObjectFileMachO::
SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
Mangler &Mang, const TargetMachine &TM) const {
Expand Down
4 changes: 4 additions & 0 deletions lib/MC/MCAsmInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,10 @@ MCAsmInfo::MCAsmInfo() {
MCAsmInfo::~MCAsmInfo() {
}

bool MCAsmInfo::isSectionAtomizableBySymbols(const MCSection &Section) const {
return false;
}

const MCExpr *
MCAsmInfo::getExprForPersonalitySymbol(const MCSymbol *Sym,
unsigned Encoding,
Expand Down
49 changes: 48 additions & 1 deletion lib/MC/MCAsmInfoDarwin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,57 @@
#include "llvm/MC/MCAsmInfoDarwin.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCSectionMachO.h"
#include "llvm/MC/MCStreamer.h"
using namespace llvm;

void MCAsmInfoDarwin::anchor() { }
bool MCAsmInfoDarwin::isSectionAtomizableBySymbols(
const MCSection &Section) const {
const MCSectionMachO &SMO = static_cast<const MCSectionMachO &>(Section);

// Sections holding 1 byte strings are atomized based on the data they
// contain.
// Sections holding 2 byte strings require symbols in order to be atomized.
// There is no dedicated section for 4 byte strings.
if (SMO.getKind().isMergeable1ByteCString())
return false;

if (SMO.getSegmentName() == "__TEXT" &&
SMO.getSectionName() == "__objc_classname" &&
SMO.getType() == MachO::S_CSTRING_LITERALS)
return false;

if (SMO.getSegmentName() == "__TEXT" &&
SMO.getSectionName() == "__objc_methname" &&
SMO.getType() == MachO::S_CSTRING_LITERALS)
return false;

if (SMO.getSegmentName() == "__TEXT" &&
SMO.getSectionName() == "__objc_methtype" &&
SMO.getType() == MachO::S_CSTRING_LITERALS)
return false;

if (SMO.getSegmentName() == "__DATA" && SMO.getSectionName() == "__cfstring")
return false;

switch (SMO.getType()) {
default:
return true;

// These sections are atomized at the element boundaries without using
// symbols.
case MachO::S_4BYTE_LITERALS:
case MachO::S_8BYTE_LITERALS:
case MachO::S_16BYTE_LITERALS:
case MachO::S_LITERAL_POINTERS:
case MachO::S_NON_LAZY_SYMBOL_POINTERS:
case MachO::S_LAZY_SYMBOL_POINTERS:
case MachO::S_MOD_INIT_FUNC_POINTERS:
case MachO::S_MOD_TERM_FUNC_POINTERS:
case MachO::S_INTERPOSING:
return false;
}
}

MCAsmInfoDarwin::MCAsmInfoDarwin() {
// Common settings for all Darwin targets.
Expand Down
5 changes: 3 additions & 2 deletions lib/MC/MCAssembler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/Twine.h"
#include "llvm/MC/MCAsmBackend.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCAsmLayout.h"
#include "llvm/MC/MCCodeEmitter.h"
#include "llvm/MC/MCContext.h"
Expand Down Expand Up @@ -448,8 +449,8 @@ const MCSymbolData *MCAssembler::getAtom(const MCSymbolData *SD) const {

// Non-linker visible symbols in sections which can't be atomized have no
// defining atom.
if (!getBackend().isSectionAtomizable(
SD->getFragment()->getParent()->getSection()))
if (!getContext().getAsmInfo()->isSectionAtomizableBySymbols(
SD->getFragment()->getParent()->getSection()))
return nullptr;

// Otherwise, return the atom for the containing fragment.
Expand Down
3 changes: 2 additions & 1 deletion lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@
namespace llvm {

class ARMMCAsmInfoDarwin : public MCAsmInfoDarwin {
void anchor() override;
virtual void anchor();

public:
explicit ARMMCAsmInfoDarwin(StringRef TT);
};
Expand Down
3 changes: 2 additions & 1 deletion lib/Target/PowerPC/MCTargetDesc/PPCMCAsmInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ namespace llvm {
class Triple;

class PPCMCAsmInfoDarwin : public MCAsmInfoDarwin {
void anchor() override;
virtual void anchor();

public:
explicit PPCMCAsmInfoDarwin(bool is64Bit, const Triple&);
};
Expand Down
6 changes: 0 additions & 6 deletions lib/Target/TargetLoweringObjectFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -270,12 +270,6 @@ SectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler &Mang,
return SelectSectionForGlobal(GV, Kind, Mang, TM);
}

bool TargetLoweringObjectFile::isSectionAtomizableBySymbols(
const MCSection &Section) const {
return false;
}


/// getSectionForConstant - Given a mergable constant with the
/// specified size and relocation information, return a section that it
/// should be placed in.
Expand Down
16 changes: 15 additions & 1 deletion lib/Target/TargetMachine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCCodeGenInfo.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCSectionMachO.h"
#include "llvm/MC/MCTargetOptions.h"
#include "llvm/MC/SectionKind.h"
#include "llvm/Support/CommandLine.h"
Expand Down Expand Up @@ -169,6 +170,19 @@ void TargetMachine::setDataSections(bool V) {
Options.DataSections = V;
}

static bool canUsePrivateLabel(const MCAsmInfo &AsmInfo,
const MCSection &Section) {
if (!AsmInfo.isSectionAtomizableBySymbols(Section))
return true;

// If it is not dead stripped, it is safe to use private labels.
const MCSectionMachO &SMO = cast<MCSectionMachO>(Section);
if (SMO.hasAttribute(MachO::S_ATTR_NO_DEAD_STRIP))
return true;

return false;
}

void TargetMachine::getNameWithPrefix(SmallVectorImpl<char> &Name,
const GlobalValue *GV, Mangler &Mang,
bool MayAlwaysUsePrivate) const {
Expand All @@ -182,7 +196,7 @@ void TargetMachine::getNameWithPrefix(SmallVectorImpl<char> &Name,
const TargetLoweringObjectFile &TLOF =
getSubtargetImpl()->getTargetLowering()->getObjFileLowering();
const MCSection *TheSection = TLOF.SectionForGlobal(GV, GVKind, Mang, *this);
bool CannotUsePrivateLabel = TLOF.isSectionAtomizableBySymbols(*TheSection);
bool CannotUsePrivateLabel = !canUsePrivateLabel(*AsmInfo, *TheSection);
Mang.getNameWithPrefix(Name, GV, CannotUsePrivateLabel);
}

Expand Down
20 changes: 0 additions & 20 deletions lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -790,26 +790,6 @@ class DarwinX86_64AsmBackend : public DarwinX86AsmBackend {
return SMO.getType() == MachO::S_CSTRING_LITERALS;
}

bool isSectionAtomizable(const MCSection &Section) const override {
const MCSectionMachO &SMO = static_cast<const MCSectionMachO&>(Section);
// Fixed sized data sections are uniqued, they cannot be diced into atoms.
switch (SMO.getType()) {
default:
return true;

case MachO::S_4BYTE_LITERALS:
case MachO::S_8BYTE_LITERALS:
case MachO::S_16BYTE_LITERALS:
case MachO::S_LITERAL_POINTERS:
case MachO::S_NON_LAZY_SYMBOL_POINTERS:
case MachO::S_LAZY_SYMBOL_POINTERS:
case MachO::S_MOD_INIT_FUNC_POINTERS:
case MachO::S_MOD_TERM_FUNC_POINTERS:
case MachO::S_INTERPOSING:
return false;
}
}

/// \brief Generate the compact unwind encoding for the CFI instructions.
uint32_t generateCompactUnwindEncoding(
ArrayRef<MCCFIInstruction> Instrs) const override {
Expand Down
3 changes: 2 additions & 1 deletion lib/Target/X86/MCTargetDesc/X86MCAsmInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ namespace llvm {
class Triple;

class X86MCAsmInfoDarwin : public MCAsmInfoDarwin {
void anchor() override;
virtual void anchor();

public:
explicit X86MCAsmInfoDarwin(const Triple &Triple);
};
Expand Down

0 comments on commit 4c553e0

Please sign in to comment.