//===-- LCNoteWriter.cpp --------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "LCNoteWriter.h" #include "Utility.h" #include "lldb/Utility/UUID.h" #include "llvm/BinaryFormat/MachO.h" #include #include void create_lc_note_binary_load_cmd(const CoreSpec &spec, std::vector &cmds, const Binary &binary, std::vector &payload_bytes, off_t data_offset) { // Add the payload bytes to payload_bytes. size_t starting_payload_size = payload_bytes.size(); add_uint32(payload_bytes, 1); // version lldb_private::UUID uuid; uuid.SetFromStringRef(binary.uuid); for (size_t i = 0; i < uuid.GetBytes().size(); i++) payload_bytes.push_back(uuid.GetBytes().data()[i]); if (binary.value_is_slide) { add_uint64(payload_bytes, UINT64_MAX); // address add_uint64(payload_bytes, binary.value); // slide } else { add_uint64(payload_bytes, binary.value); // address add_uint64(payload_bytes, UINT64_MAX); // slide } if (binary.name.empty()) { payload_bytes.push_back(0); // name_cstring } else { size_t len = binary.name.size(); for (size_t i = 0; i < len; i++) payload_bytes.push_back(binary.name[i]); payload_bytes.push_back(0); // name_cstring } size_t payload_size = payload_bytes.size() - starting_payload_size; // Pad out the entry to a 4-byte aligned size. if (payload_bytes.size() % 4 != 0) { size_t pad_bytes = ((payload_bytes.size() + 4 - 1) & ~(4 - 1)) - payload_bytes.size(); for (size_t i = 0; i < pad_bytes; i++) payload_bytes.push_back(0); } // Add the load command bytes to cmds. add_uint32(cmds, llvm::MachO::LC_NOTE); add_uint32(cmds, sizeof(struct llvm::MachO::note_command)); char cmdname[16]; memset(cmdname, '\0', sizeof(cmdname)); strcpy(cmdname, "load binary"); for (int i = 0; i < 16; i++) cmds.push_back(cmdname[i]); add_uint64(cmds, data_offset); add_uint64(cmds, payload_size); } void create_lc_note_addressable_bits(const CoreSpec &spec, std::vector &cmds, const AddressableBits &addr_bits, std::vector &payload_bytes, off_t data_offset) { // Add the payload bytes to payload_bytes. size_t starting_payload_size = payload_bytes.size(); add_uint32(payload_bytes, 4); // version add_uint32(payload_bytes, *addr_bits.lowmem_bits); // low memory add_uint32(payload_bytes, *addr_bits.highmem_bits); // high memory add_uint32(payload_bytes, 0); // reserved size_t payload_size = payload_bytes.size() - starting_payload_size; // Pad out the entry to a 4-byte aligned size. if (payload_bytes.size() % 4 != 0) { size_t pad_bytes = ((payload_bytes.size() + 4 - 1) & ~(4 - 1)) - payload_bytes.size(); for (size_t i = 0; i < pad_bytes; i++) payload_bytes.push_back(0); } // Add the load command bytes to cmds. add_uint32(cmds, llvm::MachO::LC_NOTE); add_uint32(cmds, sizeof(struct llvm::MachO::note_command)); char cmdname[16]; memset(cmdname, '\0', sizeof(cmdname)); strcpy(cmdname, "addrable bits"); for (int i = 0; i < 16; i++) cmds.push_back(cmdname[i]); add_uint64(cmds, data_offset); add_uint64(cmds, payload_size); }