mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-24 11:36:10 +00:00
[CodeView] Reserve TypeDatabase records up front.
Most of the time we know exactly how many type records we have in a list, and we want to use the visitor to deserialize them into actual records in a database. Previously we were just using push_back() every time without reserving the space up front in the vector. This is obviously terrible from a performance standpoint, and it's not uncommon to have PDB files with half a million type records, where the performance degredation was quite noticeable. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@302302 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4463e11348
commit
4a6f9ee16e
@ -21,7 +21,7 @@ namespace llvm {
|
||||
namespace codeview {
|
||||
class TypeDatabase {
|
||||
public:
|
||||
TypeDatabase() : TypeNameStorage(Allocator) {}
|
||||
explicit TypeDatabase(uint32_t ExpectedSize);
|
||||
|
||||
/// Gets the type index for the next type record.
|
||||
TypeIndex getNextTypeIndex() const;
|
||||
|
@ -469,7 +469,7 @@ void CodeViewDebug::emitTypeInformation() {
|
||||
CommentPrefix += ' ';
|
||||
}
|
||||
|
||||
TypeDatabase TypeDB;
|
||||
TypeDatabase TypeDB(TypeTable.records().size());
|
||||
CVTypeDumper CVTD(TypeDB);
|
||||
TypeTable.ForEachRecord([&](TypeIndex Index, ArrayRef<uint8_t> Record) {
|
||||
if (OS.isVerboseAsm()) {
|
||||
|
@ -65,6 +65,11 @@ static const SimpleTypeEntry SimpleTypeNames[] = {
|
||||
{"__bool64*", SimpleTypeKind::Boolean64},
|
||||
};
|
||||
|
||||
TypeDatabase::TypeDatabase(uint32_t ExpectedSize) : TypeNameStorage(Allocator) {
|
||||
CVUDTNames.reserve(ExpectedSize);
|
||||
TypeRecords.reserve(ExpectedSize);
|
||||
}
|
||||
|
||||
/// Gets the type index for the next type record.
|
||||
TypeIndex TypeDatabase::getNextTypeIndex() const {
|
||||
return TypeIndex(TypeIndex::FirstNonSimpleIndex + CVUDTNames.size());
|
||||
|
@ -74,7 +74,7 @@ Error AnalysisStyle::dump() {
|
||||
if (!Tpi)
|
||||
return Tpi.takeError();
|
||||
|
||||
TypeDatabase TypeDB;
|
||||
TypeDatabase TypeDB(Tpi->getNumTypeRecords());
|
||||
TypeDatabaseVisitor DBV(TypeDB);
|
||||
TypeDeserializer Deserializer;
|
||||
TypeVisitorCallbackPipeline Pipeline;
|
||||
|
@ -631,7 +631,7 @@ Error LLVMOutputStyle::dumpTpiStream(uint32_t StreamIdx) {
|
||||
|
||||
Visitors.push_back(make_unique<TypeDeserializer>());
|
||||
if (!StreamDB.hasValue()) {
|
||||
StreamDB.emplace();
|
||||
StreamDB.emplace(Tpi->getNumTypeRecords());
|
||||
Visitors.push_back(make_unique<TypeDatabaseVisitor>(*StreamDB));
|
||||
}
|
||||
// If we're in dump mode, add a dumper with the appropriate detail level.
|
||||
@ -722,14 +722,14 @@ Error LLVMOutputStyle::buildTypeDatabase(uint32_t SN) {
|
||||
if (DB.hasValue())
|
||||
return Error::success();
|
||||
|
||||
DB.emplace();
|
||||
|
||||
auto Tpi =
|
||||
(SN == StreamTPI) ? File.getPDBTpiStream() : File.getPDBIpiStream();
|
||||
|
||||
if (!Tpi)
|
||||
return Tpi.takeError();
|
||||
|
||||
DB.emplace(Tpi->getNumTypeRecords());
|
||||
|
||||
TypeVisitorCallbackPipeline Pipeline;
|
||||
TypeDeserializer Deserializer;
|
||||
TypeDatabaseVisitor DBV(*DB);
|
||||
|
@ -70,7 +70,7 @@ class COFFDumper : public ObjDumper {
|
||||
public:
|
||||
friend class COFFObjectDumpDelegate;
|
||||
COFFDumper(const llvm::object::COFFObjectFile *Obj, ScopedPrinter &Writer)
|
||||
: ObjDumper(Writer), Obj(Obj), Writer(Writer) {}
|
||||
: ObjDumper(Writer), Obj(Obj), Writer(Writer), TypeDB(100) {}
|
||||
|
||||
void printFileHeaders() override;
|
||||
void printSections() override;
|
||||
@ -1553,7 +1553,7 @@ void llvm::dumpCodeViewMergedTypes(ScopedPrinter &Writer,
|
||||
TypeBuf.append(Record.begin(), Record.end());
|
||||
});
|
||||
|
||||
TypeDatabase TypeDB;
|
||||
TypeDatabase TypeDB(CVTypes.records().size());
|
||||
{
|
||||
ListScope S(Writer, "MergedTypeStream");
|
||||
CVTypeDumper CVTD(TypeDB);
|
||||
@ -1574,7 +1574,7 @@ void llvm::dumpCodeViewMergedTypes(ScopedPrinter &Writer,
|
||||
|
||||
{
|
||||
ListScope S(Writer, "MergedIDStream");
|
||||
TypeDatabase IDDB;
|
||||
TypeDatabase IDDB(IDTable.records().size());
|
||||
CVTypeDumper CVTD(IDDB);
|
||||
TypeDumpVisitor TDV(TypeDB, &Writer, opts::CodeViewSubsectionBytes);
|
||||
TDV.setItemDB(IDDB);
|
||||
|
Loading…
x
Reference in New Issue
Block a user