diff options
-rw-r--r-- | llvm/test/tools/dsymutil/Inputs/lc_build_version.x86_64 | bin | 4248 -> 4336 bytes | |||
-rw-r--r-- | llvm/test/tools/dsymutil/X86/lc_build_version.test | 2 | ||||
-rw-r--r-- | llvm/tools/dsymutil/MachOUtils.cpp | 33 |
3 files changed, 20 insertions, 15 deletions
diff --git a/llvm/test/tools/dsymutil/Inputs/lc_build_version.x86_64 b/llvm/test/tools/dsymutil/Inputs/lc_build_version.x86_64 Binary files differindex f5e737d7c9a..07a5e9b0eda 100644 --- a/llvm/test/tools/dsymutil/Inputs/lc_build_version.x86_64 +++ b/llvm/test/tools/dsymutil/Inputs/lc_build_version.x86_64 diff --git a/llvm/test/tools/dsymutil/X86/lc_build_version.test b/llvm/test/tools/dsymutil/X86/lc_build_version.test index 5d4ab59e9ef..d0a8598b036 100644 --- a/llvm/test/tools/dsymutil/X86/lc_build_version.test +++ b/llvm/test/tools/dsymutil/X86/lc_build_version.test @@ -8,4 +8,4 @@ CHECK-NEXT: platform: 1 CHECK-NEXT: minos: 658944 CHECK-NEXT: sdk: 658944 CHECK-NEXT: ntools: 0 -CHECK-NEXT: - cmd +CHECK-NEXT: - cmd: LC_BUILD_VERSION diff --git a/llvm/tools/dsymutil/MachOUtils.cpp b/llvm/tools/dsymutil/MachOUtils.cpp index 7b3c1d45cca..cac4ad89eb2 100644 --- a/llvm/tools/dsymutil/MachOUtils.cpp +++ b/llvm/tools/dsymutil/MachOUtils.cpp @@ -374,23 +374,28 @@ bool generateDsymCompanion(const DebugMap &DM, MCStreamer &MS, // Get LC_UUID and LC_BUILD_VERSION. MachO::uuid_command UUIDCmd; - MachO::build_version_command BuildVersionCmd; + SmallVector<MachO::build_version_command, 2> BuildVersionCmd; memset(&UUIDCmd, 0, sizeof(UUIDCmd)); - memset(&BuildVersionCmd, 0, sizeof(BuildVersionCmd)); for (auto &LCI : InputBinary.load_commands()) { switch (LCI.C.cmd) { case MachO::LC_UUID: + if (UUIDCmd.cmd) + return error("Binary contains more than one UUID"); UUIDCmd = InputBinary.getUuidCommand(LCI); ++NumLoadCommands; - LoadCommandSize += sizeof(MachO::uuid_command); + LoadCommandSize += sizeof(UUIDCmd); break; - case MachO::LC_BUILD_VERSION: - BuildVersionCmd = InputBinary.getBuildVersionLoadCommand(LCI); + case MachO::LC_BUILD_VERSION: { + MachO::build_version_command Cmd; + memset(&Cmd, 0, sizeof(Cmd)); + Cmd = InputBinary.getBuildVersionLoadCommand(LCI); ++NumLoadCommands; - LoadCommandSize += sizeof(MachO::build_version_command); + LoadCommandSize += sizeof(Cmd); // LLDB doesn't care about the build tools for now. - BuildVersionCmd.ntools = 0; + Cmd.ntools = 0; + BuildVersionCmd.push_back(Cmd); break; + } default: break; } @@ -463,13 +468,13 @@ bool generateDsymCompanion(const DebugMap &DM, MCStreamer &MS, OutFile.write(reinterpret_cast<const char *>(UUIDCmd.uuid), 16); assert(OutFile.tell() == HeaderSize + sizeof(UUIDCmd)); } - if (BuildVersionCmd.cmd != 0) { - Writer.W.write<uint32_t>(BuildVersionCmd.cmd); - Writer.W.write<uint32_t>(sizeof(BuildVersionCmd)); - Writer.W.write<uint32_t>(BuildVersionCmd.platform); - Writer.W.write<uint32_t>(BuildVersionCmd.minos); - Writer.W.write<uint32_t>(BuildVersionCmd.sdk); - Writer.W.write<uint32_t>(BuildVersionCmd.ntools); + for (auto Cmd : BuildVersionCmd) { + Writer.W.write<uint32_t>(Cmd.cmd); + Writer.W.write<uint32_t>(sizeof(Cmd)); + Writer.W.write<uint32_t>(Cmd.platform); + Writer.W.write<uint32_t>(Cmd.minos); + Writer.W.write<uint32_t>(Cmd.sdk); + Writer.W.write<uint32_t>(Cmd.ntools); } assert(SymtabCmd.cmd && "No symbol table."); |