• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #define HILOG_TAG "Dwarf"
16 
17 #include "dwarf_encoding.h"
18 
19 #include "utilities.h"
20 namespace OHOS {
21 namespace Developtools {
22 namespace NativeDaemon {
DwarfEncoding(dw_encode_t dw,const unsigned char * & data,uint64_t vaddrBase,uint64_t vaddrPC,uint64_t vaddrText)23 DwarfEncoding::DwarfEncoding(dw_encode_t dw, const unsigned char *&data, uint64_t vaddrBase,
24                              uint64_t vaddrPC, uint64_t vaddrText)
25     : dw_(dw), data_(data), vaddrBase_(vaddrBase), vaddrPC_(vaddrPC), vaddrText_(vaddrText)
26 {
27     value_[0] = ReadValue(data);
28 }
29 
ToString() const30 const std::string DwarfEncoding::ToString() const
31 {
32     std::string debugString = ApplicationName() + ":" + FormatName() + " format:" + ToHex(dw_) +
33                               " value size:" + std::to_string(GetSize()) + " raw:";
34 
35     size_t size = GetSize();
36     const unsigned char *data = data_;
37     while (size-- > 0) {
38         debugString.append(ToHex(data[0]) + " ");
39         data++;
40     }
41 
42     debugString.append(" | " + ToHex(GetValue(), GetSize(), true));
43     debugString.append(" applied:" + ToHex(GetAppliedValue(), GetSize()));
44     return debugString;
45 }
46 
GetEnd() const47 const unsigned char *DwarfEncoding::GetEnd() const
48 {
49     return data_ + GetSize();
50 }
51 
GetData() const52 const unsigned char *DwarfEncoding::GetData() const
53 {
54     return data_;
55 }
56 
GetSize() const57 size_t DwarfEncoding::GetSize() const
58 {
59     return DWFormatSizeMap.at((dw_encode_t)Format());
60 }
61 
GetValue() const62 uint64_t DwarfEncoding::GetValue() const
63 {
64     return value_[0];
65 }
66 
GetAppliedValue() const67 uint64_t DwarfEncoding::GetAppliedValue() const
68 {
69     if ((Application() & DW_EH_PE_datarel) == DW_EH_PE_datarel) {
70         return value_[0] + vaddrBase_;
71     } else if ((Application() & DW_EH_PE_textrel) == DW_EH_PE_textrel) {
72         return value_[0] + vaddrText_;
73     } else if ((Application() & DW_EH_PE_pcrel) == DW_EH_PE_pcrel) {
74         return value_[0] + vaddrPC_;
75     }
76     HLOGM("Application is empty");
77 
78     return value_[0];
79 }
80 
IsOmit() const81 bool DwarfEncoding::IsOmit() const
82 {
83     return (dw_ == DW_EH_PE_omit);
84 }
85 
Format() const86 dw_encode_t DwarfEncoding::Format() const
87 {
88     return (dw_ & 0x0F);
89 }
Application() const90 dw_encode_t DwarfEncoding::Application() const
91 {
92     return (dw_ & 0xF0);
93 }
ReadValue(const unsigned char * & data) const94 uint64_t DwarfEncoding::ReadValue(const unsigned char *&data) const
95 {
96     switch (Format()) {
97         case DW_EH_PE_udata2:
98             return dwReadAnyTypeData(data, uint16_t());
99         case DW_EH_PE_udata4:
100             return dwReadAnyTypeData(data, uint32_t());
101         case DW_EH_PE_udata8:
102             return dwReadAnyTypeData(data, uint64_t());
103         case DW_EH_PE_sdata2:
104             return dwReadAnyTypeData(data, int16_t());
105         case DW_EH_PE_sdata4:
106             return dwReadAnyTypeData(data, int32_t());
107         case DW_EH_PE_sdata8:
108             return dwReadAnyTypeData(data, int64_t());
109         default:
110             return -1;
111     }
112 }
FormatName() const113 const std::string DwarfEncoding::FormatName() const
114 {
115     switch (Format()) {
116         case DW_EH_PE_absptr:
117             return "DW_EH_PE_absptr";
118         case DW_EH_PE_uleb128:
119             return "DW_EH_PE_uleb128";
120         case DW_EH_PE_udata2:
121             return "DW_EH_PE_udata2";
122         case DW_EH_PE_udata4:
123             return "DW_EH_PE_udata4";
124         case DW_EH_PE_udata8:
125             return "DW_EH_PE_udata8";
126         case DW_EH_PE_sleb128:
127             return "DW_EH_PE_sleb128";
128         case DW_EH_PE_sdata2:
129             return "DW_EH_PE_data2";
130         case DW_EH_PE_sdata4:
131             return "DW_EH_PE_sdata4";
132         case DW_EH_PE_sdata8:
133             return "DW_EH_PE_sdata8";
134         case DW_EH_PE_omit:
135             return "DW_EH_PE_omit";
136         default:
137             return "unknow format";
138     }
139 }
ApplicationName() const140 const std::string DwarfEncoding::ApplicationName() const
141 {
142     switch (Application()) {
143         case DW_EH_PE_pcrel:
144             return "DW_EH_PE_pcrel";
145         case DW_EH_PE_textrel:
146             return "DW_EH_PE_textrel";
147         case DW_EH_PE_datarel:
148             return "DW_EH_PE_datarel";
149         case DW_EH_PE_funcrel:
150             return "DW_EH_PE_funcrel";
151         case DW_EH_PE_aligned:
152             return "DW_EH_PE_aligned";
153         case DW_EH_PE_omit:
154             return "DW_EH_PE_omit";
155         case DW_EH_PE_nothing:
156             return "DW_EH_PE_empty";
157         default:
158             return "unknow format";
159     }
160 }
161 } // namespace HiPerf
162 } // namespace Developtools
163 } // namespace OHOS