diff options
author | Francis Visoiu Mistrih <francisvm@yahoo.com> | 2019-04-24 00:06:24 +0000 |
---|---|---|
committer | Francis Visoiu Mistrih <francisvm@yahoo.com> | 2019-04-24 00:06:24 +0000 |
commit | 7fee2b89fd6e5101bc590e0741f4d7a82b7715e1 (patch) | |
tree | 6358f4d132215ab591592762043c3a8fffb2ee31 /llvm/lib/IR/DiagnosticInfo.cpp | |
parent | 53796d9439018b97a0e6f35af0ba83843a7270e7 (diff) | |
download | bcm5719-llvm-7fee2b89fd6e5101bc590e0741f4d7a82b7715e1.tar.gz bcm5719-llvm-7fee2b89fd6e5101bc590e0741f4d7a82b7715e1.zip |
[Remarks] Add string deduplication using a string table
* Add support for uniquing strings in the remark streamer and emitting the string table in the remarks section.
* Add parsing support for the string table in the RemarkParser.
From this remark:
```
--- !Missed
Pass: inline
Name: NoDefinition
DebugLoc: { File: 'test-suite/SingleSource/UnitTests/2002-04-17-PrintfChar.c',
Line: 7, Column: 3 }
Function: printArgsNoRet
Args:
- Callee: printf
- String: ' will not be inlined into '
- Caller: printArgsNoRet
DebugLoc: { File: 'test-suite/SingleSource/UnitTests/2002-04-17-PrintfChar.c',
Line: 6, Column: 0 }
- String: ' because its definition is unavailable'
...
```
to:
```
--- !Missed
Pass: 0
Name: 1
DebugLoc: { File: 3, Line: 7, Column: 3 }
Function: 2
Args:
- Callee: 4
- String: 5
- Caller: 2
DebugLoc: { File: 3, Line: 6, Column: 0 }
- String: 6
...
```
And the string table in the .remarks/__remarks section containing:
```
inline\0NoDefinition\0printArgsNoRet\0
test-suite/SingleSource/UnitTests/2002-04-17-PrintfChar.c\0printf\0
will not be inlined into \0 because its definition is unavailable\0
```
This is mostly supposed to be used for testing purposes, but it gives us
a 2x reduction in the remark size, and is an incremental change for the
updates to the remarks file format.
Differential Revision: https://reviews.llvm.org/D60227
llvm-svn: 359050
Diffstat (limited to 'llvm/lib/IR/DiagnosticInfo.cpp')
-rw-r--r-- | llvm/lib/IR/DiagnosticInfo.cpp | 57 |
1 files changed, 46 insertions, 11 deletions
diff --git a/llvm/lib/IR/DiagnosticInfo.cpp b/llvm/lib/IR/DiagnosticInfo.cpp index 14bee35dc29..7c387e95724 100644 --- a/llvm/lib/IR/DiagnosticInfo.cpp +++ b/llvm/lib/IR/DiagnosticInfo.cpp @@ -43,6 +43,8 @@ using namespace llvm; +cl::opt<bool> UseStringTable("remarks-yaml-string-table", cl::init(false)); + int llvm::getNextAvailablePluginDiagnosticKind() { static std::atomic<int> PluginKindID(DK_FirstPluginKind); return ++PluginKindID; @@ -373,6 +375,20 @@ std::string DiagnosticInfoOptimizationBase::getMsg() const { void OptimizationRemarkAnalysisFPCommute::anchor() {} void OptimizationRemarkAnalysisAliasing::anchor() {} +template <typename T> +static void mapRemarkHeader( + yaml::IO &io, T PassName, T RemarkName, DiagnosticLocation DL, + T FunctionName, Optional<uint64_t> Hotness, + SmallVectorImpl<DiagnosticInfoOptimizationBase::Argument> &Args) { + io.mapRequired("Pass", PassName); + io.mapRequired("Name", RemarkName); + if (!io.outputting() || DL.isValid()) + io.mapOptional("DebugLoc", DL); + io.mapRequired("Function", FunctionName); + io.mapOptional("Hotness", Hotness); + io.mapOptional("Args", Args); +} + namespace llvm { namespace yaml { @@ -413,13 +429,18 @@ void MappingTraits<DiagnosticInfoOptimizationBase *>::mapping( GlobalValue::dropLLVMManglingEscape(OptDiag->getFunction().getName()); StringRef PassName(OptDiag->PassName); - io.mapRequired("Pass", PassName); - io.mapRequired("Name", OptDiag->RemarkName); - if (!io.outputting() || DL.isValid()) - io.mapOptional("DebugLoc", DL); - io.mapRequired("Function", FN); - io.mapOptional("Hotness", OptDiag->Hotness); - io.mapOptional("Args", OptDiag->Args); + if (UseStringTable) { + remarks::StringTable &StrTab = + reinterpret_cast<RemarkStreamer *>(io.getContext())->getStringTable(); + unsigned PassID = StrTab.add(PassName).first; + unsigned NameID = StrTab.add(OptDiag->RemarkName).first; + unsigned FunctionID = StrTab.add(FN).first; + mapRemarkHeader(io, PassID, NameID, DL, FunctionID, OptDiag->Hotness, + OptDiag->Args); + } else { + mapRemarkHeader(io, PassName, OptDiag->RemarkName, DL, FN, OptDiag->Hotness, + OptDiag->Args); + } } template <> struct MappingTraits<DiagnosticLocation> { @@ -430,7 +451,15 @@ template <> struct MappingTraits<DiagnosticLocation> { unsigned Line = DL.getLine(); unsigned Col = DL.getColumn(); - io.mapRequired("File", File); + if (UseStringTable) { + remarks::StringTable &StrTab = + reinterpret_cast<RemarkStreamer *>(io.getContext())->getStringTable(); + unsigned FileID = StrTab.add(File).first; + io.mapRequired("File", FileID); + } else { + io.mapRequired("File", File); + } + io.mapRequired("Line", Line); io.mapRequired("Column", Col); } @@ -459,12 +488,18 @@ template <> struct BlockScalarTraits<StringBlockVal> { template <> struct MappingTraits<DiagnosticInfoOptimizationBase::Argument> { static void mapping(IO &io, DiagnosticInfoOptimizationBase::Argument &A) { assert(io.outputting() && "input not yet implemented"); - // Emit a string block scalar for multiline strings, to preserve newlines. - if (StringRef(A.Val).count('\n') > 1) { + + if (UseStringTable) { + remarks::StringTable &StrTab = + reinterpret_cast<RemarkStreamer *>(io.getContext())->getStringTable(); + auto ValueID = StrTab.add(A.Val).first; + io.mapRequired(A.Key.data(), ValueID); + } else if (StringRef(A.Val).count('\n') > 1) { StringBlockVal S(A.Val); io.mapRequired(A.Key.data(), S); - } else + } else { io.mapRequired(A.Key.data(), A.Val); + } if (A.Loc.isValid()) io.mapOptional("DebugLoc", A.Loc); } |