From f114f009486816ed4b3bf984f0fbbb8fc80914f6 Mon Sep 17 00:00:00 2001 From: serge-sans-paille Date: Mon, 2 May 2022 12:19:48 +0200 Subject: [PATCH] [lldb] Fix ppc64 detection in lldb Currently, ppc64le and ppc64 (defaulting to big endian) have the same descriptor, thus the linear scan always return ppc64le. Handle that through subtype. Differential Revision: https://reviews.llvm.org/D124760 --- .../Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 10 ++++++++++ lldb/source/Utility/ArchSpec.cpp | 12 ++++++------ .../postmortem/elf-core/TestLinuxCore.py | 8 ++++++++ .../postmortem/elf-core/linux-ppc64.core | Bin 0 -> 458752 bytes .../postmortem/elf-core/linux-ppc64.out | Bin 0 -> 67736 bytes 5 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 lldb/test/API/functionalities/postmortem/elf-core/linux-ppc64.core create mode 100755 lldb/test/API/functionalities/postmortem/elf-core/linux-ppc64.out diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index 684d070c54d26..28ccfbe3d6e64 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -310,9 +310,19 @@ static uint32_t riscvVariantFromElfFlags(const elf::ELFHeader &header) { } } +static uint32_t ppc64VariantFromElfFlags(const elf::ELFHeader &header) { + uint32_t endian = header.e_ident[EI_DATA]; + if (endian == ELFDATA2LSB) + return ArchSpec::eCore_ppc64le_generic; + else + return ArchSpec::eCore_ppc64_generic; +} + static uint32_t subTypeFromElfHeader(const elf::ELFHeader &header) { if (header.e_machine == llvm::ELF::EM_MIPS) return mipsVariantFromElfFlags(header); + else if (header.e_machine == llvm::ELF::EM_PPC64) + return ppc64VariantFromElfFlags(header); else if (header.e_machine == llvm::ELF::EM_RISCV) return riscvVariantFromElfFlags(header); diff --git a/lldb/source/Utility/ArchSpec.cpp b/lldb/source/Utility/ArchSpec.cpp index 963005b5cdfa7..c6feacfc7c1e6 100644 --- a/lldb/source/Utility/ArchSpec.cpp +++ b/lldb/source/Utility/ArchSpec.cpp @@ -358,10 +358,10 @@ static const ArchDefinitionEntry g_elf_arch_entries[] = { 0xFFFFFFFFu, 0xFFFFFFFFu}, // Intel MCU // FIXME: is this correct? {ArchSpec::eCore_ppc_generic, llvm::ELF::EM_PPC, LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu}, // PowerPC - {ArchSpec::eCore_ppc64le_generic, llvm::ELF::EM_PPC64, LLDB_INVALID_CPUTYPE, - 0xFFFFFFFFu, 0xFFFFFFFFu}, // PowerPC64le - {ArchSpec::eCore_ppc64_generic, llvm::ELF::EM_PPC64, LLDB_INVALID_CPUTYPE, - 0xFFFFFFFFu, 0xFFFFFFFFu}, // PowerPC64 + {ArchSpec::eCore_ppc64le_generic, llvm::ELF::EM_PPC64, + ArchSpec::eCore_ppc64le_generic, 0xFFFFFFFFu, 0xFFFFFFFFu}, // PowerPC64le + {ArchSpec::eCore_ppc64_generic, llvm::ELF::EM_PPC64, + ArchSpec::eCore_ppc64_generic, 0xFFFFFFFFu, 0xFFFFFFFFu}, // PowerPC64 {ArchSpec::eCore_arm_generic, llvm::ELF::EM_ARM, LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu}, // ARM {ArchSpec::eCore_arm_aarch64, llvm::ELF::EM_AARCH64, LLDB_INVALID_CPUTYPE, @@ -400,8 +400,8 @@ static const ArchDefinitionEntry g_elf_arch_entries[] = { LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu}, // HEXAGON {ArchSpec::eCore_arc, llvm::ELF::EM_ARC_COMPACT2, LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu}, // ARC - {ArchSpec::eCore_avr, llvm::ELF::EM_AVR, LLDB_INVALID_CPUTYPE, - 0xFFFFFFFFu, 0xFFFFFFFFu}, // AVR + {ArchSpec::eCore_avr, llvm::ELF::EM_AVR, LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, + 0xFFFFFFFFu}, // AVR {ArchSpec::eCore_riscv32, llvm::ELF::EM_RISCV, ArchSpec::eRISCVSubType_riscv32, 0xFFFFFFFFu, 0xFFFFFFFFu}, // riscv32 {ArchSpec::eCore_riscv64, llvm::ELF::EM_RISCV, diff --git a/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py b/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py index d1948b6752753..14da7f6051e62 100644 --- a/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py +++ b/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py @@ -24,12 +24,14 @@ class LinuxCoreTestCase(TestBase): _i386_pid = 32306 _x86_64_pid = 32259 _s390x_pid = 1045 + _ppc64_pid = 28146 _ppc64le_pid = 28147 _aarch64_regions = 4 _i386_regions = 4 _x86_64_regions = 5 _s390x_regions = 2 + _ppc64_regions = 2 _ppc64le_regions = 2 @skipIfLLVMTargetMissing("AArch64") @@ -49,6 +51,12 @@ def test_ppc64le(self): self.do_test("linux-ppc64le", self._ppc64le_pid, self._ppc64le_regions, "linux-ppc64le.ou") + @skipIfLLVMTargetMissing("PowerPC") + def test_ppc64(self): + """Test that lldb can read the process information from an ppc64 linux core file.""" + self.do_test("linux-ppc64", self._ppc64_pid, self._ppc64_regions, + "linux-ppc64.ou") + @skipIfLLVMTargetMissing("X86") def test_x86_64(self): """Test that lldb can read the process information from an x86_64 linux core file.""" diff --git a/lldb/test/API/functionalities/postmortem/elf-core/linux-ppc64.core b/lldb/test/API/functionalities/postmortem/elf-core/linux-ppc64.core new file mode 100644 index 0000000000000000000000000000000000000000..fb776e0c9ec334769a8d40a8eec9a515c5b6236b GIT binary patch literal 458752 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 zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg015n;C9rex^6PBd%8uVrCCCI6 zx~R?=Z0XWvb*e_Ws!mN*6LemwkSV{=wWP+Bc&TaKhR!wm!V@E>R+Z8Fsfr*kb-a46 zSRn119N!{ku%d5rE=!?#coT`*p&rikP!CBzxB_H!-No3q%oOzP*4zZW9iBD0S z`8eh9^)mYKCKagt$AYiySp3#Tad3s6j$?C&XJ-wv2Wc8s#o_-P1 z?~PXJUwZjqayV-rKIauwA^lW9zr@o^d!<>ud)U*9KUP4$%hL=0imW~pZergW(7*24 z*Qkbu+mqcL$+m``)-9>-#`dm;?$q4bS@o7=D%IMa?A+YkcxP7I)YjQ_dxKXtg1S4| zlhsQ7Yz~zgdhYCLYHVw3Xm9MwEl6$J+?~85tLwS5qp6{}wW+bGCAW#Du3pvF+R@ur zzO}ihbMEYlp3aJDwS4Ky^&1*yR?Mxap5u+sM%)blCqgUIlgBSy*5PWT)%R?8h_2W$tQOH%?DS9TKYcU@yRbAMVZ99EB4F9 zM-f7!{53FEI`H*#;Aurw`ONaJ&TYx=t|p)#@mM+FmerK00c;S55nQqs&O6fP*f3O< z{&;`HJ}Bvsr3QxT)!v1Vs8IhQ`{4Y?((l$h_V)am$JEdg6)GP@`5?+?U@`PZoP+4& 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 PUvb$YUj}X1H0J*cR!2#~ literal 0 HcmV?d00001