Skip to content

Commit 291da4e

Browse files
committed
ed time and memory during generation by skipping methods of most STD classes.
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent ada983c commit 291da4e

File tree

4 files changed

+47
-51
lines changed

4 files changed

+47
-51
lines changed

src/CppParser/Parser.cpp

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ void* IgnorePtr = reinterpret_cast<void*>(0x1);
7070

7171
Parser::Parser(CppParserOptions* Opts) : lib(Opts->ASTContext), opts(Opts), index(0)
7272
{
73+
supportedStdTypes.insert("allocator");
74+
supportedStdTypes.insert("basic_string");
7375
}
7476

7577
LayoutField Parser::WalkVTablePointer(Class* Class,
@@ -821,14 +823,14 @@ Class* Parser::WalkRecordCXX(const clang::CXXRecordDecl* Record)
821823
static int I = 0;
822824

823825
static bool IsRecordValid(const clang::RecordDecl* RC,
824-
std::vector<const clang::RecordDecl*>& Visited)
826+
std::unordered_set<const clang::RecordDecl*>& Visited)
825827
{
826828
using namespace clang;
827829

828-
if (std::find(Visited.begin(), Visited.end(), RC) != Visited.end())
830+
if (Visited.find(RC) != Visited.end())
829831
return true;
830832

831-
Visited.push_back(RC);
833+
Visited.insert(RC);
832834
if (RC->isInvalidDecl())
833835
return false;
834836
for (auto Field : RC->fields())
@@ -845,7 +847,7 @@ static bool IsRecordValid(const clang::RecordDecl* RC,
845847

846848
static bool IsRecordValid(const clang::RecordDecl* RC)
847849
{
848-
std::vector<const clang::RecordDecl*> Visited;
850+
std::unordered_set<const clang::RecordDecl*> Visited;
849851
return IsRecordValid(RC, Visited);
850852
}
851853

@@ -881,6 +883,23 @@ static bool HasLayout(const clang::RecordDecl* Record)
881883
return true;
882884
}
883885

886+
bool Parser::IsSupported(const clang::RecordDecl* RD)
887+
{
888+
return !c->getSourceManager().isInSystemHeader(RD->getLocStart()) ||
889+
supportedStdTypes.find(RD->getName()) != supportedStdTypes.end();
890+
}
891+
892+
bool Parser::IsSupported(const clang::CXXMethodDecl* MD)
893+
{
894+
using namespace clang;
895+
896+
return !c->getSourceManager().isInSystemHeader(MD->getLocStart()) ||
897+
isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD) ||
898+
(MD->getName() == "c_str" &&
899+
supportedStdTypes.find(MD->getParent()->getName()) !=
900+
supportedStdTypes.end());
901+
}
902+
884903
void Parser::WalkRecord(const clang::RecordDecl* Record, Class* RC)
885904
{
886905
using namespace clang;
@@ -920,25 +939,24 @@ void Parser::WalkRecord(const clang::RecordDecl* Record, Class* RC)
920939
ReadClassLayout(RC, Record, CharUnits(), true);
921940
}
922941

923-
for(auto it = Record->decls_begin(); it != Record->decls_end(); ++it)
924-
{
925-
auto D = *it;
942+
for (auto FD : Record->fields())
943+
WalkFieldCXX(FD, RC);
944+
945+
if (!IsSupported(Record))
946+
return;
926947

927-
switch(D->getKind())
948+
for (auto D : Record->decls())
949+
{
950+
switch (D->getKind())
928951
{
929952
case Decl::CXXConstructor:
930953
case Decl::CXXDestructor:
931954
case Decl::CXXConversion:
932955
case Decl::CXXMethod:
933956
{
934957
auto MD = cast<CXXMethodDecl>(D);
935-
WalkMethodCXX(MD);
936-
break;
937-
}
938-
case Decl::Field:
939-
{
940-
auto FD = cast<FieldDecl>(D);
941-
WalkFieldCXX(FD, RC);
958+
if (IsSupported(MD))
959+
WalkMethodCXX(MD);
942960
break;
943961
}
944962
case Decl::AccessSpec:
@@ -954,6 +972,7 @@ void Parser::WalkRecord(const clang::RecordDecl* Record, Class* RC)
954972
RC->Specifiers.push_back(AccessDecl);
955973
break;
956974
}
975+
case Decl::Field: // fields already handled
957976
case Decl::IndirectField: // FIXME: Handle indirect fields
958977
break;
959978
case Decl::CXXRecord:

src/CppParser/Parser.h

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "CppParser.h"
2222

2323
#include <string>
24+
#include <unordered_set>
2425

2526
namespace clang {
2627
namespace CodeGen {
@@ -59,6 +60,8 @@ class Parser
5960
ParserTargetInfo* GetTargetInfo();
6061

6162
private:
63+
bool IsSupported(const clang::RecordDecl* RD);
64+
bool IsSupported(const clang::CXXMethodDecl* MD);
6265
// AST traversers
6366
void WalkAST();
6467
Declaration* WalkDeclaration(const clang::Decl* D);
@@ -143,6 +146,12 @@ class Parser
143146
void HandleComments(const clang::Decl* D, Declaration* Decl);
144147
void HandleDiagnostics(ParserResult* res);
145148

149+
ParserResultKind ReadSymbols(llvm::StringRef File,
150+
llvm::object::basic_symbol_iterator Begin,
151+
llvm::object::basic_symbol_iterator End,
152+
CppSharp::CppParser::NativeLibrary*& NativeLib);
153+
Declaration* GetDeclarationFromFriend(clang::NamedDecl* FriendDecl);
154+
146155
int index;
147156
CppSharp::CppParser::AST::ASTContext* lib;
148157
CppParserOptions* opts;
@@ -153,12 +162,7 @@ class Parser
153162
std::unordered_map<const clang::TemplateTypeParmDecl*, TypeTemplateParameter*> walkedTypeTemplateParameters;
154163
std::unordered_map<const clang::TemplateTemplateParmDecl*, TemplateTemplateParameter*> walkedTemplateTemplateParameters;
155164
std::unordered_map<const clang::NonTypeTemplateParmDecl*, NonTypeTemplateParameter*> walkedNonTypeTemplateParameters;
156-
157-
ParserResultKind ReadSymbols(llvm::StringRef File,
158-
llvm::object::basic_symbol_iterator Begin,
159-
llvm::object::basic_symbol_iterator End,
160-
CppSharp::CppParser::NativeLibrary*& NativeLib);
161-
Declaration* GetDeclarationFromFriend(clang::NamedDecl* FriendDecl);
165+
std::unordered_set<std::string> supportedStdTypes;
162166
};
163167

164168
} }

src/Generator.Tests/AST/TestAST.cs

Lines changed: 3 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -303,13 +303,13 @@ public void TestFindClassInNamespace()
303303
[Test]
304304
public void TestLineNumber()
305305
{
306-
Assert.AreEqual(72, AstContext.FindClass("HiddenInNamespace").First().LineNumberStart);
306+
Assert.AreEqual(70, AstContext.FindClass("HiddenInNamespace").First().LineNumberStart);
307307
}
308308

309309
[Test]
310310
public void TestLineNumberOfFriend()
311311
{
312-
Assert.AreEqual(95, AstContext.FindFunction("operator+").First().LineNumberStart);
312+
Assert.AreEqual(93, AstContext.FindFunction("operator+").First().LineNumberStart);
313313
}
314314

315315
static string StripWindowsNewLines(string text)
@@ -350,7 +350,7 @@ public void TestAtomics()
350350
[Test]
351351
public void TestMacroLineNumber()
352352
{
353-
Assert.AreEqual(105, AstContext.FindClass("HasAmbiguousFunctions").First().Specifiers.Last().LineNumberStart);
353+
Assert.AreEqual(103, AstContext.FindClass("HasAmbiguousFunctions").First().Specifiers.Last().LineNumberStart);
354354
}
355355

356356
[Test]
@@ -576,30 +576,5 @@ public void TestClassContext()
576576
var @classC = AstContext.FindClass("ClassC").First();
577577
Assert.That(@classC.Redeclarations.Count, Is.EqualTo(2));
578578
}
579-
580-
[Test]
581-
public void TestRemovalOfUnusedStdTypes()
582-
{
583-
new IgnoreSystemDeclarationsPass { Context = Driver.Context }.VisitASTContext(AstContext);
584-
if (Platform.IsWindows)
585-
{
586-
Assert.That(AstContext.GetEnumWithMatchingItem("_ALLOC_MASK").Ignore, Is.True);
587-
Assert.That(AstContext.FindClass("_Ctypevec").First().Ignore, Is.True);
588-
return;
589-
}
590-
if (Platform.IsLinux)
591-
{
592-
Assert.That(AstContext.GetEnumWithMatchingItem("PTHREAD_RWLOCK_PREFER_READER_NP").Ignore, Is.True);
593-
Assert.That(AstContext.FindClass("pthread_mutex_t").First().Ignore, Is.True);
594-
return;
595-
596-
}
597-
if (Platform.IsMacOS)
598-
{
599-
Assert.That(AstContext.GetEnumWithMatchingItem("__n_words").Ignore, Is.True);
600-
Assert.That(AstContext.FindClass("__darwin_fp_control").First().Ignore, Is.True);
601-
return;
602-
}
603-
}
604579
}
605580
}

tests/Native/AST.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#include <string>
2-
31
#define Q_SIGNALS protected
42

53
// Tests assignment of AST.Parameter properties

0 commit comments

Comments
 (0)