forked from OSchip/llvm-project
COFF: Let globals with private linkage reside in their own section
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
This commit is contained in:
parent
d89581c5e7
commit
7db449a6e7
|
@ -147,6 +147,10 @@ public:
|
|||
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;
|
||||
|
|
|
@ -108,7 +108,14 @@ private:
|
|||
|
||||
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;
|
||||
|
@ -244,7 +251,7 @@ public:
|
|||
unsigned getStackAlignment() const { return StackNaturalAlign; }
|
||||
|
||||
bool hasMicrosoftFastStdCallMangling() const {
|
||||
return ManglingMode == MM_WINCOFF;
|
||||
return ManglingMode == MM_WinCOFFX86;
|
||||
}
|
||||
|
||||
bool hasLinkerPrivateGlobalPrefix() const { return ManglingMode == MM_MachO; }
|
||||
|
@ -252,7 +259,7 @@ public:
|
|||
const char *getLinkerPrivateGlobalPrefix() const {
|
||||
if (ManglingMode == MM_MachO)
|
||||
return "l";
|
||||
return getPrivateGlobalPrefix();
|
||||
return "";
|
||||
}
|
||||
|
||||
char getGlobalPrefix() const {
|
||||
|
@ -260,9 +267,10 @@ public:
|
|||
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");
|
||||
|
@ -277,7 +285,8 @@ public:
|
|||
case MM_Mips:
|
||||
return "$";
|
||||
case MM_MachO:
|
||||
case MM_WINCOFF:
|
||||
case MM_WinCOFF:
|
||||
case MM_WinCOFFX86:
|
||||
return "L";
|
||||
}
|
||||
llvm_unreachable("invalid mangling mode");
|
||||
|
|
|
@ -101,6 +101,11 @@ public:
|
|||
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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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]]:
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue