diff options
Diffstat (limited to 'lld/lib/ReaderWriter/ELF/ReaderELF.cpp')
| -rw-r--r-- | lld/lib/ReaderWriter/ELF/ReaderELF.cpp | 38 |
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 { |

