brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.8 KiB · d9c2687 Raw
98 lines · c
1#include <assert.h>2#include <stdint.h>3#include <stdio.h>4#include <string.h>5 6int main() { printf("main\n"); }7 8namespace {9#define FN(X)                                                                  \10  if (pc == reinterpret_cast<uintptr_t>(X))                                    \11  return #X12 13const char *symbolize(uintptr_t pc) {14  FUNCTIONS;15  return nullptr;16}17 18template <typename T> T consume(const char *&pos, const char *end) {19  T v;20  // We need to memcpy from pos, because it's not guaranteed that every entry21  // has the required alignment of T.22  memcpy(&v, pos, sizeof(T));23  pos += sizeof(T);24  assert(pos <= end);25  return v;26}27 28uint64_t consume_uleb128(const char *&pos, const char *end) {29  uint64_t val = 0;30  int shift = 0;31  uint8_t cur;32  do {33    cur = *pos++;34    val |= uint64_t{cur & 0x7fu} << shift;35    shift += 7;36  } while (cur & 0x80);37  assert(shift < 64);38  assert(pos <= end);39  return val;40}41 42constexpr uint32_t kSanitizerBinaryMetadataUARHasSize = 1 << 2;43 44uint32_t meta_version;45const char *meta_start;46const char *meta_end;47const char *atomics_start;48const char *atomics_end;49}  // namespace50 51extern "C" {52void __sanitizer_metadata_covered_add(uint32_t version, const char *start,53                                      const char *end) {54  const uint32_t version_base = version & 0xffff;55  const bool offset_ptr_sized = version & (1 << 16);56  assert(version_base == 2);57  printf("metadata add version %u\n", version_base);58  for (const char *pos = start; pos < end;) {59    const auto base = reinterpret_cast<uintptr_t>(pos);60    const intptr_t offset = offset_ptr_sized ? consume<intptr_t>(pos, end)61                                             : consume<int32_t>(pos, end);62    [[maybe_unused]] const uint64_t size = consume_uleb128(pos, end);63    const uint64_t features = consume_uleb128(pos, end);64    uint64_t stack_args = 0;65    if (features & kSanitizerBinaryMetadataUARHasSize)66      stack_args = consume_uleb128(pos, end);67    if (const char *name = symbolize(base + offset))68      printf("%s: features=%lx stack_args=%lu\n", name, features, stack_args);69  }70  meta_version = version;71  meta_start = start;72  meta_end = end;73}74 75void __sanitizer_metadata_covered_del(uint32_t version, const char *start,76                                      const char *end) {77  assert(version == meta_version);78  assert(start == meta_start);79  assert(end == meta_end);80}81 82void __sanitizer_metadata_atomics_add(uint32_t version, const char *start,83                                      const char *end) {84  assert(version == meta_version);85  assert(start);86  assert(end >= end);87  atomics_start = start;88  atomics_end = end;89}90 91void __sanitizer_metadata_atomics_del(uint32_t version, const char *start,92                                      const char *end) {93  assert(version == meta_version);94  assert(atomics_start == start);95  assert(atomics_end == end);96}97}98