Skip to content

Commit

Permalink
COFF: Let globals with private linkage reside in their own section
Browse files Browse the repository at this point in the history
COFF COMDATs (for selection kinds other than 'select any') require at
least one non-section symbol in the symbol table.
Satisfy this by morally enhancing the linkage from private to internal.

Differential Revision: http://reviews.llvm.org/D8394

llvm-svn: 232570
  • Loading branch information
majnemer committed Mar 17, 2015
1 parent d89581c commit 7db449a
Show file tree
Hide file tree
Showing 10 changed files with 56 additions and 13 deletions.
4 changes: 4 additions & 0 deletions llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
Expand Up @@ -147,6 +147,10 @@ class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
SectionKind Kind, Mangler &Mang,
const TargetMachine &TM) const override;

void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
bool CannotUsePrivateLabel, Mangler &Mang,
const TargetMachine &TM) const override;

const MCSection *
getSectionForJumpTable(const Function &F, Mangler &Mang,
const TargetMachine &TM) const override;
Expand Down
19 changes: 14 additions & 5 deletions llvm/include/llvm/IR/DataLayout.h
Expand Up @@ -108,7 +108,14 @@ class DataLayout {

unsigned StackNaturalAlign;

enum ManglingModeT { MM_None, MM_ELF, MM_MachO, MM_WINCOFF, MM_Mips };
enum ManglingModeT {
MM_None,
MM_ELF,
MM_MachO,
MM_WinCOFF,
MM_WinCOFFX86,
MM_Mips
};
ManglingModeT ManglingMode;

SmallVector<unsigned char, 8> LegalIntWidths;
Expand Down Expand Up @@ -244,25 +251,26 @@ class DataLayout {
unsigned getStackAlignment() const { return StackNaturalAlign; }

bool hasMicrosoftFastStdCallMangling() const {
return ManglingMode == MM_WINCOFF;
return ManglingMode == MM_WinCOFFX86;
}

bool hasLinkerPrivateGlobalPrefix() const { return ManglingMode == MM_MachO; }

const char *getLinkerPrivateGlobalPrefix() const {
if (ManglingMode == MM_MachO)
return "l";
return getPrivateGlobalPrefix();
return "";
}

char getGlobalPrefix() const {
switch (ManglingMode) {
case MM_None:
case MM_ELF:
case MM_Mips:
case MM_WinCOFF:
return '\0';
case MM_MachO:
case MM_WINCOFF:
case MM_WinCOFFX86:
return '_';
}
llvm_unreachable("invalid mangling mode");
Expand All @@ -277,7 +285,8 @@ class DataLayout {
case MM_Mips:
return "$";
case MM_MachO:
case MM_WINCOFF:
case MM_WinCOFF:
case MM_WinCOFFX86:
return "L";
}
llvm_unreachable("invalid mangling mode");
Expand Down
5 changes: 5 additions & 0 deletions llvm/include/llvm/Target/TargetLoweringObjectFile.h
Expand Up @@ -101,6 +101,11 @@ class TargetLoweringObjectFile : public MCObjectFileInfo {
return SectionForGlobal(GV, getKindForGlobal(GV, TM), Mang, TM);
}

virtual void getNameWithPrefix(SmallVectorImpl<char> &OutName,
const GlobalValue *GV,
bool CannotUsePrivateLabel, Mangler &Mang,
const TargetMachine &TM) const;

virtual const MCSection *
getSectionForJumpTable(const Function &F, Mangler &Mang,
const TargetMachine &TM) const;
Expand Down
16 changes: 16 additions & 0 deletions llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
Expand Up @@ -927,6 +927,11 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
StringRef COMDATSymName = Sym->getName();
return getContext().getCOFFSection(Name, Characteristics, Kind,
COMDATSymName, Selection);
} else {
SmallString<256> TmpData;
getNameWithPrefix(TmpData, GV, /*CannotUsePrivateLabel=*/true, Mang, TM);
return getContext().getCOFFSection(Name, Characteristics, Kind, TmpData,
Selection);
}
}

Expand All @@ -948,6 +953,17 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
return DataSection;
}

void TargetLoweringObjectFileCOFF::getNameWithPrefix(
SmallVectorImpl<char> &OutName, const GlobalValue *GV,
bool CannotUsePrivateLabel, Mangler &Mang, const TargetMachine &TM) const {
if (GV->hasPrivateLinkage() &&
((isa<Function>(GV) && TM.getFunctionSections()) ||
(isa<GlobalVariable>(GV) && TM.getDataSections())))
CannotUsePrivateLabel = true;

Mang.getNameWithPrefix(OutName, GV, CannotUsePrivateLabel);
}

const MCSection *TargetLoweringObjectFileCOFF::getSectionForJumpTable(
const Function &F, Mangler &Mang, const TargetMachine &TM) const {
// If the function can be removed, produce a unique section so that
Expand Down
9 changes: 6 additions & 3 deletions llvm/lib/IR/DataLayout.cpp
Expand Up @@ -150,8 +150,8 @@ DataLayout::InvalidPointerElem = { 0U, 0U, 0U, ~0U };
const char *DataLayout::getManglingComponent(const Triple &T) {
if (T.isOSBinFormatMachO())
return "-m:o";
if (T.isOSWindows() && T.getArch() == Triple::x86 && T.isOSBinFormatCOFF())
return "-m:w";
if (T.isOSWindows() && T.isOSBinFormatCOFF())
return T.getArch() == Triple::x86 ? "-m:x" : "-m:w";
return "-m:e";
}

Expand Down Expand Up @@ -359,7 +359,10 @@ void DataLayout::parseSpecifier(StringRef Desc) {
ManglingMode = MM_Mips;
break;
case 'w':
ManglingMode = MM_WINCOFF;
ManglingMode = MM_WinCOFF;
break;
case 'x':
ManglingMode = MM_WinCOFFX86;
break;
}
break;
Expand Down
6 changes: 6 additions & 0 deletions llvm/lib/Target/TargetLoweringObjectFile.cpp
Expand Up @@ -343,3 +343,9 @@ const MCExpr *TargetLoweringObjectFile::getDebugThreadLocalSymbol(const MCSymbol
// null return could mean 'no location' & we should just do that here.
return MCSymbolRefExpr::Create(Sym, *Ctx);
}

void TargetLoweringObjectFile::getNameWithPrefix(
SmallVectorImpl<char> &OutName, const GlobalValue *GV,
bool CannotUsePrivateLabel, Mangler &Mang, const TargetMachine &TM) const {
Mang.getNameWithPrefix(OutName, GV, CannotUsePrivateLabel);
}
2 changes: 1 addition & 1 deletion llvm/lib/Target/TargetMachine.cpp
Expand Up @@ -175,7 +175,7 @@ void TargetMachine::getNameWithPrefix(SmallVectorImpl<char> &Name,
const TargetLoweringObjectFile *TLOF = getObjFileLowering();
const MCSection *TheSection = TLOF->SectionForGlobal(GV, GVKind, Mang, *this);
bool CannotUsePrivateLabel = !canUsePrivateLabel(*AsmInfo, *TheSection);
Mang.getNameWithPrefix(Name, GV, CannotUsePrivateLabel);
TLOF->getNameWithPrefix(Name, GV, CannotUsePrivateLabel, Mang, *this);
}

MCSymbol *TargetMachine::getSymbol(const GlobalValue *GV, Mangler &Mang) const {
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/ARM/Windows/long-calls.ll
Expand Up @@ -10,7 +10,7 @@ entry:
}

; CHECK-LABEL: caller
; CHECK: ldr [[REG:r[0-9]+]], [[CPI:.LCPI[_0-9]+]]
; CHECK: ldr [[REG:r[0-9]+]], [[CPI:LCPI[_0-9]+]]
; CHECK: bx [[REG]]
; CHECK: .align 2
; CHECK: [[CPI]]:
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/X86/fastcall-correct-mangling.ll
Expand Up @@ -28,6 +28,6 @@ entry:
define private x86_fastcallcc void @dontCrash() {
; The name is fairly arbitrary since it is private. Just don't crash.
; CHECK32-LABEL: {{^}}L@dontCrash@0:
; CHECK64-LABEL: {{^}}.LdontCrash:
; CHECK64-LABEL: {{^}}LdontCrash:
ret void
}
4 changes: 2 additions & 2 deletions llvm/test/CodeGen/X86/global-sections.ll
Expand Up @@ -275,8 +275,8 @@ bb7:
; LINUX-SECTIONS: .asciz "foo"
; LINUX-SECTIONS: .size .LG14, 4

; WIN32-SECTIONS: .section .rdata,"dr"
; WIN32-SECTIONS: L_G14:
; WIN32-SECTIONS: .section .rdata,"dr",one_only,_G14
; WIN32-SECTIONS: _G14:
; WIN32-SECTIONS: .asciz "foo"

; cannot be merged on MachO, but can on other formats.
Expand Down

0 comments on commit 7db449a

Please sign in to comment.