From e309cfa0d8945af47dd798357549c815164d53d6 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 13 Aug 2009 00:05:07 +0000 Subject: [PATCH] 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 --- include/llvm/MC/MCSectionMachO.h | 2 +- .../llvm/Target/TargetLoweringObjectFile.h | 12 +++- lib/Target/TargetLoweringObjectFile.cpp | 61 +++++++++++-------- 3 files changed, 44 insertions(+), 31 deletions(-) diff --git a/include/llvm/MC/MCSectionMachO.h b/include/llvm/MC/MCSectionMachO.h index aaaa9e4e326..04b2afa38c8 100644 --- a/include/llvm/MC/MCSectionMachO.h +++ b/include/llvm/MC/MCSectionMachO.h @@ -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 diff --git a/include/llvm/Target/TargetLoweringObjectFile.h b/include/llvm/Target/TargetLoweringObjectFile.h index cbb585e131b..7f74c6b055c 100644 --- a/include/llvm/Target/TargetLoweringObjectFile.h +++ b/include/llvm/Target/TargetLoweringObjectFile.h @@ -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; + } }; diff --git a/lib/Target/TargetLoweringObjectFile.cpp b/lib/Target/TargetLoweringObjectFile.cpp index 904f01ae354..094e837f6f9 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:: -- 2.34.1