16#ifndef DEMANGLE_UTILITY_H
17#define DEMANGLE_UTILITY_H
32 char *Buffer =
nullptr;
33 size_t CurrentPosition = 0;
34 size_t BufferCapacity = 0;
38 size_t Need =
N + CurrentPosition;
39 if (Need > BufferCapacity) {
45 if (BufferCapacity < Need)
46 BufferCapacity = Need;
47 Buffer =
static_cast<char *
>(std::realloc(Buffer, BufferCapacity));
48 if (Buffer ==
nullptr)
54 std::array<char, 21> Temp;
55 char *TempPtr = Temp.data() + Temp.size();
59 *--TempPtr =
char(
'0' +
N % 10);
72 : Buffer(StartBuf), BufferCapacity(
Size) {}
103 if (
size_t Size = R.size()) {
105 std::memcpy(Buffer + CurrentPosition, R.begin(),
Size);
106 CurrentPosition +=
Size;
113 Buffer[CurrentPosition++] =
C;
118 size_t Size = R.size();
121 std::memmove(Buffer +
Size, Buffer, CurrentPosition);
122 std::memcpy(Buffer, R.begin(),
Size);
123 CurrentPosition +=
Size;
133 return writeUnsigned(
static_cast<unsigned long long>(std::abs(
N)),
N < 0);
137 return writeUnsigned(
N,
false);
141 return this->operator<<(static_cast<long long>(
N));
145 return this->operator<<(static_cast<unsigned long long>(
N));
149 return this->operator<<(static_cast<long long>(
N));
153 return this->operator<<(static_cast<unsigned long long>(
N));
156 void insert(
size_t Pos,
const char *S,
size_t N) {
157 assert(Pos <= CurrentPosition);
161 std::memmove(Buffer + Pos +
N, Buffer + Pos, CurrentPosition - Pos);
162 std::memcpy(Buffer + Pos, S,
N);
163 CurrentPosition +=
N;
171 return Buffer[CurrentPosition - 1];
174 bool empty()
const {
return CurrentPosition == 0; }
189 Loc_ = std::move(NewVal);
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
#define DEMANGLE_NAMESPACE_END
#define DEMANGLE_NAMESPACE_BEGIN
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
OutputBuffer & operator<<(unsigned long long N)
OutputBuffer(const OutputBuffer &)=delete
OutputBuffer & operator+=(StringView R)
size_t getBufferCapacity() const
OutputBuffer & operator<<(StringView R)
OutputBuffer & prepend(StringView R)
OutputBuffer(char *StartBuf, size_t Size)
unsigned GtIsGt
When zero, we're printing template args and '>' needs to be parenthesized.
OutputBuffer(char *StartBuf, size_t *SizePtr)
OutputBuffer & operator<<(char C)
OutputBuffer & operator=(const OutputBuffer &)=delete
unsigned CurrentPackIndex
If a ParameterPackExpansion (or similar type) is encountered, the offset into the pack that we're cur...
OutputBuffer & operator<<(long N)
OutputBuffer & operator<<(int N)
OutputBuffer & operator<<(long long N)
void printClose(char Close=')')
void setCurrentPosition(size_t NewPos)
bool isGtInsideTemplateArgs() const
OutputBuffer & operator+=(char C)
size_t getCurrentPosition() const
void printOpen(char Open='(')
void insert(size_t Pos, const char *S, size_t N)
OutputBuffer & operator<<(unsigned long N)
OutputBuffer & operator<<(unsigned int N)
ScopedOverride(T &Loc_, T NewVal)
ScopedOverride & operator=(const ScopedOverride &)=delete
ScopedOverride(const ScopedOverride &)=delete