1 //===-- TypeRecordBuilder.cpp ---------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "llvm/DebugInfo/CodeView/TypeRecordBuilder.h"
13 using namespace codeview;
15 TypeRecordBuilder::TypeRecordBuilder(TypeRecordKind Kind) : Stream(Buffer),
17 writeTypeRecordKind(Kind);
20 StringRef TypeRecordBuilder::str() {
21 return StringRef(Buffer.data(), Buffer.size());
24 void TypeRecordBuilder::writeUInt8(uint8_t Value) {
28 void TypeRecordBuilder::writeInt16(int16_t Value) {
32 void TypeRecordBuilder::writeUInt16(uint16_t Value) {
36 void TypeRecordBuilder::writeInt32(int32_t Value) {
40 void TypeRecordBuilder::writeUInt32(uint32_t Value) {
44 void TypeRecordBuilder::writeInt64(int64_t Value) {
48 void TypeRecordBuilder::writeUInt64(uint64_t Value) {
52 void TypeRecordBuilder::writeEncodedInteger(int64_t Value) {
54 writeEncodedUnsignedInteger(static_cast<uint64_t>(Value));
56 writeEncodedSignedInteger(Value);
60 void TypeRecordBuilder::writeEncodedSignedInteger(int64_t Value) {
61 if (Value >= std::numeric_limits<int8_t>::min() &&
62 Value <= std::numeric_limits<int8_t>::max()) {
63 writeUInt16(static_cast<uint16_t>(TypeRecordKind::SByte));
64 writeInt16(static_cast<int8_t>(Value));
65 } else if (Value >= std::numeric_limits<int16_t>::min() &&
66 Value <= std::numeric_limits<int16_t>::max()) {
67 writeUInt16(static_cast<uint16_t>(TypeRecordKind::Int16));
68 writeInt16(static_cast<int16_t>(Value));
69 } else if (Value >= std::numeric_limits<int32_t>::min() &&
70 Value <= std::numeric_limits<int32_t>::max()) {
71 writeUInt16(static_cast<uint32_t>(TypeRecordKind::Int32));
72 writeInt32(static_cast<int32_t>(Value));
74 writeUInt16(static_cast<uint16_t>(TypeRecordKind::Int64));
79 void TypeRecordBuilder::writeEncodedUnsignedInteger(uint64_t Value) {
80 if (Value < static_cast<uint16_t>(TypeRecordKind::SByte)) {
81 writeUInt16(static_cast<uint16_t>(Value));
82 } else if (Value <= std::numeric_limits<uint16_t>::max()) {
83 writeUInt16(static_cast<uint16_t>(TypeRecordKind::UInt16));
84 writeUInt16(static_cast<uint16_t>(Value));
85 } else if (Value <= std::numeric_limits<uint32_t>::max()) {
86 writeUInt16(static_cast<uint16_t>(TypeRecordKind::UInt32));
87 writeUInt32(static_cast<uint32_t>(Value));
89 writeUInt16(static_cast<uint16_t>(TypeRecordKind::UInt64));
94 void TypeRecordBuilder::writeNullTerminatedString(const char *Value) {
95 assert(Value != nullptr);
97 size_t Length = strlen(Value);
98 Stream.write(Value, Length);
102 void TypeRecordBuilder::writeNullTerminatedString(StringRef Value) {
103 Stream.write(Value.data(), Value.size());
107 void TypeRecordBuilder::writeTypeIndex(TypeIndex TypeInd) {
108 writeUInt32(TypeInd.getIndex());
111 void TypeRecordBuilder::writeTypeRecordKind(TypeRecordKind Kind) {
112 writeUInt16(static_cast<uint16_t>(Kind));