diff options
author | Chris Lattner <sabre@nondot.org> | 2009-08-13 00:05:07 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-08-13 00:05:07 +0000 |
commit | e309cfa0d8945af47dd798357549c815164d53d6 (patch) | |
tree | aa661e69f705134465df11bcfbdc96ef0cfae626 /lib/Target/TargetLoweringObjectFile.cpp | |
parent | 5dc47ff03975b9adde9dd833db2b646eb4295710 (diff) |
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
Diffstat (limited to 'lib/Target/TargetLoweringObjectFile.cpp')
-rw-r--r-- | lib/Target/TargetLoweringObjectFile.cpp | 61 |
1 files changed, 34 insertions, 27 deletions
diff --git a/lib/Target/TargetLoweringObjectFile.cpp b/lib/Target/TargetLoweringObjectFile.cpp index 904f01ae35..094e837f6f 100644 --- a/lib/Target/TargetLoweringObjectFile.cpp +++ b/lib/Target/TargetLoweringObjectFile.cpp @@ -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:: |