@@ -25,7 +25,6 @@ using gpreg = long;
2525
2626using gpreg = unsigned long long ;
2727
28-
2928#elif defined( __ARM_ARCH )
3029#ifdef __aarch64__
3130using gpreg = unsigned long long ;
@@ -110,8 +109,8 @@ struct CoreRegisters {
110109#elif defined(__i386__)
111110 user_fpxregs_struct fpx;
112111#endif
113- RegisterValue getDwarf (int reg) const ;
114- void setDwarf (int reg, const RegisterValue &val);
112+ inline RegisterValue getDwarf (int reg) const ;
113+ template < typename RV> void setDwarf (int reg, const RV &val);
115114};
116115
117116// Maps a name to its dwarf register index.
@@ -120,7 +119,6 @@ using DwarfNames = std::vector<std::pair<int, std::string_view>>;
120119// Sets of registers for an architecture. Each architecture supports at least
121120// "general" registers.
122121using ArchRegs = std::unordered_map<std::string_view, DwarfNames>;
123- extern const ArchRegs registers;
124122
125123#ifndef __aarch64__
126124void gregset2user (user_regs_struct &core, const gregset_t greg);
@@ -141,45 +139,75 @@ inline void regop(Set, T ®, const T &val) { reg = val; }
141139template <typename T>
142140inline void regop (Get, const T ®, T &val) { val = reg; }
143141
144- template <typename T> void regop (Set, T ®, const RegisterValue &val) {
145- regop (Set{}, reg, std::get<T>(val));
142+ template <typename T, typename RV> void regop (Set, T ®, const RV &rv) {
143+ const T branch = get<T>(rv);
144+ regop (Set{}, reg, branch);
146145}
147- template <typename T> void regop (Get, const T ®, RegisterValue &val) {
146+ template <typename T, typename RV > void regop (Get, const T ®, RV &val) {
148147 T newval;
149148 regop (Get{}, reg, newval);
150149 val = newval;
151150}
152151
153- inline void regop (Set, Simd128 &simd, const RegisterValue &v) {
154- std::memcpy ((void *)&simd, (void *)&std::get<Simd128>(v), sizeof simd);
152+ template <typename RV>
153+ inline void regop (Set, Simd128 &simd, const RV &v) {
154+ Simd128 value = get<Simd128>(v);
155+ std::memcpy ((void *)&simd, (void *)&value, sizeof simd);
155156}
156157
157- inline void regop (Get, const Simd128 &simd, RegisterValue &v) {
158+ template <typename RV>
159+ inline void regop (Get, const Simd128 &simd, RV &v) {
158160 v = Simd128{};
159- std::memcpy ((void *)&std:: get<Simd128>(v), (void *)&simd, sizeof simd);
161+ std::memcpy ((void *)&get<Simd128>(v), (void *)&simd, sizeof simd);
160162}
161163
162- inline void regop (Set, i387Float &simd, const RegisterValue &v) {
163- std::memcpy ((void *)&simd, (void *)&std::get<i387Float>(v), sizeof simd);
164+ template <typename RV>
165+ inline void regop (Set, i387Float &simd, const RV &v) {
166+ auto fp = get<i387Float>( v );
167+ std::memcpy ((void *)&simd, (void *)&fp, sizeof simd);
164168}
165169
166- inline void regop (Get, const i387Float &simd, RegisterValue &v) {
170+ template <typename RV>
171+ inline void regop (Get, const i387Float &simd, RV &v) {
167172 v = i387Float{};
168- std::memcpy ((void *)&std:: get<i387Float>(v), (void *)&simd, sizeof simd);
173+ std::memcpy ((void *)&get<i387Float>(v), (void *)&simd, sizeof simd);
169174}
170175
171176
172- inline void regop (Set, Simd64 &simd, const RegisterValue &v) {
173- std::memcpy ((void *)&simd, (void *)&std::get<Simd64>(v), sizeof simd);
177+ template <typename RV>
178+ inline void regop (Set, Simd64 &simd, const RV &v) {
179+ auto branch = get<Simd64>(v);
180+ std::memcpy ((void *)&simd, (void *)&branch, sizeof simd);
174181}
175182
176- inline void regop (Get, const Simd64 &simd, RegisterValue &v) {
183+ template <typename RV>
184+ inline void regop (Get, const Simd64 &simd, RV &v) {
177185 v = Simd64{};
178- std::memcpy ((void *)&std::get<Simd64>(v), (void *)&simd, sizeof simd);
186+ std::memcpy ((void *)&get<Simd64>(v), (void *)&simd, sizeof simd);
187+ }
188+
179189}
180190
191+ #ifdef __x86_64__
192+ #include " libpstack/arch-x86_64.h"
193+ #endif
194+ #ifdef __aarch64__
195+ #include " libpstack/arch-aarch64.h"
196+ #endif
197+ #ifdef __i386__
198+ #include " libpstack/arch-i386.h"
199+ #endif
181200
201+ namespace pstack ::Procman {
202+ template <typename RV> void CoreRegisters::setDwarf (int regId, const RV &value) {
203+ opReg (*this , Set{}, regId, value );
204+ };
182205
206+ RegisterValue CoreRegisters::getDwarf (int regId) const {
207+ RegisterValue value;
208+ opReg (*this , Get{}, regId, value);
209+ return value;
210+ };
183211
184212}
185213#endif
0 commit comments