summaryrefslogtreecommitdiffstats
path: root/lld/lib/ReaderWriter/ELF/ReaderELF.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lld/lib/ReaderWriter/ELF/ReaderELF.cpp')
-rw-r--r--lld/lib/ReaderWriter/ELF/ReaderELF.cpp38
1 files changed, 29 insertions, 9 deletions
diff --git a/lld/lib/ReaderWriter/ELF/ReaderELF.cpp b/lld/lib/ReaderWriter/ELF/ReaderELF.cpp
index 5aa5e91a78c..365150ae9e0 100644
--- a/lld/lib/ReaderWriter/ELF/ReaderELF.cpp
+++ b/lld/lib/ReaderWriter/ELF/ReaderELF.cpp
@@ -278,17 +278,37 @@ public:
virtual ContentType contentType() const {
- if (_symbol->getType() == llvm::ELF::STT_FUNC)
- return typeCode;
+ ContentType ret = typeUnknown;
- if ((_symbol->getType() == llvm::ELF::STT_COMMON)
- || _symbol->st_shndx == llvm::ELF::SHN_COMMON)
- return typeZeroFill;
- if (_symbol->getType() == llvm::ELF::STT_OBJECT)
- return typeData;
-
- return typeUnknown;
+ switch (_section->sh_type) {
+ case llvm::ELF::SHT_PROGBITS:
+ case llvm::ELF::SHT_DYNAMIC:
+ switch (_section->sh_flags) {
+ case (llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_EXECINSTR):
+ ret = typeCode;
+ break;
+ case (llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE):
+ ret = typeData;
+ break;
+ case llvm::ELF::SHF_ALLOC:
+ case (llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_MERGE):
+ case (llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_MERGE |
+ llvm::ELF::SHF_STRINGS):
+ ret = typeConstant;
+ break;
+ }
+ break;
+ case llvm::ELF::SHT_NOBITS:
+ ret = typeZeroFill;
+ break;
+ case llvm::ELF::SHT_NULL:
+ if ((_symbol->getType() == llvm::ELF::STT_COMMON)
+ || _symbol->st_shndx == llvm::ELF::SHN_COMMON)
+ ret = typeZeroFill;
+ break;
+ }
+ return ret;
}
virtual Alignment alignment() const {
OpenPOWER on IntegriCloud