summaryrefslogtreecommitdiffstats
path: root/llvm/lib/IR/DiagnosticInfo.cpp
diff options
context:
space:
mode:
authorFrancis Visoiu Mistrih <francisvm@yahoo.com>2019-04-24 00:06:24 +0000
committerFrancis Visoiu Mistrih <francisvm@yahoo.com>2019-04-24 00:06:24 +0000
commit7fee2b89fd6e5101bc590e0741f4d7a82b7715e1 (patch)
tree6358f4d132215ab591592762043c3a8fffb2ee31 /llvm/lib/IR/DiagnosticInfo.cpp
parent53796d9439018b97a0e6f35af0ba83843a7270e7 (diff)
downloadbcm5719-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.cpp57
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);
}
OpenPOWER on IntegriCloud