aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-05-07 21:49:09 +0000
committerChris Lattner <sabre@nondot.org>2010-05-07 21:49:09 +0000
commit6e5ce287b0e53c264af0ba37169ad964e19b5bb7 (patch)
tree8cdeb21cba6baeadca2bb4428765d0a584ea2af0 /lib
parent9c00487dc33b21061a5daf3ef9c2455715683f3f (diff)
downloadexternal_llvm-6e5ce287b0e53c264af0ba37169ad964e19b5bb7.zip
external_llvm-6e5ce287b0e53c264af0ba37169ad964e19b5bb7.tar.gz
external_llvm-6e5ce287b0e53c264af0ba37169ad964e19b5bb7.tar.bz2
add COFF support for COMDAT sections, patch by Nathan Jeffords!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103304 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/CodeGen/TargetLoweringObjectFileImpl.cpp20
-rw-r--r--lib/MC/MCContext.cpp11
-rw-r--r--lib/MC/MCSectionCOFF.cpp2
3 files changed, 24 insertions, 9 deletions
diff --git a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
index b74ed56..00e1e83 100644
--- a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
+++ b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
@@ -912,11 +912,17 @@ getCOFFSectionFlags(SectionKind K) {
unsigned Flags = 0;
if (!K.isMetadata())
- Flags |= MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE;
+ Flags |=
+ MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE;
else if (K.isText())
Flags |=
MCSectionCOFF::IMAGE_SCN_MEM_EXECUTE |
MCSectionCOFF::IMAGE_SCN_CNT_CODE;
+ else if (K.isBSS ())
+ Flags |=
+ MCSectionCOFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
+ MCSectionCOFF::IMAGE_SCN_MEM_READ |
+ MCSectionCOFF::IMAGE_SCN_MEM_WRITE;
else if (K.isReadOnly())
Flags |=
MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
@@ -941,6 +947,8 @@ getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
static const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
if (Kind.isText())
return ".text$linkonce";
+ if (Kind.isBSS ())
+ return ".bss$linkonce";
if (Kind.isWriteable())
return ".data$linkonce";
return ".rdata$linkonce";
@@ -959,9 +967,13 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
MCSymbol *Sym = Mang->getSymbol(GV);
Name.append(Sym->getName().begin(), Sym->getName().end());
- return getContext().getCOFFSection(Name.str(),
- getCOFFSectionFlags(Kind),
- Kind);
+
+ unsigned Characteristics = getCOFFSectionFlags(Kind);
+
+ Characteristics |= MCSectionCOFF::IMAGE_SCN_LNK_COMDAT;
+
+ return getContext().getCOFFSection(Name.str(), Characteristics,
+ MCSectionCOFF::IMAGE_COMDAT_SELECT_EXACT_MATCH, Kind);
}
if (Kind.isText())
diff --git a/lib/MC/MCContext.cpp b/lib/MC/MCContext.cpp
index 93388c0..5a65b8a 100644
--- a/lib/MC/MCContext.cpp
+++ b/lib/MC/MCContext.cpp
@@ -126,8 +126,10 @@ getELFSection(StringRef Section, unsigned Type, unsigned Flags,
return Result;
}
-const MCSection *MCContext::
-getCOFFSection(StringRef Section, unsigned Flags, SectionKind Kind) {
+const MCSection *MCContext::getCOFFSection(StringRef Section,
+ unsigned Characteristics,
+ int Selection,
+ SectionKind Kind) {
if (COFFUniquingMap == 0)
COFFUniquingMap = new COFFUniqueMapTy();
COFFUniqueMapTy &Map = *(COFFUniqueMapTy*)COFFUniquingMap;
@@ -136,8 +138,9 @@ getCOFFSection(StringRef Section, unsigned Flags, SectionKind Kind) {
StringMapEntry<const MCSectionCOFF*> &Entry = Map.GetOrCreateValue(Section);
if (Entry.getValue()) return Entry.getValue();
- MCSectionCOFF *Result = new (*this) MCSectionCOFF(Entry.getKey(), Flags,
- Kind);
+ MCSectionCOFF *Result = new (*this) MCSectionCOFF(Entry.getKey(),
+ Characteristics,
+ Selection, Kind);
Entry.setValue(Result);
return Result;
diff --git a/lib/MC/MCSectionCOFF.cpp b/lib/MC/MCSectionCOFF.cpp
index f26768a..d151466 100644
--- a/lib/MC/MCSectionCOFF.cpp
+++ b/lib/MC/MCSectionCOFF.cpp
@@ -43,7 +43,7 @@ void MCSectionCOFF::PrintSwitchToSection(const MCAsmInfo &MAI,
OS << 'w';
else
OS << 'r';
- if (getFlags() & MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE)
+ if (getCharacteristics() & MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE)
OS << 'n';
OS << "\"\n";
}