annotate llvm/unittests/MC/DwarfLineTables.cpp @ 181:df311c476dd5

CreateIdentifierInfo in ParseCbC (not yet worked)
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 31 May 2020 12:30:11 +0900
parents 1d019706d866
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===- llvm/unittest/MC/DwarfLineTables.cpp ------------------------------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 #include "llvm/ADT/STLExtras.h"
anatofuz
parents:
diff changeset
10 #include "llvm/BinaryFormat/Dwarf.h"
anatofuz
parents:
diff changeset
11 #include "llvm/MC/MCAsmInfo.h"
anatofuz
parents:
diff changeset
12 #include "llvm/MC/MCContext.h"
anatofuz
parents:
diff changeset
13 #include "llvm/MC/MCDwarf.h"
anatofuz
parents:
diff changeset
14 #include "llvm/MC/MCRegisterInfo.h"
anatofuz
parents:
diff changeset
15 #include "llvm/MC/MCTargetOptions.h"
anatofuz
parents:
diff changeset
16 #include "llvm/Support/TargetRegistry.h"
anatofuz
parents:
diff changeset
17 #include "llvm/Support/TargetSelect.h"
anatofuz
parents:
diff changeset
18 #include "gtest/gtest.h"
anatofuz
parents:
diff changeset
19
anatofuz
parents:
diff changeset
20 using namespace llvm;
anatofuz
parents:
diff changeset
21
anatofuz
parents:
diff changeset
22 namespace {
anatofuz
parents:
diff changeset
23 struct Context {
anatofuz
parents:
diff changeset
24 const char *Triple = "x86_64-pc-linux";
anatofuz
parents:
diff changeset
25 std::unique_ptr<MCRegisterInfo> MRI;
anatofuz
parents:
diff changeset
26 std::unique_ptr<MCAsmInfo> MAI;
anatofuz
parents:
diff changeset
27 std::unique_ptr<MCContext> Ctx;
anatofuz
parents:
diff changeset
28
anatofuz
parents:
diff changeset
29 Context() {
anatofuz
parents:
diff changeset
30 llvm::InitializeAllTargetInfos();
anatofuz
parents:
diff changeset
31 llvm::InitializeAllTargetMCs();
anatofuz
parents:
diff changeset
32 llvm::InitializeAllDisassemblers();
anatofuz
parents:
diff changeset
33
anatofuz
parents:
diff changeset
34 // If we didn't build x86, do not run the test.
anatofuz
parents:
diff changeset
35 std::string Error;
anatofuz
parents:
diff changeset
36 const Target *TheTarget = TargetRegistry::lookupTarget(Triple, Error);
anatofuz
parents:
diff changeset
37 if (!TheTarget)
anatofuz
parents:
diff changeset
38 return;
anatofuz
parents:
diff changeset
39
anatofuz
parents:
diff changeset
40 MRI.reset(TheTarget->createMCRegInfo(Triple));
anatofuz
parents:
diff changeset
41 MCTargetOptions MCOptions;
anatofuz
parents:
diff changeset
42 MAI.reset(TheTarget->createMCAsmInfo(*MRI, Triple, MCOptions));
anatofuz
parents:
diff changeset
43 Ctx = std::make_unique<MCContext>(MAI.get(), MRI.get(), nullptr);
anatofuz
parents:
diff changeset
44 }
anatofuz
parents:
diff changeset
45
anatofuz
parents:
diff changeset
46 operator bool() { return Ctx.get(); }
anatofuz
parents:
diff changeset
47 operator MCContext &() { return *Ctx; };
anatofuz
parents:
diff changeset
48 };
anatofuz
parents:
diff changeset
49
anatofuz
parents:
diff changeset
50 Context &getContext() {
anatofuz
parents:
diff changeset
51 static Context Ctxt;
anatofuz
parents:
diff changeset
52 return Ctxt;
anatofuz
parents:
diff changeset
53 }
anatofuz
parents:
diff changeset
54 }
anatofuz
parents:
diff changeset
55
anatofuz
parents:
diff changeset
56 void verifyEncoding(MCDwarfLineTableParams Params, int LineDelta, int AddrDelta,
anatofuz
parents:
diff changeset
57 ArrayRef<uint8_t> ExpectedEncoding) {
anatofuz
parents:
diff changeset
58 SmallString<16> Buffer;
anatofuz
parents:
diff changeset
59 raw_svector_ostream EncodingOS(Buffer);
anatofuz
parents:
diff changeset
60 MCDwarfLineAddr::Encode(getContext(), Params, LineDelta, AddrDelta,
anatofuz
parents:
diff changeset
61 EncodingOS);
anatofuz
parents:
diff changeset
62 EXPECT_EQ(ExpectedEncoding, arrayRefFromStringRef(Buffer));
anatofuz
parents:
diff changeset
63 }
anatofuz
parents:
diff changeset
64
anatofuz
parents:
diff changeset
65 TEST(DwarfLineTables, TestDefaultParams) {
anatofuz
parents:
diff changeset
66 if (!getContext())
anatofuz
parents:
diff changeset
67 return;
anatofuz
parents:
diff changeset
68
anatofuz
parents:
diff changeset
69 MCDwarfLineTableParams Params;
anatofuz
parents:
diff changeset
70
anatofuz
parents:
diff changeset
71 // Minimal line offset expressible through extended opcode, 0 addr delta
anatofuz
parents:
diff changeset
72 const uint8_t Encoding0[] = {13}; // Special opcode Addr += 0, Line += -5
anatofuz
parents:
diff changeset
73 verifyEncoding(Params, -5, 0, Encoding0);
anatofuz
parents:
diff changeset
74
anatofuz
parents:
diff changeset
75 // Maximal line offset expressible through extended opcode,
anatofuz
parents:
diff changeset
76 const uint8_t Encoding1[] = {26}; // Special opcode Addr += 0, Line += +8
anatofuz
parents:
diff changeset
77 verifyEncoding(Params, 8, 0, Encoding1);
anatofuz
parents:
diff changeset
78
anatofuz
parents:
diff changeset
79 // Random value in the middle of the special ocode range
anatofuz
parents:
diff changeset
80 const uint8_t Encoding2[] = {146}; // Special opcode Addr += 9, Line += 2
anatofuz
parents:
diff changeset
81 verifyEncoding(Params, 2, 9, Encoding2);
anatofuz
parents:
diff changeset
82
anatofuz
parents:
diff changeset
83 // Minimal line offset expressible through extended opcode, max addr delta
anatofuz
parents:
diff changeset
84 const uint8_t Encoding3[] = {251}; // Special opcode Addr += 17, Line += -5
anatofuz
parents:
diff changeset
85 verifyEncoding(Params, -5, 17, Encoding3);
anatofuz
parents:
diff changeset
86
anatofuz
parents:
diff changeset
87 // Biggest special opcode
anatofuz
parents:
diff changeset
88 const uint8_t Encoding4[] = {255}; // Special opcode Addr += 17, Line += -1
anatofuz
parents:
diff changeset
89 verifyEncoding(Params, -1, 17, Encoding4);
anatofuz
parents:
diff changeset
90
anatofuz
parents:
diff changeset
91 // Line delta outside of the special opcode range, address delta in range
anatofuz
parents:
diff changeset
92 const uint8_t Encoding5[] = {dwarf::DW_LNS_advance_line, 9,
anatofuz
parents:
diff changeset
93 158}; // Special opcode Addr += 10, Line += 0
anatofuz
parents:
diff changeset
94 verifyEncoding(Params, 9, 10, Encoding5);
anatofuz
parents:
diff changeset
95
anatofuz
parents:
diff changeset
96 // Address delta outside of the special opcode range, but small
anatofuz
parents:
diff changeset
97 // enough to do DW_LNS_const_add_pc + special opcode.
anatofuz
parents:
diff changeset
98 const uint8_t Encoding6[] = {dwarf::DW_LNS_const_add_pc, // pc += 17
anatofuz
parents:
diff changeset
99 62}; // Special opcode Addr += 3, Line += 2
anatofuz
parents:
diff changeset
100 verifyEncoding(Params, 2, 20, Encoding6);
anatofuz
parents:
diff changeset
101
anatofuz
parents:
diff changeset
102 // Address delta big enough to require the use of DW_LNS_advance_pc
anatofuz
parents:
diff changeset
103 // Line delta in special opcode range
anatofuz
parents:
diff changeset
104 const uint8_t Encoding7[] = {dwarf::DW_LNS_advance_pc, 100,
anatofuz
parents:
diff changeset
105 20}; // Special opcode Addr += 0, Line += 2
anatofuz
parents:
diff changeset
106 verifyEncoding(Params, 2, 100, Encoding7);
anatofuz
parents:
diff changeset
107
anatofuz
parents:
diff changeset
108 // No special opcode possible.
anatofuz
parents:
diff changeset
109 const uint8_t Encoding8[] = {dwarf::DW_LNS_advance_line, 20,
anatofuz
parents:
diff changeset
110 dwarf::DW_LNS_advance_pc, 100,
anatofuz
parents:
diff changeset
111 dwarf::DW_LNS_copy};
anatofuz
parents:
diff changeset
112 verifyEncoding(Params, 20, 100, Encoding8);
anatofuz
parents:
diff changeset
113 }
anatofuz
parents:
diff changeset
114
anatofuz
parents:
diff changeset
115 TEST(DwarfLineTables, TestCustomParams) {
anatofuz
parents:
diff changeset
116 if (!getContext())
anatofuz
parents:
diff changeset
117 return;
anatofuz
parents:
diff changeset
118
anatofuz
parents:
diff changeset
119 // Some tests against the example values given in the standard.
anatofuz
parents:
diff changeset
120 MCDwarfLineTableParams Params;
anatofuz
parents:
diff changeset
121 Params.DWARF2LineOpcodeBase = 13;
anatofuz
parents:
diff changeset
122 Params.DWARF2LineBase = -3;
anatofuz
parents:
diff changeset
123 Params.DWARF2LineRange = 12;
anatofuz
parents:
diff changeset
124
anatofuz
parents:
diff changeset
125 // Minimal line offset expressible through extended opcode, 0 addr delta
anatofuz
parents:
diff changeset
126 const uint8_t Encoding0[] = {13}; // Special opcode Addr += 0, Line += -5
anatofuz
parents:
diff changeset
127 verifyEncoding(Params, -3, 0, Encoding0);
anatofuz
parents:
diff changeset
128
anatofuz
parents:
diff changeset
129 // Maximal line offset expressible through extended opcode,
anatofuz
parents:
diff changeset
130 const uint8_t Encoding1[] = {24}; // Special opcode Addr += 0, Line += +8
anatofuz
parents:
diff changeset
131 verifyEncoding(Params, 8, 0, Encoding1);
anatofuz
parents:
diff changeset
132
anatofuz
parents:
diff changeset
133 // Random value in the middle of the special ocode range
anatofuz
parents:
diff changeset
134 const uint8_t Encoding2[] = {126}; // Special opcode Addr += 9, Line += 2
anatofuz
parents:
diff changeset
135 verifyEncoding(Params, 2, 9, Encoding2);
anatofuz
parents:
diff changeset
136
anatofuz
parents:
diff changeset
137 // Minimal line offset expressible through extended opcode, max addr delta
anatofuz
parents:
diff changeset
138 const uint8_t Encoding3[] = {253}; // Special opcode Addr += 20, Line += -3
anatofuz
parents:
diff changeset
139 verifyEncoding(Params, -3, 20, Encoding3);
anatofuz
parents:
diff changeset
140
anatofuz
parents:
diff changeset
141 // Biggest special opcode
anatofuz
parents:
diff changeset
142 const uint8_t Encoding4[] = {255}; // Special opcode Addr += 17, Line += -1
anatofuz
parents:
diff changeset
143 verifyEncoding(Params, -1, 20, Encoding4);
anatofuz
parents:
diff changeset
144
anatofuz
parents:
diff changeset
145 // Line delta outside of the special opcode range, address delta in range
anatofuz
parents:
diff changeset
146 const uint8_t Encoding5[] = {dwarf::DW_LNS_advance_line, 9,
anatofuz
parents:
diff changeset
147 136}; // Special opcode Addr += 10, Line += 0
anatofuz
parents:
diff changeset
148 verifyEncoding(Params, 9, 10, Encoding5);
anatofuz
parents:
diff changeset
149
anatofuz
parents:
diff changeset
150 // Address delta outside of the special opcode range, but small
anatofuz
parents:
diff changeset
151 // enough to do DW_LNS_const_add_pc + special opcode.
anatofuz
parents:
diff changeset
152 const uint8_t Encoding6[] = {dwarf::DW_LNS_const_add_pc, // pc += 20
anatofuz
parents:
diff changeset
153 138}; // Special opcode Addr += 10, Line += 2
anatofuz
parents:
diff changeset
154 verifyEncoding(Params, 2, 30, Encoding6);
anatofuz
parents:
diff changeset
155
anatofuz
parents:
diff changeset
156 // Address delta big enough to require the use of DW_LNS_advance_pc
anatofuz
parents:
diff changeset
157 // Line delta in special opcode range
anatofuz
parents:
diff changeset
158 const uint8_t Encoding7[] = {dwarf::DW_LNS_advance_pc, 100,
anatofuz
parents:
diff changeset
159 18}; // Special opcode Addr += 0, Line += 2
anatofuz
parents:
diff changeset
160 verifyEncoding(Params, 2, 100, Encoding7);
anatofuz
parents:
diff changeset
161
anatofuz
parents:
diff changeset
162 // No special opcode possible.
anatofuz
parents:
diff changeset
163 const uint8_t Encoding8[] = {dwarf::DW_LNS_advance_line, 20,
anatofuz
parents:
diff changeset
164 dwarf::DW_LNS_advance_pc, 100,
anatofuz
parents:
diff changeset
165 dwarf::DW_LNS_copy};
anatofuz
parents:
diff changeset
166 verifyEncoding(Params, 20, 100, Encoding8);
anatofuz
parents:
diff changeset
167 }
anatofuz
parents:
diff changeset
168
anatofuz
parents:
diff changeset
169 TEST(DwarfLineTables, TestCustomParams2) {
anatofuz
parents:
diff changeset
170 if (!getContext())
anatofuz
parents:
diff changeset
171 return;
anatofuz
parents:
diff changeset
172
anatofuz
parents:
diff changeset
173 // Corner case param values.
anatofuz
parents:
diff changeset
174 MCDwarfLineTableParams Params;
anatofuz
parents:
diff changeset
175 Params.DWARF2LineOpcodeBase = 13;
anatofuz
parents:
diff changeset
176 Params.DWARF2LineBase = 1;
anatofuz
parents:
diff changeset
177 Params.DWARF2LineRange = 255;
anatofuz
parents:
diff changeset
178
anatofuz
parents:
diff changeset
179 const uint8_t Encoding0[] = {dwarf::DW_LNS_advance_line, 248, 1,
anatofuz
parents:
diff changeset
180 dwarf::DW_LNS_copy};
anatofuz
parents:
diff changeset
181 verifyEncoding(Params, 248, 0, Encoding0);
anatofuz
parents:
diff changeset
182 }