#ifndef LLVM_SUPPORT_OUTPUTBUFFER_H
#define LLVM_SUPPORT_OUTPUTBUFFER_H
+#include <cassert>
#include <string>
#include <vector>
namespace llvm {
-
+
class OutputBuffer {
/// Output buffer.
std::vector<unsigned char> &Output;
assert(Boundary && (Boundary & (Boundary - 1)) == 0 &&
"Must align to 2^k boundary");
size_t Size = Output.size();
-
+
if (Size & (Boundary - 1)) {
// Add padding to get alignment to the correct place.
size_t Pad = Boundary - (Size & (Boundary - 1));
outxword(X);
}
void outstring(const std::string &S, unsigned Length) {
- unsigned len_to_copy = S.length() < Length ? S.length() : Length;
- unsigned len_to_fill = S.length() < Length ? Length - S.length() : 0;
-
+ unsigned len_to_copy = static_cast<unsigned>(S.length()) < Length
+ ? static_cast<unsigned>(S.length()) : Length;
+ unsigned len_to_fill = static_cast<unsigned>(S.length()) < Length
+ ? Length - static_cast<unsigned>(S.length()) : 0;
+
for (unsigned i = 0; i < len_to_copy; ++i)
outbyte(S[i]);
-
+
for (unsigned i = 0; i < len_to_fill; ++i)
outbyte(0);
}
P[2] = (X >> (isLittleEndian ? 16 : 8)) & 255;
P[3] = (X >> (isLittleEndian ? 24 : 0)) & 255;
}
+ void fixxword(uint64_t X, unsigned Offset) {
+ unsigned char *P = &Output[Offset];
+ P[0] = (X >> (isLittleEndian ? 0 : 56)) & 255;
+ P[1] = (X >> (isLittleEndian ? 8 : 48)) & 255;
+ P[2] = (X >> (isLittleEndian ? 16 : 40)) & 255;
+ P[3] = (X >> (isLittleEndian ? 24 : 32)) & 255;
+ P[4] = (X >> (isLittleEndian ? 32 : 24)) & 255;
+ P[5] = (X >> (isLittleEndian ? 40 : 16)) & 255;
+ P[6] = (X >> (isLittleEndian ? 48 : 8)) & 255;
+ P[7] = (X >> (isLittleEndian ? 56 : 0)) & 255;
+ }
void fixaddr(uint64_t X, unsigned Offset) {
if (!is64Bit)
fixword((unsigned)X, Offset);
else
- assert(0 && "Emission of 64-bit data not implemented yet!");
+ fixxword(X, Offset);
}
unsigned char &operator[](unsigned Index) {
return Output[Index];
}
};
-
+
} // end llvm namespace
#endif // LLVM_SUPPORT_OUTPUTBUFFER_H