bool CVML:: decode(CFile *file) { reset(); if (! readHeader(file)) { std::cerr << "Not a valid VML file" << std::endl; return false; } if (! readStringTable(file)) { std::cerr << "Bad String Table" << std::endl; return false; } if (! readDebug(file)) { std::cerr << "Bad Debug Section" << std::endl; return false; } if (! readData(file)) { std::cerr << "Bad Data Section" << std::endl; return false; } if (! readInstructions(file)) { std::cerr << "Bad Code Section" << std::endl; return false; } return true; }
bool Reader::readBinaryGTO() { readIndexTable(); // OK to continue if this fails readHeader(); if (m_error) return false; readStringTable(); if (m_error) return false; readObjects(); if (m_error) return false; readComponents(); if (m_error) return false; readProperties(); if (m_error) return false; descriptionComplete(); if (m_mode & HeaderOnly) { return true; } Properties::iterator p = m_properties.begin(); for (Components::iterator i = m_components.begin(); i != m_components.end(); ++i) { ComponentInfo &comp = *i; if (comp.flags & Gto::Transposed) { cerr << "ERROR: Transposed data for '" << stringFromId( comp.object->name ) << "." << stringFromId( comp.name ) << "' is currently unsupported." << endl; abort(); } else { for (Properties::iterator e = p + comp.numProperties; p != e; ++p) { if (!readProperty(*p)) { return false; } } } } return true; }
static void demangleAout(const HDR *x, long nsyms) { newSym=xfopen(newSym_n, "w+"); xsetbuf(newSym, newSymb); newSng=xfopen(newSng_n, "w+"); xsetbuf(newSng, newSngb); newSngLoc = 4; //cerr << "created temps!" << endl; //sleep(5); readStringTable(N_STROFF(*x)); buildNewTables(x, nsyms); if (overwriteAout) overwriteOldTables(x); delete stringTable; fclose(newSym); fclose(newSng); unlink(newSym_n); unlink(newSng_n); }
llvm::Expected<IndexFileIn> readRIFF(llvm::StringRef Data) { auto RIFF = riff::readFile(Data); if (!RIFF) return RIFF.takeError(); if (RIFF->Type != riff::fourCC("CdIx")) return makeError("wrong RIFF type"); llvm::StringMap<llvm::StringRef> Chunks; for (const auto &Chunk : RIFF->Chunks) Chunks.try_emplace(llvm::StringRef(Chunk.ID.data(), Chunk.ID.size()), Chunk.Data); for (llvm::StringRef RequiredChunk : {"meta", "stri"}) if (!Chunks.count(RequiredChunk)) return makeError("missing required chunk " + RequiredChunk); Reader Meta(Chunks.lookup("meta")); if (Meta.consume32() != Version) return makeError("wrong version"); auto Strings = readStringTable(Chunks.lookup("stri")); if (!Strings) return Strings.takeError(); IndexFileIn Result; if (Chunks.count("srcs")) { Reader SrcsReader(Chunks.lookup("srcs")); Result.Sources.emplace(); while (!SrcsReader.eof()) { auto IGN = readIncludeGraphNode(SrcsReader, Strings->Strings); auto Entry = Result.Sources->try_emplace(IGN.URI).first; Entry->getValue() = std::move(IGN); // We change all the strings inside the structure to point at the keys in // the map, since it is the only copy of the string that's going to live. Entry->getValue().URI = Entry->getKey(); for (auto &Include : Entry->getValue().DirectIncludes) Include = Result.Sources->try_emplace(Include).first->getKey(); } if (SrcsReader.err()) return makeError("malformed or truncated include uri"); } if (Chunks.count("symb")) { Reader SymbolReader(Chunks.lookup("symb")); SymbolSlab::Builder Symbols; while (!SymbolReader.eof()) Symbols.insert(readSymbol(SymbolReader, Strings->Strings)); if (SymbolReader.err()) return makeError("malformed or truncated symbol"); Result.Symbols = std::move(Symbols).build(); } if (Chunks.count("refs")) { Reader RefsReader(Chunks.lookup("refs")); RefSlab::Builder Refs; while (!RefsReader.eof()) { auto RefsBundle = readRefs(RefsReader, Strings->Strings); for (const auto &Ref : RefsBundle.second) // FIXME: bulk insert? Refs.insert(RefsBundle.first, Ref); } if (RefsReader.err()) return makeError("malformed or truncated refs"); Result.Refs = std::move(Refs).build(); } return std::move(Result); }