llvm.org GIT mirror llvm / 2b5cea5
[XRay] Add TSC to NewCPUId Records Summary: This more correctly reflects the data written by the FDR mode runtime. This is a continuation of the work in D50441. Reviewers: mboerger, eizan Subscribers: hiraditya, llvm-commits Differential Revision: https://reviews.llvm.org/D51911 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341905 91177308-0d34-0410-b5e6-96231b3b80d8 Dean Michael Berris 1 year, 8 months ago
11 changed file(s) with 36 addition(s) and 26 deletion(s). Raw diff Collapse all Expand all
118118
119119 class NewCPUIDRecord : public MetadataRecord {
120120 uint16_t CPUId = 0;
121 uint64_t TSC = 0;
121122 friend class RecordInitializer;
122123
123124 public:
124125 NewCPUIDRecord() = default;
125 explicit NewCPUIDRecord(uint16_t C) : MetadataRecord(), CPUId(C) {}
126 NewCPUIDRecord(uint16_t C, uint64_t T) : MetadataRecord(), CPUId(C), TSC(T) {}
126127
127128 MetadataType metadataType() const override { return MetadataType::NewCPUId; }
128129
129130 uint16_t cpuid() const { return CPUId; }
131
132 uint64_t tsc() const { return TSC; }
130133
131134 Error apply(RecordVisitor &V) override;
132135 };
6060 return createStringError(std::make_error_code(std::errc::bad_address),
6161 "Invalid offset for a new cpu id record (%d).",
6262 OffsetPtr);
63 auto BeginOffset = OffsetPtr;
6364 auto PreReadOffset = OffsetPtr;
6465 R.CPUId = E.getU16(&OffsetPtr);
6566 if (OffsetPtr == PreReadOffset)
6667 return createStringError(std::make_error_code(std::errc::bad_message),
6768 "Cannot read CPU id at offset %d.", OffsetPtr);
6869
69 OffsetPtr += MetadataRecord::kMetadataBodySize - (OffsetPtr - PreReadOffset);
70 PreReadOffset = OffsetPtr;
71 R.TSC = E.getU64(&OffsetPtr);
72 if (OffsetPtr == PreReadOffset)
73 return createStringError(std::make_error_code(std::errc::bad_message),
74 "Cannot read CPU TSC at offset %d.", OffsetPtr);
75
76 OffsetPtr += MetadataRecord::kMetadataBodySize - (OffsetPtr - BeginOffset);
7077 return Error::success();
7178 }
7279
2424 }
2525
2626 Error RecordPrinter::visit(NewCPUIDRecord &R) {
27 OS << formatv(" ID: {0}>", R.cpuid()) << Delim;
27 OS << formatv(": id = {0}, tsc = {1}>", R.cpuid(), R.tsc()) << Delim;
2828 return Error::success();
2929 }
3030
77 ; CHECK-NEXT:
88 ; CHECK-EMPTY:
99 ; CHECK-NEXT: Body:
10 ; CHECK-NEXT:
11 ; CHECK-NEXT: ID: 6>
10 ; CHECK-NEXT: : id = 6, tsc = 2034042117104344>
11 ; CHECK-NEXT:
1212 ; CHECK-NEXT:
1313 ; CHECK-EMPTY:
1414 ; CHECK-NEXT: -
55 ; CHECK-NEXT:
66 ; CHECK-EMPTY:
77 ; CHECK-NEXT: Body:
8 ; CHECK-NEXT: ID: 49>
8 ; CHECK-NEXT: : id = 49, tsc = 18828908666540172>
99 ; CHECK-NEXT:
1010 ; CHECK-EMPTY:
1111 ; CHECK-NEXT: -
2929 .add(1)
3030 .add(1, 2)
3131 .add(1)
32 .add(1)
32 .add(1, 2)
3333 .add(RecordTypes::ENTER, 1, 1)
3434 .add(RecordTypes::EXIT, 1, 100)
3535 .consume();
3838 .add(1)
3939 .add(1, 2)
4040 .add(1)
41 .add(1)
41 .add(1, 2)
4242 .add(RecordTypes::ENTER, 1, 1)
4343 .add(RecordTypes::EXIT, 1, 100)
4444 .consume();
4747 .add(2)
4848 .add(1, 2)
4949 .add(1)
50 .add(2)
50 .add(2, 2)
5151 .add(RecordTypes::ENTER, 1, 1)
5252 .add(RecordTypes::EXIT, 1, 100)
5353 .consume();
2727 .add(1)
2828 .add(1, 2)
2929 .add(1)
30 .add(1)
30 .add(1, 2)
3131 .add(RecordTypes::ENTER, 1, 1)
3232 .add(RecordTypes::EXIT, 1, 100)
3333 .consume();
3636 .add(1)
3737 .add(1, 2)
3838 .add(1)
39 .add(1)
39 .add(1, 2)
4040 .add(RecordTypes::ENTER, 1, 1)
4141 .add(RecordTypes::EXIT, 1, 100)
4242 .consume();
4545 .add(2)
4646 .add(1, 2)
4747 .add(1)
48 .add(2)
48 .add(2, 2)
4949 .add(RecordTypes::ENTER, 1, 1)
5050 .add(RecordTypes::EXIT, 1, 100)
5151 .consume();
7474 .add(20)
7575 .add(1)
7676 .add(1, 2)
77 .add(1)
77 .add(1, 2)
7878 .add(RecordTypes::ENTER, 1, 1)
7979 .add(RecordTypes::EXIT, 1, 100)
8080 .consume();
8888 auto Block = LogBuilder()
8989 .add(1)
9090 .add(1, 2)
91 .add(1)
91 .add(1, 2)
9292 .add(RecordTypes::ENTER, 1, 1)
9393 .add(RecordTypes::EXIT, 1, 100)
9494 .consume();
102102 auto Block = LogBuilder()
103103 .add(1)
104104 .add(1, 2)
105 .add(1)
105 .add(1, 2)
106106 .add()
107107 .add(RecordTypes::ENTER, 1, 1)
108108 .add(RecordTypes::EXIT, 1, 100)
117117 auto Block = LogBuilder()
118118 .add(1)
119119 .add(1, 2)
120 .add(1)
120 .add(1, 2)
121121 .add(RecordTypes::ENTER, 1, 1)
122122 .add(RecordTypes::EXIT, 1, 100)
123123 .add(2)
4141 }
4242
4343 template <> std::unique_ptr MakeRecord() {
44 return make_unique(1);
44 return make_unique(1, 2);
4545 }
4646
4747 template <> std::unique_ptr MakeRecord() {
3838
3939 template <> struct Helper {
4040 static std::unique_ptr construct() {
41 return make_unique(1);
41 return make_unique(1, 2);
4242 }
4343
44 static const char *expected() { return " ID: 1>"; }
44 static const char *expected() { return ": id = 1, tsc = 2>"; }
4545 };
4646
4747 template <> struct Helper {
7474 .add(1)
7575 .add(1, 1)
7676 .add(1)
77 .add(1)
77 .add(1, 2)
7878 .consume();
7979 BlockVerifier Verifier;
8080 for (auto &R : Block)
8888 .add(1)
8989 .add(1, 1)
9090 .add(1)
91 .add(1)
91 .add(1, 2)
9292 .add(RecordTypes::ENTER, 1, 1)
9393 .add(RecordTypes::EXIT, 1, 100)
9494 .consume();
9797 .add(1)
9898 .add(1, 1)
9999 .add(1)
100 .add(1)
100 .add(1, 2)
101101 .add(RecordTypes::ENTER, 1, 1)
102102 .add(RecordTypes::EXIT, 1, 100)
103103 .consume();
106106 .add(1)
107107 .add(1, 1)
108108 .add(1)
109 .add(1)
109 .add(1, 2)
110110 .add(RecordTypes::ENTER, 1, 1)
111111 .add(RecordTypes::EXIT, 1, 100)
112112 .consume();
4646 .add(1)
4747 .add(1, 1)
4848 .add(1)
49 .add(1)
49 .add(1, 2)
5050 .add(RecordTypes::ENTER, 1, 1)
5151 .add(RecordTypes::EXIT, 1, 100)
5252 .consume();
9191 .add(64)
9292 .add(1)
9393 .add(1, 1)
94 .add(1)
94 .add(1, 2)
9595 .add(RecordTypes::ENTER, 1, 1)
9696 .add(RecordTypes::EXIT, 1, 100)
9797 .consume();
142142 auto L = LogBuilder()
143143 .add(1)
144144 .add(1, 1)
145 .add(1)
145 .add(1, 2)
146146 .add(RecordTypes::ENTER, 1, 1)
147147 .add(RecordTypes::EXIT, 1, 100)
148148 .add()