Skip to content

Commit 04bcd74

Browse files
authored
Revert "Add source file name for template instantiations in -ftime-trace" (#99534)
Reverts #98320 Breaks windows tests: ``` Step 8 (test-build-unified-tree-check-clang-unit) failure: test (failure) ******************** TEST 'Clang-Unit :: Support/./ClangSupportTests.exe/1/3' FAILED ******************** Script(shard): -- GTEST_OUTPUT=json:C:\buildbot\as-builder-3\llvm-clang-x86_64-win-fast\build\tools\clang\unittests\Support\.\ClangSupportTests.exe-Clang-Unit-4296-1-3.json GTEST_SHUFFLE=0 GTEST_TOTAL_SHARDS=3 GTEST_SHARD_INDEX=1 C:\buildbot\as-builder-3\llvm-clang-x86_64-win-fast\build\tools\clang\unittests\Support\.\ClangSupportTests.exe -- Script: -- C:\buildbot\as-builder-3\llvm-clang-x86_64-win-fast\build\tools\clang\unittests\Support\.\ClangSupportTests.exe --gtest_filter=TimeProfilerTest.TemplateInstantiations -- C:\buildbot\as-builder-3\llvm-clang-x86_64-win-fast\llvm-project\clang\unittests\Support\TimeProfilerTest.cpp(278): error: Expected equality of these values: R"( Frontend | ParseFunctionDefinition (fooB) | ParseFunctionDefinition (fooMTA) | ParseFunctionDefinition (fooA) | ParseDeclarationOrFunctionDefinition (test.cc:3:5) | | ParseFunctionDefinition (user) | PerformPendingInstantiations | | InstantiateFunction (fooA<int>, ./a.h:7) | | | InstantiateFunction (fooB<int>, ./b.h:3) | | | InstantiateFunction (fooMTA<int>, ./a.h:4) )" Which is: "\nFrontend\n| ParseFunctionDefinition (fooB)\n| ParseFunctionDefinition (fooMTA)\n| ParseFunctionDefinition (fooA)\n| ParseDeclarationOrFunctionDefinition (test.cc:3:5)\n| | ParseFunctionDefinition (user)\n| PerformPendingInstantiations\n| | InstantiateFunction (fooA<int>, ./a.h:7)\n| | | InstantiateFunction (fooB<int>, ./b.h:3)\n| | | InstantiateFunction (fooMTA<int>, ./a.h:4)\n" buildTraceGraph(Json) Which is: "\nFrontend\n| ParseFunctionDefinition (fooB)\n| ParseFunctionDefinition (fooMTA)\n| ParseFunctionDefinition (fooA)\n| ParseDeclarationOrFunctionDefinition (test.cc:3:5)\n| | ParseFunctionDefinition (user)\n| PerformPendingInstantiations\n| | InstantiateFunction (fooA<int>, .\\a.h:7)\n| | | InstantiateFunction (fooB<int>, .\\b.h:3)\n| | | InstantiateFunction (fooMTA<int>, .\\a.h:4)\n" With diff: @@ -7,5 +7,5 @@ | | ParseFunctionDefinition (user) | PerformPendingInstantiations -| | InstantiateFunction (fooA<int>, ./a.h:7) -| | | InstantiateFunction (fooB<int>, ./b.h:3) -| | | InstantiateFunction (fooMTA<int>, ./a.h:4)\n +| | InstantiateFunction (fooA<int>, .\\a.h:7) +| | | InstantiateFunction (fooB<int>, .\\b.h:3) +| | | InstantiateFunction (fooMTA<int>, .\\a.h:4)\n C:\buildbot\as-builder-3\llvm-clang-x86_64-win-fast\llvm-project\clang\unittests\Support\TimeProfilerTest.cpp:278 Expected equality of these values: R"( Frontend | ParseFunctionDefinition (fooB) | ParseFunctionDefinition (fooMTA) | ParseFunctionDefinition (fooA) | ParseDeclarationOrFunctionDefinition (test.cc:3:5) | | ParseFunctionDefinition (user) | PerformPendingInstantiations | | InstantiateFunction (fooA<int>, ./a.h:7) ```
1 parent b2dcf62 commit 04bcd74

File tree

13 files changed

+64
-223
lines changed

13 files changed

+64
-223
lines changed

a-abfdec1d.o.tmp

Whitespace-only changes.

clang/docs/ReleaseNotes.rst

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -736,9 +736,6 @@ Improvements to Clang's time-trace
736736
- Clang now specifies that using ``auto`` in a lambda parameter is a C++14 extension when
737737
appropriate. (`#46059: <https://github.com/llvm/llvm-project/issues/46059>`_).
738738

739-
- Clang now adds source file infomation for template instantiations as ``event["args"]["filename"]``. This
740-
added behind an option ``-ftime-trace-verbose``. This is expected to increase the size of trace by 2-3 times.
741-
742739
Improvements to Coverage Mapping
743740
--------------------------------
744741

clang/include/clang/Driver/Options.td

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3988,10 +3988,6 @@ def ftime_trace_granularity_EQ : Joined<["-"], "ftime-trace-granularity=">, Grou
39883988
HelpText<"Minimum time granularity (in microseconds) traced by time profiler">,
39893989
Visibility<[ClangOption, CC1Option, CLOption, DXCOption]>,
39903990
MarshallingInfoInt<FrontendOpts<"TimeTraceGranularity">, "500u">;
3991-
def ftime_trace_verbose : Joined<["-"], "ftime-trace-verbose">, Group<f_Group>,
3992-
HelpText<"Make time trace capture verbose event details (e.g. source filenames). This can increase the size of the output by 2-3 times">,
3993-
Visibility<[ClangOption, CC1Option, CLOption, DXCOption]>,
3994-
MarshallingInfoFlag<FrontendOpts<"TimeTraceVerbose">>;
39953991
def ftime_trace_EQ : Joined<["-"], "ftime-trace=">, Group<f_Group>,
39963992
HelpText<"Similar to -ftime-trace. Specify the JSON file or a directory which will contain the JSON file">,
39973993
Visibility<[ClangOption, CC1Option, CLOption, DXCOption]>,

clang/include/clang/Frontend/FrontendOptions.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -580,11 +580,6 @@ class FrontendOptions {
580580
/// Minimum time granularity (in microseconds) traced by time profiler.
581581
unsigned TimeTraceGranularity;
582582

583-
/// Make time trace capture verbose event details (e.g. source filenames).
584-
/// This can increase the size of the output by 2-3 times.
585-
LLVM_PREFERRED_TYPE(bool)
586-
unsigned TimeTraceVerbose : 1;
587-
588583
/// Path which stores the output files for -ftime-trace
589584
std::string TimeTracePath;
590585

@@ -606,8 +601,7 @@ class FrontendOptions {
606601
EmitSymbolGraph(false), EmitExtensionSymbolGraphs(false),
607602
EmitSymbolGraphSymbolLabelsForTesting(false),
608603
EmitPrettySymbolGraphs(false), GenReducedBMI(false),
609-
UseClangIRPipeline(false), TimeTraceGranularity(500),
610-
TimeTraceVerbose(false) {}
604+
UseClangIRPipeline(false), TimeTraceGranularity(500) {}
611605

612606
/// getInputKindForExtension - Return the appropriate input kind for a file
613607
/// extension. For example, "c" would return Language::C.

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6754,7 +6754,6 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
67546754
if (const char *Name = C.getTimeTraceFile(&JA)) {
67556755
CmdArgs.push_back(Args.MakeArgString("-ftime-trace=" + Twine(Name)));
67566756
Args.AddLastArg(CmdArgs, options::OPT_ftime_trace_granularity_EQ);
6757-
Args.AddLastArg(CmdArgs, options::OPT_ftime_trace_verbose);
67586757
}
67596758

67606759
if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {

clang/lib/Sema/SemaTemplateInstantiate.cpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3426,16 +3426,11 @@ Sema::InstantiateClass(SourceLocation PointOfInstantiation,
34263426
return true;
34273427

34283428
llvm::TimeTraceScope TimeScope("InstantiateClass", [&]() {
3429-
llvm::TimeTraceMetadata M;
3430-
llvm::raw_string_ostream OS(M.Detail);
3429+
std::string Name;
3430+
llvm::raw_string_ostream OS(Name);
34313431
Instantiation->getNameForDiagnostic(OS, getPrintingPolicy(),
34323432
/*Qualified=*/true);
3433-
if (llvm::isTimeTraceVerbose()) {
3434-
auto Loc = SourceMgr.getExpansionLoc(Instantiation->getLocation());
3435-
M.File = SourceMgr.getFilename(Loc);
3436-
M.Line = SourceMgr.getExpansionLineNumber(Loc);
3437-
}
3438-
return M;
3433+
return Name;
34393434
});
34403435

34413436
Pattern = PatternDef;

clang/lib/Sema/SemaTemplateInstantiateDecl.cpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4966,16 +4966,11 @@ void Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation,
49664966
}
49674967

49684968
llvm::TimeTraceScope TimeScope("InstantiateFunction", [&]() {
4969-
llvm::TimeTraceMetadata M;
4970-
llvm::raw_string_ostream OS(M.Detail);
4969+
std::string Name;
4970+
llvm::raw_string_ostream OS(Name);
49714971
Function->getNameForDiagnostic(OS, getPrintingPolicy(),
49724972
/*Qualified=*/true);
4973-
if (llvm::isTimeTraceVerbose()) {
4974-
auto Loc = SourceMgr.getExpansionLoc(Function->getLocation());
4975-
M.File = SourceMgr.getFilename(Loc);
4976-
M.Line = SourceMgr.getExpansionLineNumber(Loc);
4977-
}
4978-
return M;
4973+
return Name;
49794974
});
49804975

49814976
// If we're performing recursive template instantiation, create our own

clang/test/Driver/ftime-trace-sections.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// RUN: rm -rf %t && mkdir %t && cd %t
2-
// RUN: %clangxx -S -ftime-trace -ftime-trace-granularity=0 -ftime-trace-verbose -o out %s
2+
// RUN: %clangxx -S -ftime-trace -ftime-trace-granularity=0 -o out %s
33
// RUN: %python %S/ftime-trace-sections.py < out.json
44

55
template <typename T>

clang/test/Driver/ftime-trace.cpp

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
// RUN: rm -rf %t && mkdir -p %t && cd %t
2-
// RUN: %clangxx -S -no-canonical-prefixes -ftime-trace -ftime-trace-granularity=0 -ftime-trace-verbose -o out %s
2+
// RUN: %clangxx -S -no-canonical-prefixes -ftime-trace -ftime-trace-granularity=0 -o out %s
33
// RUN: cat out.json \
44
// RUN: | %python -c 'import json, sys; json.dump(json.loads(sys.stdin.read()), sys.stdout, sort_keys=True, indent=2)' \
55
// RUN: | FileCheck %s
6-
// RUN: %clangxx -S -no-canonical-prefixes -ftime-trace=new-name.json -ftime-trace-granularity=0 -ftime-trace-verbose -o out %s
6+
// RUN: %clangxx -S -no-canonical-prefixes -ftime-trace=new-name.json -ftime-trace-granularity=0 -o out %s
77
// RUN: cat new-name.json \
88
// RUN: | %python -c 'import json, sys; json.dump(json.loads(sys.stdin.read()), sys.stdout, sort_keys=True, indent=2)' \
99
// RUN: | FileCheck %s
1010
// RUN: mkdir dir1 dir2
11-
// RUN: %clangxx -S -no-canonical-prefixes -ftime-trace=dir1 -ftime-trace-granularity=0 -ftime-trace-verbose -o out %s
11+
// RUN: %clangxx -S -no-canonical-prefixes -ftime-trace=dir1 -ftime-trace-granularity=0 -o out %s
1212
// RUN: cat dir1/out.json \
1313
// RUN: | %python -c 'import json, sys; json.dump(json.loads(sys.stdin.read()), sys.stdout, sort_keys=True, indent=2)' \
1414
// RUN: | FileCheck %s
15-
// RUN: %clangxx -S -no-canonical-prefixes -ftime-trace=dir2/ -ftime-trace-granularity=0 -ftime-trace-verbose -o out %s
15+
// RUN: %clangxx -S -no-canonical-prefixes -ftime-trace=dir2/ -ftime-trace-granularity=0 -o out %s
1616
// RUN: cat dir2/out.json \
1717
// RUN: | %python -c 'import json, sys; json.dump(json.loads(sys.stdin.read()), sys.stdout, sort_keys=True, indent=2)' \
1818
// RUN: | FileCheck %s
@@ -34,33 +34,32 @@
3434
// RUN: mkdir d e f && cp %s d/a.cpp && touch d/b.c
3535

3636
/// TODO: Support -fno-integrated-as.
37-
// RUN: %clang -### -c -ftime-trace -ftime-trace-granularity=0 -ftime-trace-verbose -fintegrated-as d/a.cpp -o e/a.o 2>&1 | FileCheck %s --check-prefix=COMPILE1
38-
// COMPILE1: -cc1{{.*}} "-ftime-trace=e/a.json" "-ftime-trace-granularity=0" "-ftime-trace-verbose"
37+
// RUN: %clang -### -c -ftime-trace -ftime-trace-granularity=0 -fintegrated-as d/a.cpp -o e/a.o 2>&1 | FileCheck %s --check-prefix=COMPILE1
38+
// COMPILE1: -cc1{{.*}} "-ftime-trace=e/a.json" "-ftime-trace-granularity=0"
3939

40-
// RUN: %clang -### -c -ftime-trace -ftime-trace-granularity=0 -ftime-trace-verbose d/a.cpp d/b.c -dumpdir f/ 2>&1 | FileCheck %s --check-prefix=COMPILE2
41-
// COMPILE2: -cc1{{.*}} "-ftime-trace=f/a.json" "-ftime-trace-granularity=0" "-ftime-trace-verbose"
42-
// COMPILE2: -cc1{{.*}} "-ftime-trace=f/b.json" "-ftime-trace-granularity=0" "-ftime-trace-verbose"
40+
// RUN: %clang -### -c -ftime-trace -ftime-trace-granularity=0 d/a.cpp d/b.c -dumpdir f/ 2>&1 | FileCheck %s --check-prefix=COMPILE2
41+
// COMPILE2: -cc1{{.*}} "-ftime-trace=f/a.json" "-ftime-trace-granularity=0"
42+
// COMPILE2: -cc1{{.*}} "-ftime-trace=f/b.json" "-ftime-trace-granularity=0"
4343

4444
/// -o specifies the link output. Create ${output}-${basename}.json.
45-
// RUN: %clang -### -ftime-trace -ftime-trace-granularity=0 -ftime-trace-verbose d/a.cpp d/b.c -o e/x 2>&1 | FileCheck %s --check-prefix=LINK1
46-
// LINK1: -cc1{{.*}} "-ftime-trace=e/x-a.json" "-ftime-trace-granularity=0" "-ftime-trace-verbose"
47-
// LINK1: -cc1{{.*}} "-ftime-trace=e/x-b.json" "-ftime-trace-granularity=0" "-ftime-trace-verbose"
45+
// RUN: %clang -### -ftime-trace -ftime-trace-granularity=0 d/a.cpp d/b.c -o e/x 2>&1 | FileCheck %s --check-prefix=LINK1
46+
// LINK1: -cc1{{.*}} "-ftime-trace=e/x-a.json" "-ftime-trace-granularity=0"
47+
// LINK1: -cc1{{.*}} "-ftime-trace=e/x-b.json" "-ftime-trace-granularity=0"
4848

4949
/// -dumpdir is f/g, not ending with a path separator. We create f/g${basename}.json.
50-
// RUN: %clang -### -ftime-trace -ftime-trace-granularity=0 -ftime-trace-verbose d/a.cpp d/b.c -o e/x -dumpdir f/g 2>&1 | FileCheck %s --check-prefix=LINK2
51-
// LINK2: -cc1{{.*}} "-ftime-trace=f/ga.json" "-ftime-trace-granularity=0" "-ftime-trace-verbose"
52-
// LINK2: -cc1{{.*}} "-ftime-trace=f/gb.json" "-ftime-trace-granularity=0" "-ftime-trace-verbose"
50+
// RUN: %clang -### -ftime-trace -ftime-trace-granularity=0 d/a.cpp d/b.c -o e/x -dumpdir f/g 2>&1 | FileCheck %s --check-prefix=LINK2
51+
// LINK2: -cc1{{.*}} "-ftime-trace=f/ga.json" "-ftime-trace-granularity=0"
52+
// LINK2: -cc1{{.*}} "-ftime-trace=f/gb.json" "-ftime-trace-granularity=0"
5353

54-
// RUN: %clang -### -ftime-trace=e -ftime-trace-granularity=0 -ftime-trace-verbose d/a.cpp d/b.c -o f/x -dumpdir f/ 2>&1 | FileCheck %s --check-prefix=LINK3
55-
// LINK3: -cc1{{.*}} "-ftime-trace=e{{/|\\\\}}a-{{[^.]*}}.json" "-ftime-trace-granularity=0" "-ftime-trace-verbose"
56-
// LINK3: -cc1{{.*}} "-ftime-trace=e{{/|\\\\}}b-{{[^.]*}}.json" "-ftime-trace-granularity=0" "-ftime-trace-verbose"
54+
// RUN: %clang -### -ftime-trace=e -ftime-trace-granularity=0 d/a.cpp d/b.c -o f/x -dumpdir f/ 2>&1 | FileCheck %s --check-prefix=LINK3
55+
// LINK3: -cc1{{.*}} "-ftime-trace=e{{/|\\\\}}a-{{[^.]*}}.json" "-ftime-trace-granularity=0"
56+
// LINK3: -cc1{{.*}} "-ftime-trace=e{{/|\\\\}}b-{{[^.]*}}.json" "-ftime-trace-granularity=0"
5757

58-
// RUN: %clang -### -ftime-trace -ftime-trace=e -ftime-trace-granularity=1 -ftime-trace-verbose -xassembler d/a.cpp 2>&1 | \
58+
// RUN: %clang -### -ftime-trace -ftime-trace=e -ftime-trace-granularity=1 -xassembler d/a.cpp 2>&1 | \
5959
// RUN: FileCheck %s --check-prefix=UNUSED
6060
// UNUSED: warning: argument unused during compilation: '-ftime-trace'
6161
// UNUSED-NEXT: warning: argument unused during compilation: '-ftime-trace=e'
6262
// UNUSED-NEXT: warning: argument unused during compilation: '-ftime-trace-granularity=1'
63-
// UNUSED-NEXT: warning: argument unused during compilation: '-ftime-trace-verbose'
6463
// UNUSED-NOT: warning:
6564

6665
template <typename T>

clang/tools/driver/cc1_main.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,8 +241,7 @@ int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) {
241241

242242
if (!Clang->getFrontendOpts().TimeTracePath.empty()) {
243243
llvm::timeTraceProfilerInitialize(
244-
Clang->getFrontendOpts().TimeTraceGranularity, Argv0,
245-
Clang->getFrontendOpts().TimeTraceVerbose);
244+
Clang->getFrontendOpts().TimeTraceGranularity, Argv0);
246245
}
247246
// --print-supported-cpus takes priority over the actual compilation.
248247
if (Clang->getFrontendOpts().PrintSupportedCPUs)

clang/unittests/Support/TimeProfilerTest.cpp

Lines changed: 27 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,11 @@
1010
#include "clang/Frontend/FrontendActions.h"
1111
#include "clang/Lex/PreprocessorOptions.h"
1212

13-
#include "llvm/ADT/StringMap.h"
1413
#include "llvm/Support/JSON.h"
1514
#include "llvm/Support/TimeProfiler.h"
16-
#include "llvm/Support/VirtualFileSystem.h"
1715
#include <stack>
1816

1917
#include "gtest/gtest.h"
20-
#include <tuple>
2118

2219
using namespace clang;
2320
using namespace llvm;
@@ -26,8 +23,7 @@ namespace {
2623

2724
// Should be called before testing.
2825
void setupProfiler() {
29-
timeTraceProfilerInitialize(/*TimeTraceGranularity=*/0, "test",
30-
/*TimeTraceVerbose=*/true);
26+
timeTraceProfilerInitialize(/*TimeTraceGranularity=*/0, "test");
3127
}
3228

3329
// Should be called after `compileFromString()`.
@@ -42,24 +38,14 @@ std::string teardownProfiler() {
4238

4339
// Returns true if code compiles successfully.
4440
// We only parse AST here. This is enough for constexpr evaluation.
45-
bool compileFromString(StringRef Code, StringRef Standard, StringRef File,
46-
llvm::StringMap<std::string> Headers = {}) {
41+
bool compileFromString(StringRef Code, StringRef Standard, StringRef FileName) {
4742
CompilerInstance Compiler;
4843
Compiler.createDiagnostics();
4944

50-
llvm::IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> FS(
51-
new llvm::vfs::InMemoryFileSystem());
52-
FS->addFile(File, 0, MemoryBuffer::getMemBuffer(Code));
53-
for (const auto &Header : Headers) {
54-
FS->addFile(Header.getKey(), 0,
55-
MemoryBuffer::getMemBuffer(Header.getValue()));
56-
}
57-
llvm::IntrusiveRefCntPtr<FileManager> Files(
58-
new FileManager(FileSystemOptions(), FS));
59-
Compiler.setFileManager(Files.get());
60-
6145
auto Invocation = std::make_shared<CompilerInvocation>();
62-
std::vector<const char *> Args = {Standard.data(), File.data()};
46+
Invocation->getPreprocessorOpts().addRemappedFile(
47+
FileName, MemoryBuffer::getMemBuffer(Code).release());
48+
const char *Args[] = {Standard.data(), FileName.data()};
6349
CompilerInvocation::CreateFromArgs(*Invocation, Args,
6450
Compiler.getDiagnostics());
6551
Compiler.setInvocation(std::move(Invocation));
@@ -74,27 +60,13 @@ bool compileFromString(StringRef Code, StringRef Standard, StringRef File,
7460
return Compiler.ExecuteAction(Action);
7561
}
7662

77-
std::string GetMetadata(json::Object *Event) {
78-
std::string Metadata;
79-
llvm::raw_string_ostream OS(Metadata);
80-
if (json::Object *Args = Event->getObject("args")) {
81-
if (auto Detail = Args->getString("detail"))
82-
OS << Detail->str();
83-
if (auto File = Args->getString("file"))
84-
OS << ", " << File->str();
85-
if (auto Line = Args->getInteger("line"))
86-
OS << ":" << *Line;
87-
}
88-
return Metadata;
89-
}
90-
9163
// Returns pretty-printed trace graph.
9264
std::string buildTraceGraph(StringRef Json) {
9365
struct EventRecord {
9466
int64_t TimestampBegin;
9567
int64_t TimestampEnd;
96-
std::string Name;
97-
std::string Metadata;
68+
StringRef Name;
69+
StringRef Detail;
9870
};
9971
std::vector<EventRecord> Events;
10072

@@ -109,21 +81,18 @@ std::string buildTraceGraph(StringRef Json) {
10981
int64_t TimestampBegin = TraceEventObj->getInteger("ts").value_or(0);
11082
int64_t TimestampEnd =
11183
TimestampBegin + TraceEventObj->getInteger("dur").value_or(0);
112-
std::string Name = TraceEventObj->getString("name").value_or("").str();
113-
std::string Metadata = GetMetadata(TraceEventObj);
114-
115-
// Source events are asynchronous events and may not perfectly nest the
116-
// synchronous events. Skip testing them.
117-
if (Name == "Source")
118-
continue;
84+
StringRef Name = TraceEventObj->getString("name").value_or("");
85+
StringRef Detail = "";
86+
if (json::Object *Args = TraceEventObj->getObject("args"))
87+
Detail = Args->getString("detail").value_or("");
11988

12089
// This is a "summary" event, like "Total PerformPendingInstantiations",
12190
// skip it
12291
if (TimestampBegin == 0)
12392
continue;
12493

12594
Events.emplace_back(
126-
EventRecord{TimestampBegin, TimestampEnd, Name, Metadata});
95+
EventRecord{TimestampBegin, TimestampEnd, Name, Detail});
12796
}
12897

12998
// There can be nested events that are very fast, for example:
@@ -163,9 +132,9 @@ std::string buildTraceGraph(StringRef Json) {
163132
Stream << "| ";
164133
}
165134
Stream.write(Event.Name.data(), Event.Name.size());
166-
if (!Event.Metadata.empty()) {
135+
if (!Event.Detail.empty()) {
167136
Stream << " (";
168-
Stream.write(Event.Metadata.data(), Event.Metadata.size());
137+
Stream.write(Event.Detail.data(), Event.Detail.size());
169138
Stream << ")";
170139
}
171140
Stream << "\n";
@@ -176,7 +145,7 @@ std::string buildTraceGraph(StringRef Json) {
176145
} // namespace
177146

178147
TEST(TimeProfilerTest, ConstantEvaluationCxx20) {
179-
std::string Code = R"(
148+
constexpr StringRef Code = R"(
180149
void print(double value);
181150
182151
namespace slow_namespace {
@@ -206,7 +175,8 @@ constexpr int slow_init_list[] = {1, 1, 2, 3, 5, 8, 13, 21}; // 25th line
206175
setupProfiler();
207176
ASSERT_TRUE(compileFromString(Code, "-std=c++20", "test.cc"));
208177
std::string Json = teardownProfiler();
209-
ASSERT_EQ(R"(
178+
std::string TraceGraph = buildTraceGraph(Json);
179+
ASSERT_TRUE(TraceGraph == R"(
210180
Frontend
211181
| ParseDeclarationOrFunctionDefinition (test.cc:2:1)
212182
| ParseDeclarationOrFunctionDefinition (test.cc:6:1)
@@ -232,54 +202,14 @@ Frontend
232202
| ParseDeclarationOrFunctionDefinition (test.cc:25:1)
233203
| | EvaluateAsInitializer (slow_init_list)
234204
| PerformPendingInstantiations
235-
)",
236-
buildTraceGraph(Json));
237-
}
238-
239-
TEST(TimeProfilerTest, TemplateInstantiations) {
240-
std::string B_H = R"(
241-
template <typename T>
242-
T fooB(T t) {
243-
return T();
244-
}
205+
)");
245206

246-
#define MacroTemp(x) template <typename T> void foo##x(T) { T(); }
247-
)";
248-
249-
std::string A_H = R"(
250-
#include "b.h"
251-
252-
MacroTemp(MTA)
253-
254-
template <typename T>
255-
void fooA(T t) { fooB(t); fooMTA(t); }
256-
)";
257-
std::string Code = R"(
258-
#include "a.h"
259-
void user() { fooA(0); }
260-
)";
261-
262-
setupProfiler();
263-
ASSERT_TRUE(compileFromString(Code, "-std=c++20", "test.cc",
264-
/*Headers=*/{{"a.h", A_H}, {"b.h", B_H}}));
265-
std::string Json = teardownProfiler();
266-
ASSERT_EQ(R"(
267-
Frontend
268-
| ParseFunctionDefinition (fooB)
269-
| ParseFunctionDefinition (fooMTA)
270-
| ParseFunctionDefinition (fooA)
271-
| ParseDeclarationOrFunctionDefinition (test.cc:3:5)
272-
| | ParseFunctionDefinition (user)
273-
| PerformPendingInstantiations
274-
| | InstantiateFunction (fooA<int>, ./a.h:7)
275-
| | | InstantiateFunction (fooB<int>, ./b.h:3)
276-
| | | InstantiateFunction (fooMTA<int>, ./a.h:4)
277-
)",
278-
buildTraceGraph(Json));
207+
// NOTE: If this test is failing, run this test with
208+
// `llvm::errs() << TraceGraph;` and change the assert above.
279209
}
280210

281211
TEST(TimeProfilerTest, ConstantEvaluationC99) {
282-
std::string Code = R"(
212+
constexpr StringRef Code = R"(
283213
struct {
284214
short quantval[4]; // 3rd line
285215
} value;
@@ -288,12 +218,15 @@ struct {
288218
setupProfiler();
289219
ASSERT_TRUE(compileFromString(Code, "-std=c99", "test.c"));
290220
std::string Json = teardownProfiler();
291-
ASSERT_EQ(R"(
221+
std::string TraceGraph = buildTraceGraph(Json);
222+
ASSERT_TRUE(TraceGraph == R"(
292223
Frontend
293224
| ParseDeclarationOrFunctionDefinition (test.c:2:1)
294225
| | isIntegerConstantExpr (<test.c:3:18>)
295226
| | EvaluateKnownConstIntCheckOverflow (<test.c:3:18>)
296227
| PerformPendingInstantiations
297-
)",
298-
buildTraceGraph(Json));
228+
)");
229+
230+
// NOTE: If this test is failing, run this test with
231+
// `llvm::errs() << TraceGraph;` and change the assert above.
299232
}

0 commit comments

Comments
 (0)