diff --git a/llvm/include/llvm/BinaryFormat/DynamicTags.def b/llvm/include/llvm/BinaryFormat/DynamicTags.def --- a/llvm/include/llvm/BinaryFormat/DynamicTags.def +++ b/llvm/include/llvm/BinaryFormat/DynamicTags.def @@ -120,6 +120,7 @@ // AArch64 specific dynamic table entries AARCH64_DYNAMIC_TAG(AARCH64_BTI_PLT, 0x70000001) AARCH64_DYNAMIC_TAG(AARCH64_PAC_PLT, 0x70000003) +AARCH64_DYNAMIC_TAG(AARCH64_VARIANT_PCS, 0x70000005) // Hexagon specific dynamic table entries HEXAGON_DYNAMIC_TAG(HEXAGON_SYMSZ, 0x70000000) diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -2471,6 +2471,7 @@ switch (Type) { case DT_AARCH64_BTI_PLT: case DT_AARCH64_PAC_PLT: + case DT_AARCH64_VARIANT_PCS: return std::to_string(Value); default: break; @@ -4033,9 +4034,22 @@ printEnum(Symbol.getBinding(), makeArrayRef(ElfSymbolBindings)); Fields[5].Str = printEnum(Symbol.getVisibility(), makeArrayRef(ElfSymbolVisibilities)); - if (Symbol.st_other & ~0x3) - Fields[5].Str += - " []"; + + if (Symbol.st_other & ~0x3) { + if (this->Obj.getHeader().e_machine == ELF::EM_AARCH64) { + uint8_t other = Symbol.st_other & ~0x3; + if (other & STO_AARCH64_VARIANT_PCS) { + other &= ~STO_AARCH64_VARIANT_PCS; + Fields[5].Str += " [VARIANT_PCS"; + if (other != 0) + Fields[5].Str.append(" | " + to_hexString(other, false)); + Fields[5].Str.append("]"); + } + } else { + Fields[5].Str += + " []"; + } + } Fields[6].Column += NonVisibilityBitsUsed ? 13 : 0; Fields[6].Str = getSymbolSectionNdx(Symbol, SymIndex);