22Expected<std::string> readStreamData(BinaryStream &Stream, uint64_t Limit) {
23 uint64_t
Offset = 0, DataLength = std::min(Limit, Stream.getLength());
25 Result.reserve(DataLength);
26 while (
Offset < DataLength) {
27 ArrayRef<uint8_t>
Data;
28 if (
auto E = Stream.readLongestContiguousChunk(
Offset,
Data))
38 const SrcHeaderBlockEntry &Entry;
39 const PDBStringTable &Strings;
43 NativeInjectedSource(
const SrcHeaderBlockEntry &Entry,
44 PDBFile &File,
const PDBStringTable &Strings)
45 : Entry(Entry), Strings(Strings), File(File) {}
47 uint32_t getCrc32()
const override {
return Entry.CRC; }
48 uint64_t getCodeByteSize()
const override {
return Entry.FileSize; }
51 StringRef
Ret =
cantFail(Strings.getStringForID(Entry.FileNI),
52 "InjectedSourceStream should have rejected this");
53 return std::string(Ret);
56 std::string getObjectFileName()
const override {
57 StringRef
Ret =
cantFail(Strings.getStringForID(Entry.ObjNI),
58 "InjectedSourceStream should have rejected this");
59 return std::string(Ret);
62 std::string getVirtualFileName()
const override {
63 StringRef
Ret =
cantFail(Strings.getStringForID(Entry.VFileNI),
64 "InjectedSourceStream should have rejected this");
65 return std::string(Ret);
68 uint32_t getCompression()
const override {
return Entry.Compression; }
70 std::string getCode()
const override {
73 cantFail(Strings.getStringForID(Entry.VFileNI),
74 "InjectedSourceStream should have rejected this");
75 std::string StreamName = (
"/src/files/" + VName).str();
80 auto ExpectedFileStream = File.safelyCreateNamedStream(StreamName);
81 if (!ExpectedFileStream) {
83 return "(failed to open data stream)";
86 auto Data = readStreamData(**ExpectedFileStream, Entry.FileSize);
89 return "(failed to read data)";
100 : File(File), Stream(IJS), Strings(Strings), Cur(Stream.begin()) {}
103 return static_cast<uint32_t>(Stream.size());
106std::unique_ptr<IPDBInjectedSource>
110 return std::make_unique<NativeInjectedSource>(std::next(Stream.begin(),
N)->second,
115 if (Cur == Stream.end())
117 return std::make_unique<NativeInjectedSource>((Cur++)->second, File, Strings);
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static Expected< StringRef > getFileName(const DebugStringTableSubsectionRef &Strings, const DebugChecksumsSubsectionRef &Checksums, uint32_t FileID)
IPDBInjectedSource defines an interface used to represent source files which were injected directly i...
std::unique_ptr< IPDBInjectedSource > getChildAtIndex(uint32_t Index) const override
NativeEnumInjectedSources(PDBFile &File, const InjectedSourceStream &IJS, const PDBStringTable &Strings)
std::unique_ptr< IPDBInjectedSource > getNext() override
uint32_t getChildCount() const override
This is an optimization pass for GlobalISel generic memory operations.
void cantFail(Error Err, const char *Msg=nullptr)
Report a fatal error if Err is a failure value.
void consumeError(Error Err)
Consume a Error without doing anything.
StringRef toStringRef(bool B)
Construct a string ref from a boolean.