Skip to content

Commit 03fc645

Browse files
committed
flexible serailization
1 parent da96155 commit 03fc645

File tree

13 files changed

+277
-203
lines changed

13 files changed

+277
-203
lines changed

clang/include/clang/Frontend/CompilerInstance.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,9 @@ class CompilerInstance : public ModuleLoader {
124124
/// The code completion consumer.
125125
std::unique_ptr<CodeCompleteConsumer> CompletionConsumer;
126126

127+
/// The summary serializer.
128+
std::unique_ptr<SummarySerializer> TheSummarySerializer;
129+
127130
/// The summary consumer.
128131
std::unique_ptr<SummaryConsumer> TheSummaryConsumer;
129132

@@ -646,6 +649,16 @@ class CompilerInstance : public ModuleLoader {
646649

647650
void createSummaryConsumer();
648651

652+
bool hasSummarySerializer() const { return (bool)TheSummarySerializer; }
653+
654+
SummarySerializer &getSummarySerializer() const {
655+
assert(TheSummarySerializer &&
656+
"Compiler instance has no code summary serializer!");
657+
return *TheSummarySerializer;
658+
}
659+
660+
void createSummarySerializer();
661+
649662
/// @}
650663
/// @name Frontend timer
651664
/// @{
Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
#ifndef LLVM_CLANG_SUMMARY_SUMMARYCONSUMER_H
22
#define LLVM_CLANG_SUMMARY_SUMMARYCONSUMER_H
33

4-
#include "clang/Basic/LLVM.h"
5-
#include "llvm/Support/JSON.h"
6-
#include "llvm/Support/YAMLTraits.h"
7-
4+
#include "llvm/Support/raw_ostream.h"
85
namespace clang {
96
class FunctionSummary;
107
class SummaryContext;
8+
class SummarySerializer;
119

1210
class SummaryConsumer {
1311
protected:
@@ -22,37 +20,17 @@ class SummaryConsumer {
2220
virtual void ProcessEndOfSourceFile() {};
2321
};
2422

25-
class PrintingSummaryConsumer : public SummaryConsumer {
26-
public:
27-
PrintingSummaryConsumer(const SummaryContext &SummaryCtx, raw_ostream &OS)
28-
: SummaryConsumer(SummaryCtx) {}
29-
};
30-
31-
class JSONPrintingSummaryConsumer : public PrintingSummaryConsumer {
32-
llvm::json::OStream JOS;
33-
34-
public:
35-
JSONPrintingSummaryConsumer(const SummaryContext &SummaryCtx, raw_ostream &OS)
36-
: PrintingSummaryConsumer(SummaryCtx, OS), JOS(OS, 2) {}
37-
38-
void ProcessStartOfSourceFile() override { JOS.arrayBegin(); };
39-
void ProcessFunctionSummary(const FunctionSummary &) override;
40-
void ProcessEndOfSourceFile() override {
41-
JOS.arrayEnd();
42-
JOS.flush();
43-
};
44-
};
45-
46-
class YAMLPrintingSummaryConsumer : public PrintingSummaryConsumer {
23+
class SerializingSummaryConsumer : public SummaryConsumer {
4724
llvm::raw_ostream &OS;
48-
llvm::yaml::Output YOS;
25+
SummarySerializer *Serializer;
4926

5027
public:
51-
YAMLPrintingSummaryConsumer(const SummaryContext &SummaryCtx, raw_ostream &OS)
52-
: PrintingSummaryConsumer(SummaryCtx, OS), OS(OS), YOS(OS) {}
28+
SerializingSummaryConsumer(SummarySerializer &Serializer,
29+
llvm::raw_ostream &OS);
5330

5431
void ProcessEndOfSourceFile() override;
5532
};
33+
5634
} // namespace clang
5735

5836
#endif // LLVM_CLANG_SUMMARY_SUMMARYCONSUMER_H

clang/include/clang/Summary/SummaryContext.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
#include "clang/Summary/SummaryAttribute.h"
55
#include "clang/Summary/SummaryConsumer.h"
6+
#include "llvm/Support/JSON.h"
7+
#include "llvm/Support/YAMLTraits.h"
68
#include <set>
79

810
namespace clang {
@@ -35,7 +37,8 @@ class FunctionSummary {
3537
}
3638

3739
friend struct llvm::yaml::MappingTraits<clang::FunctionSummary>;
38-
friend struct llvm::yaml::MappingContextTraits<clang::FunctionSummary, clang::SummaryContext>;
40+
friend struct llvm::yaml::MappingContextTraits<clang::FunctionSummary,
41+
clang::SummaryContext>;
3942
};
4043

4144
class SummaryContext {
@@ -56,9 +59,6 @@ class SummaryContext {
5659

5760
const FunctionSummary *GetSummary(const FunctionDecl *FD) const;
5861
void SummarizeFunctionBody(const FunctionDecl *FD);
59-
60-
void ParseSummaryFromJSON(const llvm::json::Array &Summary);
61-
void ParseSummaryFromYAML(StringRef content);
6262
void ReduceSummaries();
6363
};
6464
} // namespace clang
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#ifndef LLVM_CLANG_SUMMARY_SUMMARYSERIALIZATION_H
2+
#define LLVM_CLANG_SUMMARY_SUMMARYSERIALIZATION_H
3+
4+
#include "clang/Summary/SummaryContext.h"
5+
6+
namespace clang {
7+
class SummarySerializer {
8+
protected:
9+
SummaryContext *SummaryCtx;
10+
11+
public:
12+
SummaryContext *getSummaryCtx() const { return SummaryCtx; }
13+
14+
SummarySerializer(SummaryContext &SummaryCtx) : SummaryCtx(&SummaryCtx){};
15+
virtual ~SummarySerializer() = default;
16+
17+
virtual void serialize(const std::vector<std::unique_ptr<FunctionSummary>> &,
18+
raw_ostream &OS) = 0;
19+
virtual void parse(StringRef) = 0;
20+
};
21+
22+
class JSONSummarySerializer : public SummarySerializer {
23+
public:
24+
JSONSummarySerializer(SummaryContext &SummaryCtx)
25+
: SummarySerializer(SummaryCtx){};
26+
27+
void serialize(const std::vector<std::unique_ptr<FunctionSummary>> &,
28+
raw_ostream &OS) override;
29+
void parse(StringRef) override;
30+
};
31+
32+
class YAMLSummarySerializer : public SummarySerializer {
33+
YAMLSummarySerializer(SummaryContext &SummaryCtx)
34+
: SummarySerializer(SummaryCtx){};
35+
36+
void serialize(const std::vector<std::unique_ptr<FunctionSummary>> &,
37+
raw_ostream &OS) override;
38+
void parse(StringRef) override;
39+
};
40+
} // namespace clang
41+
42+
#endif // LLVM_CLANG_SUMMARY_SUMMARYSERIALIZATION_H

clang/include/clang/Summary/SummaryYamlMappings.h

Lines changed: 0 additions & 27 deletions
This file was deleted.

clang/lib/Frontend/CompilerInstance.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#include "clang/Serialization/InMemoryModuleCache.h"
4343
#include "clang/Serialization/ModuleCache.h"
4444
#include "clang/Summary/SummaryConsumer.h"
45+
#include "clang/Summary/SummarySerialization.h"
4546
#include "llvm/ADT/IntrusiveRefCntPtr.h"
4647
#include "llvm/ADT/STLExtras.h"
4748
#include "llvm/ADT/ScopeExit.h"
@@ -756,8 +757,15 @@ void CompilerInstance::createSummaryConsumer() {
756757
return;
757758
}
758759

760+
if (!hasSummarySerializer())
761+
createSummarySerializer();
762+
759763
TheSummaryConsumer.reset(
760-
new YAMLPrintingSummaryConsumer(getSummaryContext(), *SummaryOS));
764+
new SerializingSummaryConsumer(getSummarySerializer(), *SummaryOS));
765+
}
766+
767+
void CompilerInstance::createSummarySerializer() {
768+
TheSummarySerializer.reset(new JSONSummarySerializer(getSummaryContext()));
761769
}
762770

763771
void CompilerInstance::createSema(TranslationUnitKind TUKind,

clang/lib/Frontend/FrontendAction.cpp

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include "clang/Serialization/ASTReader.h"
4040
#include "clang/Serialization/GlobalModuleIndex.h"
4141
#include "clang/Summary/SummaryContext.h"
42+
#include "clang/Summary/SummarySerialization.h"
4243
#include "llvm/ADT/ScopeExit.h"
4344
#include "llvm/ADT/StringRef.h"
4445
#include "llvm/Support/BuryPointer.h"
@@ -970,6 +971,9 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
970971
if (ProcessesSummaries && !CI.hasSummaryContext())
971972
CI.createSummaryContext();
972973

974+
if (ProcessesSummaries && !CI.hasSummarySerializer())
975+
CI.createSummarySerializer();
976+
973977
// FIXME: cleanup and lookup dirs recursively
974978
if (!CI.getFrontendOpts().SummaryDirPath.empty()) {
975979
// FIXME: this is a quick shortcut so large summaries are only evaluated
@@ -995,7 +999,7 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
995999
for (llvm::vfs::directory_iterator Dir = FS.dir_begin(DirNative, EC),
9961000
DirEnd;
9971001
Dir != DirEnd && !EC; Dir.increment(EC)) {
998-
if (llvm::sys::path::extension(Dir->path()) != ".yaml")
1002+
if (llvm::sys::path::extension(Dir->path()) != ".json")
9991003
continue;
10001004

10011005
paths.emplace_back(Dir->path().str());
@@ -1007,31 +1011,16 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
10071011
std::stringstream buffer;
10081012
buffer << t.rdbuf();
10091013

1010-
llvm::outs() << buffer.str() << '\n';
1011-
1012-
CI.getSummaryContext().ParseSummaryFromYAML(buffer.str());
1013-
1014-
1015-
// auto JSON = llvm::json::parse(buffer.str());
1016-
// if (!!JSON)
1017-
// CI.getSummaryContext().ParseSummaryFromJSON(*JSON->getAsArray());
1018-
1019-
// llvm::handleAllErrors(
1020-
// JSON.takeError(),
1021-
// [](const llvm::ErrorInfoBase &EI) { std::ignore = EI.message(); });
1014+
CI.getSummarySerializer().parse(buffer.str());
10221015
}
10231016

10241017
CI.getSummaryContext().ReduceSummaries();
10251018

10261019
if (!FS.exists(cacheFile)) {
10271020
// FIXME: very quick printing of the summary to the cache file
10281021
llvm::raw_fd_ostream fd(cacheFile, EC, llvm::sys::fs::CD_CreateAlways);
1029-
1030-
JSONPrintingSummaryConsumer printer(CI.getSummaryContext(), fd);
1031-
printer.ProcessStartOfSourceFile();
1032-
for (auto &&Summary : CI.getSummaryContext().FunctionSummaries)
1033-
printer.ProcessFunctionSummary(*Summary);
1034-
printer.ProcessEndOfSourceFile();
1022+
CI.getSummarySerializer().serialize(
1023+
CI.getSummaryContext().FunctionSummaries, fd);
10351024
}
10361025
}
10371026
}

clang/lib/StaticAnalyzer/Core/CallEvent.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -238,11 +238,11 @@ ProgramStateRef CallEvent::invalidateRegions(unsigned BlockCount,
238238

239239
if (const Decl *callee = getDecl()) {
240240
const SummaryContext *SummaryCtx =
241-
State->getStateManager().getOwningEngine().getSummaryCtx();
241+
State->getStateManager().getOwningEngine().getSummaryCtx();
242242
const FunctionDecl *FD = llvm::dyn_cast<FunctionDecl>(callee);
243243
if (SummaryCtx && FD)
244244
Summary = SummaryCtx->GetSummary(FD);
245-
245+
246246
// Don't invalidate anything if the callee is marked pure/const.
247247
if (callee->hasAttr<PureAttr>() || callee->hasAttr<ConstAttr>())
248248
return Result;
@@ -259,7 +259,7 @@ ProgramStateRef CallEvent::invalidateRegions(unsigned BlockCount,
259259
findPtrToConstParams(PreserveArgs, *this);
260260

261261
for (unsigned Idx = 0, Count = getNumArgs(); Idx != Count; ++Idx) {
262-
if(Summary && Summary->hasAttribute<NoWritePtrParameterAttr>())
262+
if (Summary && Summary->hasAttribute<NoWritePtrParameterAttr>())
263263
continue;
264264

265265
// Mark this region for invalidation. We batch invalidate regions
@@ -288,7 +288,8 @@ ProgramStateRef CallEvent::invalidateRegions(unsigned BlockCount,
288288
ValuesToInvalidate.push_back(loc::MemRegionVal(TVR));
289289
}
290290

291-
bool ShouldPreserveGlobals = Summary && Summary->hasAttribute<NoWriteGlobalAttr>();
291+
bool ShouldPreserveGlobals =
292+
Summary && Summary->hasAttribute<NoWriteGlobalAttr>();
292293

293294
// Invalidate designated regions using the batch invalidation API.
294295
// NOTE: Even if RegionsToInvalidate is empty, we may still invalidate

clang/lib/Summary/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ add_clang_library(clangSummary
77
SummaryAttribute.cpp
88
SummaryConsumer.cpp
99
SummaryContext.cpp
10-
SummaryYamlMappings.cpp
10+
SummarySerialization.cpp
1111

1212
LINK_LIBS
1313
clangAST
Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,14 @@
11
#include "clang/Summary/SummaryConsumer.h"
22
#include "clang/Summary/SummaryContext.h"
3-
#include "clang/Summary/SummaryYamlMappings.h"
3+
#include "clang/Summary/SummarySerialization.h"
44

55
namespace clang {
6-
void JSONPrintingSummaryConsumer::ProcessFunctionSummary(
7-
const FunctionSummary &Summary) {
8-
JOS.object([&] {
9-
JOS.attribute("id", llvm::json::Value(Summary.getID()));
10-
JOS.attributeObject("attrs", [&] {
11-
JOS.attributeArray("function", [&] {
12-
for (auto &&Attr : Summary.getAttributes()) {
13-
JOS.value(llvm::json::Value(Attr->serialize()));
14-
}
15-
});
16-
});
17-
JOS.attributeObject("calls", [&] {
18-
JOS.attribute("opaque", llvm::json::Value(Summary.callsOpaqueObject()));
19-
JOS.attributeArray("functions", [&] {
20-
for (auto &&Call : Summary.getCalls()) {
21-
JOS.object([&] { JOS.attribute("id", llvm::json::Value(Call)); });
22-
}
23-
});
24-
});
25-
});
26-
}
6+
SerializingSummaryConsumer::SerializingSummaryConsumer(
7+
SummarySerializer &Serializer, llvm::raw_ostream &OS)
8+
: SummaryConsumer(*Serializer.getSummaryCtx()), OS(OS),
9+
Serializer(&Serializer) {}
2710

28-
void YAMLPrintingSummaryConsumer::ProcessEndOfSourceFile() {
29-
YOS << ((SummaryContext *)SummaryCtx)->FunctionSummaries;
30-
OS.flush();
11+
void SerializingSummaryConsumer::ProcessEndOfSourceFile() {
12+
Serializer->serialize(SummaryCtx->FunctionSummaries, OS);
3113
}
3214
} // namespace clang

0 commit comments

Comments
 (0)