brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.7 KiB · 824a1de Raw
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