Skip to content

Commit da96155

Browse files
committed
yaml serialization... complete mess
1 parent 8dfc609 commit da96155

File tree

10 files changed

+136
-19
lines changed

10 files changed

+136
-19
lines changed

clang/include/clang/Summary/SummaryConsumer.h

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

44
#include "clang/Basic/LLVM.h"
55
#include "llvm/Support/JSON.h"
6+
#include "llvm/Support/YAMLTraits.h"
7+
68
namespace clang {
79
class FunctionSummary;
810
class SummaryContext;
@@ -40,6 +42,17 @@ class JSONPrintingSummaryConsumer : public PrintingSummaryConsumer {
4042
JOS.flush();
4143
};
4244
};
45+
46+
class YAMLPrintingSummaryConsumer : public PrintingSummaryConsumer {
47+
llvm::raw_ostream &OS;
48+
llvm::yaml::Output YOS;
49+
50+
public:
51+
YAMLPrintingSummaryConsumer(const SummaryContext &SummaryCtx, raw_ostream &OS)
52+
: PrintingSummaryConsumer(SummaryCtx, OS), OS(OS), YOS(OS) {}
53+
54+
void ProcessEndOfSourceFile() override;
55+
};
4356
} // namespace clang
4457

4558
#endif // LLVM_CLANG_SUMMARY_SUMMARYCONSUMER_H

clang/include/clang/Summary/SummaryContext.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ class FunctionSummary {
3333
void replaceAttributes(std::set<const SummaryAttr *> Attrs) {
3434
this->Attrs = std::move(Attrs);
3535
}
36+
37+
friend struct llvm::yaml::MappingTraits<clang::FunctionSummary>;
38+
friend struct llvm::yaml::MappingContextTraits<clang::FunctionSummary, clang::SummaryContext>;
3639
};
3740

3841
class SummaryContext {
@@ -55,6 +58,7 @@ class SummaryContext {
5558
void SummarizeFunctionBody(const FunctionDecl *FD);
5659

5760
void ParseSummaryFromJSON(const llvm::json::Array &Summary);
61+
void ParseSummaryFromYAML(StringRef content);
5862
void ReduceSummaries();
5963
};
6064
} // namespace clang
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#ifndef LLVM_CLANG_SUMMARY_SUMMARYYAMLMAPPINGS_H
2+
#define LLVM_CLANG_SUMMARY_SUMMARYYAMLMAPPINGS_H
3+
4+
#include "llvm/Support/YAMLTraits.h"
5+
#include "clang/Summary/SummaryContext.h"
6+
7+
#include <memory>
8+
#include <vector>
9+
10+
namespace llvm {
11+
namespace yaml {
12+
template <> struct MappingTraits<clang::FunctionSummary> {
13+
static void mapping(IO &io, clang::FunctionSummary &FS);
14+
};
15+
16+
template <>
17+
struct SequenceTraits<std::vector<std::unique_ptr<clang::FunctionSummary>>> {
18+
static size_t
19+
size(IO &io, std::vector<std::unique_ptr<clang::FunctionSummary>> &seq);
20+
static clang::FunctionSummary &
21+
element(IO &io, std::vector<std::unique_ptr<clang::FunctionSummary>> &seq,
22+
size_t index);
23+
};
24+
} // namespace yaml
25+
} // namespace llvm
26+
27+
#endif //LLVM_CLANG_SUMMARY_SUMMARYYAMLMAPPINGS_H

clang/lib/Frontend/CompilerInstance.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -757,7 +757,7 @@ void CompilerInstance::createSummaryConsumer() {
757757
}
758758

759759
TheSummaryConsumer.reset(
760-
new JSONPrintingSummaryConsumer(getSummaryContext(), *SummaryOS));
760+
new YAMLPrintingSummaryConsumer(getSummaryContext(), *SummaryOS));
761761
}
762762

763763
void CompilerInstance::createSema(TranslationUnitKind TUKind,

clang/lib/Frontend/FrontendAction.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -995,7 +995,7 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
995995
for (llvm::vfs::directory_iterator Dir = FS.dir_begin(DirNative, EC),
996996
DirEnd;
997997
Dir != DirEnd && !EC; Dir.increment(EC)) {
998-
if (llvm::sys::path::extension(Dir->path()) != ".json")
998+
if (llvm::sys::path::extension(Dir->path()) != ".yaml")
999999
continue;
10001000

10011001
paths.emplace_back(Dir->path().str());
@@ -1007,13 +1007,18 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
10071007
std::stringstream buffer;
10081008
buffer << t.rdbuf();
10091009

1010-
auto JSON = llvm::json::parse(buffer.str());
1011-
if (!!JSON)
1012-
CI.getSummaryContext().ParseSummaryFromJSON(*JSON->getAsArray());
1010+
llvm::outs() << buffer.str() << '\n';
10131011

1014-
llvm::handleAllErrors(
1015-
JSON.takeError(),
1016-
[](const llvm::ErrorInfoBase &EI) { std::ignore = EI.message(); });
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(); });
10171022
}
10181023

10191024
CI.getSummaryContext().ReduceSummaries();

clang/lib/StaticAnalyzer/Core/CallEvent.cpp

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -233,12 +233,20 @@ static void findPtrToConstParams(llvm::SmallSet<unsigned, 4> &PreserveArgs,
233233

234234
ProgramStateRef CallEvent::invalidateRegions(unsigned BlockCount,
235235
ProgramStateRef Orig) const {
236+
const FunctionSummary *Summary = nullptr;
236237
ProgramStateRef Result = (Orig ? Orig : getState());
237238

238-
// Don't invalidate anything if the callee is marked pure/const.
239-
if (const Decl *callee = getDecl())
239+
if (const Decl *callee = getDecl()) {
240+
const SummaryContext *SummaryCtx =
241+
State->getStateManager().getOwningEngine().getSummaryCtx();
242+
const FunctionDecl *FD = llvm::dyn_cast<FunctionDecl>(callee);
243+
if (SummaryCtx && FD)
244+
Summary = SummaryCtx->GetSummary(FD);
245+
246+
// Don't invalidate anything if the callee is marked pure/const.
240247
if (callee->hasAttr<PureAttr>() || callee->hasAttr<ConstAttr>())
241248
return Result;
249+
}
242250

243251
SmallVector<SVal, 8> ValuesToInvalidate;
244252
RegionAndSymbolInvalidationTraits ETraits;
@@ -251,6 +259,9 @@ ProgramStateRef CallEvent::invalidateRegions(unsigned BlockCount,
251259
findPtrToConstParams(PreserveArgs, *this);
252260

253261
for (unsigned Idx = 0, Count = getNumArgs(); Idx != Count; ++Idx) {
262+
if(Summary && Summary->hasAttribute<NoWritePtrParameterAttr>())
263+
continue;
264+
254265
// Mark this region for invalidation. We batch invalidate regions
255266
// below for efficiency.
256267
if (PreserveArgs.count(Idx))
@@ -277,15 +288,7 @@ ProgramStateRef CallEvent::invalidateRegions(unsigned BlockCount,
277288
ValuesToInvalidate.push_back(loc::MemRegionVal(TVR));
278289
}
279290

280-
bool ShouldPreserveGlobals = false;
281-
const SummaryContext *SummaryCtx =
282-
State->getStateManager().getOwningEngine().getSummaryCtx();
283-
const FunctionDecl *FD = llvm::dyn_cast_or_null<FunctionDecl>(getDecl());
284-
if (SummaryCtx && FD) {
285-
const auto *Summary = SummaryCtx->GetSummary(FD);
286-
ShouldPreserveGlobals =
287-
Summary && Summary->hasAttribute<NoWriteGlobalAttr>();
288-
}
291+
bool ShouldPreserveGlobals = Summary && Summary->hasAttribute<NoWriteGlobalAttr>();
289292

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

clang/lib/Summary/CMakeLists.txt

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

1112
LINK_LIBS
1213
clangAST

clang/lib/Summary/SummaryConsumer.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "clang/Summary/SummaryConsumer.h"
22
#include "clang/Summary/SummaryContext.h"
3+
#include "clang/Summary/SummaryYamlMappings.h"
34

45
namespace clang {
56
void JSONPrintingSummaryConsumer::ProcessFunctionSummary(
@@ -23,4 +24,9 @@ void JSONPrintingSummaryConsumer::ProcessFunctionSummary(
2324
});
2425
});
2526
}
27+
28+
void YAMLPrintingSummaryConsumer::ProcessEndOfSourceFile() {
29+
YOS << ((SummaryContext *)SummaryCtx)->FunctionSummaries;
30+
OS.flush();
31+
}
2632
} // namespace clang

clang/lib/Summary/SummaryContext.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "clang/Index/USRGeneration.h"
44
#include "clang/Summary/SummaryAttribute.h"
55
#include "clang/Summary/SummaryConsumer.h"
6+
#include "clang/Summary/SummaryYamlMappings.h"
67
#include <set>
78

89
namespace clang {
@@ -144,6 +145,16 @@ void SummaryContext::ParseSummaryFromJSON(const llvm::json::Array &Summary) {
144145
}
145146
}
146147

148+
void SummaryContext::ParseSummaryFromYAML(StringRef content) {
149+
std::vector<std::unique_ptr<clang::FunctionSummary>> summaries;
150+
151+
llvm::yaml::Input YIN(content, this);
152+
YIN >> summaries;
153+
154+
for(auto &&summary : summaries)
155+
CreateSummary(summary->getID().str(), summary->getAttributes(), summary->getCalls(), summary->callsOpaqueObject());
156+
}
157+
147158
bool SummaryContext::ReduceFunctionSummary(FunctionSummary &Function) {
148159
bool changed = false;
149160

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#include "clang/Summary/SummaryYamlMappings.h"
2+
3+
namespace llvm {
4+
namespace yaml {
5+
void MappingTraits<clang::FunctionSummary>::mapping(IO &io, clang::FunctionSummary &FS) {
6+
io.mapRequired("id", FS.ID);
7+
8+
std::vector<std::string> Attrs;
9+
for(auto &&Attr : FS.Attrs)
10+
Attrs.emplace_back(Attr->serialize());
11+
io.mapRequired("fn_attrs", Attrs);
12+
if(!io.outputting()) {
13+
std::set<const clang::SummaryAttr *> FunctionAttrs;
14+
for (auto parsedAttr : Attrs) {
15+
for (auto &&Attr : ((clang::SummaryContext*)io.getContext())->Attributes) {
16+
if (Attr->parse(parsedAttr))
17+
FunctionAttrs.emplace(Attr.get());
18+
}
19+
}
20+
21+
FS.Attrs = std::move(FunctionAttrs);
22+
}
23+
24+
io.mapRequired("opaque_calls", FS.CallsOpaque);
25+
26+
std::vector<std::string> Calls(FS.Calls.begin(), FS.Calls.end());
27+
io.mapRequired("calls", Calls);
28+
if(!io.outputting())
29+
FS.Calls = std::set(Calls.begin(), Calls.end());
30+
}
31+
32+
size_t
33+
SequenceTraits<std::vector<std::unique_ptr<clang::FunctionSummary>>>::size(IO &io, std::vector<std::unique_ptr<clang::FunctionSummary>> &seq) {
34+
return seq.size();
35+
}
36+
37+
clang::FunctionSummary &
38+
SequenceTraits<std::vector<std::unique_ptr<clang::FunctionSummary>>>::element(IO &io, std::vector<std::unique_ptr<clang::FunctionSummary>> &seq,
39+
size_t index) {
40+
if (index >= seq.size()) {
41+
seq.resize(index + 1);
42+
seq[index].reset(new clang::FunctionSummary("", {}, {}, false));
43+
}
44+
return *seq[index];
45+
}
46+
} // namespace yaml
47+
} // namespace llvm

0 commit comments

Comments
 (0)