Index: include/llvm/Object/ELFTypes.h =================================================================== --- include/llvm/Object/ELFTypes.h +++ include/llvm/Object/ELFTypes.h @@ -154,6 +154,7 @@ template struct Elf_Sym_Impl : Elf_Sym_Base { using Elf_Sym_Base::st_info; + using Elf_Sym_Base::st_shndx; using Elf_Sym_Base::st_other; // These accessors and mutators correspond to the ELF32_ST_BIND, @@ -176,6 +177,27 @@ assert(v < 4 && "Invalid value for visibility"); st_other = (st_other & ~0x3) | v; } + + bool isAbsoluteSymbol() const { return st_shndx == ELF::SHN_ABS; } + bool isCommonSymbol() const { + return getType() == ELF::STT_COMMON || st_shndx == ELF::SHN_COMMON; + } + bool isDefinedSymbol() const { + return !isUndefinedSymbol() && + (!(st_shndx >= ELF::SHN_LORESERVE && + st_shndx <= ELF::SHN_HIRESERVE) || + st_shndx == ELF::SHN_XINDEX); + } + bool isProcessorSpecificSymbol() const { + return st_shndx >= ELF::SHN_LOPROC && st_shndx <= ELF::SHN_HIPROC; + } + bool isOSSpecificSymbol() const { + return st_shndx >= ELF::SHN_LOOS && st_shndx <= ELF::SHN_HIOS; + } + bool isReservedSymbol() const { + return st_shndx > ELF::SHN_HIOS && st_shndx < ELF::SHN_ABS; + } + bool isUndefinedSymbol() const { return st_shndx == ELF::SHN_UNDEF; } }; /// Elf_Versym: This is the structure of entries in the SHT_GNU_versym section