Skip to content

Commit 8449340

Browse files
committed
binary serialization prototype
1 parent 449adeb commit 8449340

File tree

6 files changed

+383
-4
lines changed

6 files changed

+383
-4
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5956,7 +5956,7 @@ def emit_summaries : Flag<["-", "--"], "emit-summaries">, Flags<[NoXarchOption]>
59565956
HelpText<"Alias for --emit-summaries=cwd">;
59575957
def summary_format_EQ : Joined<["-", "--"], "summary-format=">, Flags<[NoXarchOption]>,
59585958
Visibility<[ClangOption, CC1Option]>,
5959-
HelpText<"The format of the emitted summaries. Can be set to 'json' (default) or 'yaml'">;
5959+
HelpText<"The format of the emitted summaries. Can be set to 'json' (default), 'yaml', or 'binary'">;
59605960
def save_stats_EQ : Joined<["-", "--"], "save-stats=">, Flags<[NoXarchOption]>,
59615961
HelpText<"Save llvm statistics.">;
59625962
def save_stats : Flag<["-", "--"], "save-stats">, Flags<[NoXarchOption]>,

clang/include/clang/Summary/SummarySerialization.h

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
#define LLVM_CLANG_SUMMARY_SUMMARYSERIALIZATION_H
33

44
#include "clang/Summary/SummaryContext.h"
5+
#include "llvm/Bitstream/BitstreamReader.h"
6+
#include "llvm/Bitstream/BitstreamWriter.h"
57

68
namespace clang {
79
class SummarySerializer {
@@ -38,6 +40,63 @@ class YAMLSummarySerializer : public SummarySerializer {
3840
raw_ostream &OS) override;
3941
void parse(StringRef) override;
4042
};
43+
44+
class BinarySummarySerializer : public SummarySerializer {
45+
enum BlockIDs {
46+
ATTRIBUTE_BLOCK_ID = llvm::bitc::FIRST_APPLICATION_BLOCKID,
47+
IDENTIFIER_BLOCK_ID,
48+
SUMMARY_BLOCK_ID
49+
};
50+
51+
enum AttributeRecordTypes {
52+
ATTR = 1,
53+
};
54+
55+
enum IdentifierRecordTypes {
56+
IDENTIFIER = 1,
57+
};
58+
59+
enum SummaryRecordTypes { FUNCTION = 1 };
60+
61+
// FIXME: get rid of this global state
62+
std::map<const SummaryAttr *, uint64_t> AttrIDs;
63+
std::map<std::string, uint64_t> FunctionIDs;
64+
65+
std::vector<const SummaryAttr *> ParsedAttrIDs;
66+
std::vector<std::string> ParsedFunctionIDs;
67+
68+
llvm::SmallVector<char, 32> Buffer;
69+
llvm::BitstreamWriter Stream;
70+
71+
void PopulateBlockInfo();
72+
void EmitAttributeBlock();
73+
void EmitIdentifierBlock();
74+
void EmitSummaryBlock();
75+
76+
void EmitBlock(unsigned ID, const char *Name);
77+
void EmitRecord(unsigned ID, const char *Name);
78+
79+
llvm::Error handleBlockStartCommon(unsigned ID,
80+
llvm::BitstreamCursor &Stream);
81+
llvm::Error handleBlockRecordsCommon(
82+
llvm::BitstreamCursor &Stream,
83+
llvm::function_ref<void(const SmallVector<uint64_t, 64> &)>);
84+
85+
llvm::Error parseAttributeBlock(llvm::BitstreamCursor &Stream);
86+
llvm::Error parseIdentifierBlock(llvm::BitstreamCursor &Stream);
87+
llvm::Error parseSummaryBlock(llvm::BitstreamCursor &Stream);
88+
llvm::Error parseBlock(unsigned ID, llvm::BitstreamCursor &Stream);
89+
llvm::Error parseImpl(StringRef Buffer);
90+
91+
public:
92+
BinarySummarySerializer(SummaryContext &SummaryCtx)
93+
: SummarySerializer(SummaryCtx), Stream(Buffer) {};
94+
95+
void serialize(const std::vector<std::unique_ptr<FunctionSummary>> &,
96+
raw_ostream &OS) override;
97+
void parse(StringRef) override;
98+
};
99+
41100
} // namespace clang
42101

43102
#endif // LLVM_CLANG_SUMMARY_SUMMARYSERIALIZATION_H

clang/lib/Frontend/CompilerInstance.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -750,8 +750,10 @@ void CompilerInstance::createSummaryConsumer(FrontendInputFile Input) {
750750

751751
llvm::SmallString<32> SummaryFile = EmitSummaryDir;
752752
llvm::sys::path::append(SummaryFile, Input.getFile());
753+
754+
StringRef Format = getFrontendOpts().SummaryFormat;
753755
llvm::sys::path::replace_extension(SummaryFile,
754-
getFrontendOpts().SummaryFormat);
756+
Format == "binary" ? "summary" : Format);
755757

756758
std::error_code EC;
757759
SummaryOS.reset(new llvm::raw_fd_ostream(SummaryFile, EC,
@@ -778,6 +780,8 @@ void CompilerInstance::createSummarySerializer() {
778780

779781
if (Format == "yaml")
780782
Serializer = new YAMLSummarySerializer(*getSummaryContext());
783+
else if (Format == "binary")
784+
Serializer = new BinarySummarySerializer(*getSummaryContext());
781785
else
782786
Serializer = new JSONSummarySerializer(*getSummaryContext());
783787

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3271,7 +3271,7 @@ static bool ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
32713271
StringRef Format = A->getValue();
32723272

32733273
// FIXME: don't hardcode these values
3274-
if (Format == "yaml")
3274+
if (Format == "yaml" || Format == "binary")
32753275
Opts.SummaryFormat = Format;
32763276
};
32773277

clang/lib/Frontend/FrontendAction.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -986,7 +986,9 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
986986
static const char *reducedCacheName =
987987
"reduced-summary-so-that-we-do-not-have-to-evaluate-it-every-time";
988988
const std::string summaryExtension =
989-
'.' + CI.getFrontendOpts().SummaryFormat;
989+
'.' + (CI.getFrontendOpts().SummaryFormat == "binary"
990+
? "summary"
991+
: CI.getFrontendOpts().SummaryFormat);
990992

991993
FileManager &FileMgr = CI.getFileManager();
992994
StringRef SummaryDirPath = CI.getFrontendOpts().ReadSummaryDir;

0 commit comments

Comments
 (0)