mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-20 02:58:10 +00:00
reject invalid code like:
int x __attribute__((section("_foo, _bar"))) = 4; int y __attribute__((section("_foo, _bar, 4byte_literals"))) = 1; git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78867 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5dc47ff039
commit
e309cfa0d8
@ -153,7 +153,7 @@ public:
|
||||
}
|
||||
|
||||
unsigned getTypeAndAttributes() const { return TypeAndAttributes; }
|
||||
|
||||
unsigned getStubSize() const { return Reserved2; }
|
||||
|
||||
/// ParseSectionSpecifier - Parse the section specifier indicated by "Spec".
|
||||
/// This is a string that can appear after a .section directive in a mach-o
|
||||
|
@ -241,6 +241,9 @@ class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
|
||||
const MCSection *FourByteConstantSection;
|
||||
const MCSection *EightByteConstantSection;
|
||||
const MCSection *SixteenByteConstantSection;
|
||||
|
||||
const MCSection *LazySymbolPointerSection;
|
||||
const MCSection *NonLazySymbolPointerSection;
|
||||
public:
|
||||
TargetLoweringObjectFileMachO() : UniquingMap(0) {}
|
||||
~TargetLoweringObjectFileMachO();
|
||||
@ -285,12 +288,15 @@ public:
|
||||
|
||||
/// getLazySymbolPointerSection - Return the section corresponding to
|
||||
/// the .lazy_symbol_pointer directive.
|
||||
const MCSection *getLazySymbolPointerSection() const;
|
||||
const MCSection *getLazySymbolPointerSection() const {
|
||||
return LazySymbolPointerSection;
|
||||
}
|
||||
|
||||
/// getNonLazySymbolPointerSection - Return the section corresponding to
|
||||
/// the .non_lazy_symbol_pointer directive.
|
||||
const MCSection *getNonLazySymbolPointerSection() const;
|
||||
|
||||
const MCSection *getNonLazySymbolPointerSection() const {
|
||||
return NonLazySymbolPointerSection;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
@ -600,6 +600,16 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
|
||||
= getMachOSection("__DATA","__datacoal_nt", MCSectionMachO::S_COALESCED,
|
||||
SectionKind::getDataRel());
|
||||
|
||||
|
||||
LazySymbolPointerSection
|
||||
= getMachOSection("__DATA", "__la_symbol_ptr",
|
||||
MCSectionMachO::S_LAZY_SYMBOL_POINTERS,
|
||||
SectionKind::getMetadata());
|
||||
NonLazySymbolPointerSection
|
||||
= getMachOSection("__DATA", "__nl_symbol_ptr",
|
||||
MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS,
|
||||
SectionKind::getMetadata());
|
||||
|
||||
if (TM.getRelocationModel() == Reloc::Static) {
|
||||
StaticCtorSection
|
||||
= getMachOSection("__TEXT", "__constructor", 0,SectionKind::getDataRel());
|
||||
@ -666,25 +676,6 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
|
||||
SectionKind::getMetadata());
|
||||
}
|
||||
|
||||
/// getLazySymbolPointerSection - Return the section corresponding to
|
||||
/// the .lazy_symbol_pointer directive.
|
||||
const MCSection *TargetLoweringObjectFileMachO::
|
||||
getLazySymbolPointerSection() const {
|
||||
return getMachOSection("__DATA", "__la_symbol_ptr",
|
||||
MCSectionMachO::S_LAZY_SYMBOL_POINTERS,
|
||||
SectionKind::getMetadata());
|
||||
}
|
||||
|
||||
/// getNonLazySymbolPointerSection - Return the section corresponding to
|
||||
/// the .non_lazy_symbol_pointer directive.
|
||||
const MCSection *TargetLoweringObjectFileMachO::
|
||||
getNonLazySymbolPointerSection() const {
|
||||
return getMachOSection("__DATA", "__nl_symbol_ptr",
|
||||
MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS,
|
||||
SectionKind::getMetadata());
|
||||
}
|
||||
|
||||
|
||||
const MCSection *TargetLoweringObjectFileMachO::
|
||||
getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
|
||||
Mangler *Mang, const TargetMachine &TM) const {
|
||||
@ -694,16 +685,32 @@ getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
|
||||
std::string ErrorCode =
|
||||
MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section,
|
||||
TAA, StubSize);
|
||||
if (ErrorCode.empty())
|
||||
return getMachOSection(Segment, Section, TAA, StubSize, Kind);
|
||||
if (!ErrorCode.empty()) {
|
||||
// If invalid, report the error with llvm_report_error.
|
||||
llvm_report_error("Global variable '" + GV->getNameStr() +
|
||||
"' has an invalid section specifier '" + GV->getSection()+
|
||||
"': " + ErrorCode + ".");
|
||||
// Fall back to dropping it into the data section.
|
||||
return DataSection;
|
||||
}
|
||||
|
||||
// Get the section.
|
||||
const MCSectionMachO *S =
|
||||
getMachOSection(Segment, Section, TAA, StubSize, Kind);
|
||||
|
||||
// Okay, now that we got the section, verify that the TAA & StubSize agree.
|
||||
// If the user declared multiple globals with different section flags, we need
|
||||
// to reject it here.
|
||||
if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
|
||||
// If invalid, report the error with llvm_report_error.
|
||||
llvm_report_error("Global variable '" + GV->getNameStr() +
|
||||
"' section type or attributes does not match previous"
|
||||
" section specifier");
|
||||
}
|
||||
|
||||
|
||||
// If invalid, report the error with llvm_report_error.
|
||||
llvm_report_error("Global variable '" + GV->getNameStr() +
|
||||
"' has an invalid section specifier '" + GV->getSection() +
|
||||
"': " + ErrorCode + ".");
|
||||
// Fall back to dropping it into the data section.
|
||||
return DataSection;
|
||||
|
||||
return S;
|
||||
}
|
||||
|
||||
const MCSection *TargetLoweringObjectFileMachO::
|
||||
|
Loading…
Reference in New Issue
Block a user