diff options
author | David Meyer <pdox@google.com> | 2012-02-29 02:11:55 +0000 |
---|---|---|
committer | David Meyer <pdox@google.com> | 2012-02-29 02:11:55 +0000 |
commit | 2c67727046234ad9702ab5acb72700b5ac99a676 (patch) | |
tree | 8dccb4673583b529cf8ca2a898407105b5c01f91 /include/llvm/Object/ELF.h | |
parent | 37c02bce277078902924af897736d87bb0b106a0 (diff) | |
download | llvm-2c67727046234ad9702ab5acb72700b5ac99a676.tar.gz llvm-2c67727046234ad9702ab5acb72700b5ac99a676.tar.bz2 llvm-2c67727046234ad9702ab5acb72700b5ac99a676.tar.xz |
[Object] Add symbol attribute flags: ST_ThreadLocal, ST_Common, and ST_Undefined. Implement these completely for ELF.
Rename ST_External to ST_Unknown, and slightly change its semantics. It now only indicates that the symbol's type
is unknown, not that the symbol is undefined. (For that, use ST_Undefined).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151696 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Object/ELF.h')
-rw-r--r-- | include/llvm/Object/ELF.h | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/include/llvm/Object/ELF.h b/include/llvm/Object/ELF.h index e6442f14be..6e3fa013af 100644 --- a/include/llvm/Object/ELF.h +++ b/include/llvm/Object/ELF.h @@ -625,12 +625,10 @@ error_code ELFObjectFile<target_endianness, is64Bits> validateSymbol(Symb); const Elf_Sym *symb = getSymbol(Symb); - if (getSymbolTableIndex(symb) == ELF::SHN_UNDEF) { - Result = SymbolRef::ST_External; - return object_error::success; - } - switch (symb->getType()) { + case ELF::STT_NOTYPE: + Result = SymbolRef::ST_Unknown; + break; case ELF::STT_SECTION: Result = SymbolRef::ST_Debug; break; @@ -641,6 +639,8 @@ error_code ELFObjectFile<target_endianness, is64Bits> Result = SymbolRef::ST_Function; break; case ELF::STT_OBJECT: + case ELF::STT_COMMON: + case ELF::STT_TLS: Result = SymbolRef::ST_Data; break; default: @@ -672,6 +672,16 @@ error_code ELFObjectFile<target_endianness, is64Bits> symb->getType() == ELF::STT_SECTION) Result |= SymbolRef::SF_FormatSpecific; + if (getSymbolTableIndex(symb) == ELF::SHN_UNDEF) + Result |= SymbolRef::SF_Undefined; + + if (symb->getType() == ELF::STT_COMMON || + getSymbolTableIndex(symb) == ELF::SHN_COMMON) + Result |= SymbolRef::SF_Common; + + if (symb->getType() == ELF::STT_TLS) + Result |= SymbolRef::SF_ThreadLocal; + return object_error::success; } |