98 lines · cpp
1//===-- LCNoteWriter.cpp --------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "LCNoteWriter.h"10#include "Utility.h"11#include "lldb/Utility/UUID.h"12#include "llvm/BinaryFormat/MachO.h"13#include <ctype.h>14#include <stdlib.h>15 16void create_lc_note_binary_load_cmd(const CoreSpec &spec,17 std::vector<uint8_t> &cmds,18 const Binary &binary,19 std::vector<uint8_t> &payload_bytes,20 off_t data_offset) {21 22 // Add the payload bytes to payload_bytes.23 size_t starting_payload_size = payload_bytes.size();24 add_uint32(payload_bytes, 1); // version25 lldb_private::UUID uuid;26 uuid.SetFromStringRef(binary.uuid);27 for (size_t i = 0; i < uuid.GetBytes().size(); i++)28 payload_bytes.push_back(uuid.GetBytes().data()[i]);29 if (binary.value_is_slide) {30 add_uint64(payload_bytes, UINT64_MAX); // address31 add_uint64(payload_bytes, binary.value); // slide32 } else {33 add_uint64(payload_bytes, binary.value); // address34 add_uint64(payload_bytes, UINT64_MAX); // slide35 }36 if (binary.name.empty()) {37 payload_bytes.push_back(0); // name_cstring38 } else {39 size_t len = binary.name.size();40 for (size_t i = 0; i < len; i++)41 payload_bytes.push_back(binary.name[i]);42 payload_bytes.push_back(0); // name_cstring43 }44 45 size_t payload_size = payload_bytes.size() - starting_payload_size;46 // Pad out the entry to a 4-byte aligned size.47 if (payload_bytes.size() % 4 != 0) {48 size_t pad_bytes =49 ((payload_bytes.size() + 4 - 1) & ~(4 - 1)) - payload_bytes.size();50 for (size_t i = 0; i < pad_bytes; i++)51 payload_bytes.push_back(0);52 }53 54 // Add the load command bytes to cmds.55 add_uint32(cmds, llvm::MachO::LC_NOTE);56 add_uint32(cmds, sizeof(struct llvm::MachO::note_command));57 char cmdname[16];58 memset(cmdname, '\0', sizeof(cmdname));59 strcpy(cmdname, "load binary");60 for (int i = 0; i < 16; i++)61 cmds.push_back(cmdname[i]);62 add_uint64(cmds, data_offset);63 add_uint64(cmds, payload_size);64}65 66void create_lc_note_addressable_bits(const CoreSpec &spec,67 std::vector<uint8_t> &cmds,68 const AddressableBits &addr_bits,69 std::vector<uint8_t> &payload_bytes,70 off_t data_offset) {71 // Add the payload bytes to payload_bytes.72 size_t starting_payload_size = payload_bytes.size();73 add_uint32(payload_bytes, 4); // version74 75 add_uint32(payload_bytes, *addr_bits.lowmem_bits); // low memory76 add_uint32(payload_bytes, *addr_bits.highmem_bits); // high memory77 add_uint32(payload_bytes, 0); // reserved78 size_t payload_size = payload_bytes.size() - starting_payload_size;79 // Pad out the entry to a 4-byte aligned size.80 if (payload_bytes.size() % 4 != 0) {81 size_t pad_bytes =82 ((payload_bytes.size() + 4 - 1) & ~(4 - 1)) - payload_bytes.size();83 for (size_t i = 0; i < pad_bytes; i++)84 payload_bytes.push_back(0);85 }86 87 // Add the load command bytes to cmds.88 add_uint32(cmds, llvm::MachO::LC_NOTE);89 add_uint32(cmds, sizeof(struct llvm::MachO::note_command));90 char cmdname[16];91 memset(cmdname, '\0', sizeof(cmdname));92 strcpy(cmdname, "addrable bits");93 for (int i = 0; i < 16; i++)94 cmds.push_back(cmdname[i]);95 add_uint64(cmds, data_offset);96 add_uint64(cmds, payload_size);97}98