blob: 824a1de7ddfaa63736f81260dabadea52f3499e6 [file]
//===-- 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 <ctype.h>
#include <stdlib.h>
void create_lc_note_binary_load_cmd(const CoreSpec &spec,
std::vector<uint8_t> &cmds,
const Binary &binary,
std::vector<uint8_t> &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<uint8_t> &cmds,
const AddressableBits &addr_bits,
std::vector<uint8_t> &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);
}