CLRX  1
An unofficial OpenCL extensions designed for Radeon GPUs
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
Disassembler.h
Go to the documentation of this file.
1 /*
2  * CLRadeonExtender - Unofficial OpenCL Radeon Extensions Library
3  * Copyright (C) 2014-2016 Mateusz Szpakowski
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18  */
23 #ifndef __CLRX_DISASSEMBLER_H__
24 #define __CLRX_DISASSEMBLER_H__
25 
26 #include <CLRX/Config.h>
27 #include <string>
28 #include <istream>
29 #include <ostream>
30 #include <vector>
31 #include <utility>
32 #include <memory>
36 #include <CLRX/amdbin/AmdBinGen.h>
37 #include <CLRX/amdasm/Commons.h>
38 #include <CLRX/utils/Utilities.h>
39 #include <CLRX/utils/InputOutput.h>
40 
42 namespace CLRX
43 {
44 
45 class Disassembler;
46 
47 enum: Flags
48 {
55  DISASM_SETUP = 64,
56  DISASM_CONFIG = 128,
57  DISASM_ALL = FLAGS_ALL&~DISASM_CONFIG
58 };
59 
62 {
63 protected:
65  struct Relocation
66  {
67  size_t symbol;
69  int64_t addend;
70  };
71 
72  typedef std::vector<size_t>::const_iterator LabelIter;
73 
75  typedef std::vector<std::pair<size_t, Relocation> >::const_iterator RelocIter;
76 
78  typedef std::vector<std::pair<size_t, CString> >::const_iterator NamedLabelIter;
79 
81  size_t inputSize;
82  const cxbyte* input;
83  std::vector<size_t> labels;
84  std::vector<std::pair<size_t, CString> > namedLabels;
85  std::vector<CString> relSymbols;
86  std::vector<std::pair<size_t, Relocation> > relocations;
88 
90  explicit ISADisassembler(Disassembler& disassembler, cxuint outBufSize = 500);
91 
93  void writeLabelsToPosition(size_t pos, LabelIter& labelIter,
94  NamedLabelIter& namedLabelIter);
96  void writeLabelsToEnd(size_t start, LabelIter labelIter, NamedLabelIter namedLabelIter);
98  void writeLocation(size_t pos);
100  bool writeRelocation(size_t pos, RelocIter& relocIter);
101 public:
102  virtual ~ISADisassembler();
103 
105  void setInput(size_t inputSize, const cxbyte* input)
106  {
107  this->inputSize = inputSize;
108  this->input = input;
109  }
110 
112  virtual void beforeDisassemble() = 0;
114  virtual void disassemble() = 0;
115 
117  void addNamedLabel(size_t pos, const CString& name)
118  { namedLabels.push_back(std::make_pair(pos, name)); }
120  void addNamedLabel(size_t pos, CString&& name)
121  { namedLabels.push_back(std::make_pair(pos, name)); }
122 
124  size_t addRelSymbol(const CString& symName)
125  {
126  size_t index = relSymbols.size();
127  relSymbols.push_back(symName);
128  return index;
129  }
131  void addRelocation(size_t offset, RelocType type, size_t symIndex, int64_t addend)
132  { relocations.push_back(std::make_pair(offset, Relocation{symIndex, type, addend})); }
135  {
136  relSymbols.clear();
137  relocations.clear();
138  }
139 };
140 
141 struct GCNDisasmUtils;
142 
145 {
146 private:
147  bool instrOutOfCode;
148 
149  friend struct GCNDisasmUtils; // INTERNAL LOGIC
150 public:
155 
157  void beforeDisassemble();
159  void disassemble();
160 };
161 
163 
166 {
168  size_t metadataSize;
169  const char* metadata;
170  size_t headerSize;
171  const cxbyte* header;
172  std::vector<CALNoteInput> calNotes;
173  size_t dataSize;
174  const cxbyte* data;
175  size_t codeSize;
176  const cxbyte* code;
177 };
178 
180 
183 {
185  bool is64BitMode;
188  size_t globalDataSize;
189  const cxbyte* globalData;
190  std::vector<AmdDisasmKernelInput> kernels;
191 };
192 
195 {
196  size_t offset;
198  cxuint symbol;
199  int64_t addend;
200 };
201 
203 
206 {
208  size_t metadataSize;
209  const cxbyte* metadata;
211  const cxbyte* isaMetadata;
212  size_t setupSize;
213  const cxbyte* setup;
214  size_t stubSize;
215  const cxbyte* stub;
216  std::vector<AmdCL2RelaEntry> textRelocs;
217  size_t codeSize;
218  const cxbyte* code;
219 };
220 
222 
225 {
227  cxuint driverVersion;
230  size_t globalDataSize;
231  const cxbyte* globalData;
232  size_t rwDataSize;
233  const cxbyte* rwData;
234  size_t bssAlignment;
235  size_t bssSize;
237  const cxbyte* samplerInit;
238 
240  std::vector<std::pair<size_t, size_t> > samplerRelocs;
241  std::vector<AmdCL2DisasmKernelInput> kernels;
242 };
243 
244 
247 {
249  bool is64BitMode;
250  size_t globalDataSize;
251  const cxbyte* globalData;
252  std::vector<GalliumDisasmKernelInput> kernels;
253  size_t codeSize;
254  const cxbyte* code;
255 };
256 
259 {
261  size_t codeSize;
262  const cxbyte* code;
263 };
264 
267 {
268 private:
269  friend class ISADisassembler;
270  std::unique_ptr<ISADisassembler> isaDisassembler;
271  bool fromBinary;
272  BinaryFormat binaryFormat;
273  union {
274  const AmdDisasmInput* amdInput;
275  const AmdCL2DisasmInput* amdCL2Input;
276  const GalliumDisasmInput* galliumInput;
277  const RawCodeInput* rawInput;
278  };
279  std::ostream& output;
280  Flags flags;
281  size_t sectionCount;
282 public:
284 
289  Disassembler(const AmdMainGPUBinary32& binary, std::ostream& output,
290  Flags flags = 0);
292 
297  Disassembler(const AmdMainGPUBinary64& binary, std::ostream& output,
298  Flags flags = 0);
300 
305  Disassembler(const AmdCL2MainGPUBinary& binary, std::ostream& output,
306  Flags flags = 0);
308 
313  Disassembler(const AmdDisasmInput* disasmInput, std::ostream& output,
314  Flags flags = 0);
316 
321  Disassembler(const AmdCL2DisasmInput* disasmInput, std::ostream& output,
322  Flags flags = 0);
323 
325 
331  Disassembler(GPUDeviceType deviceType, const GalliumBinary& binary,
332  std::ostream& output, Flags flags = 0);
333 
335 
340  Disassembler(const GalliumDisasmInput* disasmInput, std::ostream& output,
341  Flags flags = 0);
342 
344  Disassembler(GPUDeviceType deviceType, size_t rawCodeSize, const cxbyte* rawCode,
345  std::ostream& output, Flags flags = 0);
346 
347  ~Disassembler();
348 
350  void disassemble();
351 
353  Flags getFlags() const
354  { return flags; }
356  void setFlags(Flags flags)
357  { this->flags = flags; }
358 
361 
364  { return amdInput; }
365 
368  { return amdCL2Input; }
369 
372  { return galliumInput; }
373 
375  const std::ostream& getOutput() const
376  { return output; }
378  std::ostream& getOutput()
379  { return output; }
380 };
381 
382 };
383 
384 #endif
Disassembler(const AmdMainGPUBinary32 &binary, std::ostream &output, Flags flags=0)
constructor for 32-bit GPU binary
~GCNDisassembler()
destructor
common definitions for assembler and disassembler
size_t metadataSize
metadata size
Definition: Disassembler.h:208
dump datas
Definition: Disassembler.h:51
const cxbyte * code
code
Definition: Disassembler.h:254
non copyable and non movable base structure (class)
Definition: Utilities.h:43
const cxbyte * header
kernel header size
Definition: Disassembler.h:171
size_t rwDataSize
global rw data size
Definition: Disassembler.h:232
void beforeDisassemble()
routine called before main disassemblying
int64_t addend
relocation addend
Definition: Disassembler.h:69
main class for
Definition: Disassembler.h:61
uint32_t Flags
type for declaring various flags
Definition: Utilities.h:97
void disassemble()
disassembles input
internal relocation structure
Definition: Disassembler.h:65
dump code
Definition: Disassembler.h:49
size_t isaMetadataSize
metadata size
Definition: Disassembler.h:210
size_t dataSize
data (from inner binary) size
Definition: Disassembler.h:173
void setInput(size_t inputSize, const cxbyte *input)
set input code
Definition: Disassembler.h:105
fast and direct output buffer
Definition: InputOutput.h:350
size_t offset
offset
Definition: Disassembler.h:196
BinaryFormat
binary for Disassembler
Definition: Commons.h:33
FastOutputBuffer output
output buffer
Definition: Disassembler.h:87
const cxbyte * code
code
Definition: Disassembler.h:262
size_t setupSize
data (from inner binary) size
Definition: Disassembler.h:212
AMD OpenCL 2.0 binaries handling.
size_t codeSize
code size
Definition: Disassembler.h:253
void writeLabelsToPosition(size_t pos, LabelIter &labelIter, NamedLabelIter &namedLabelIter)
write all labels before specified position
CString driverInfo
driver info (for AMD Catalyst drivers)
Definition: Disassembler.h:186
size_t globalDataSize
global (constants for kernels) data size
Definition: Disassembler.h:188
CString aclVersionString
acl version string
Definition: Disassembler.h:229
const cxbyte * data
data from inner binary
Definition: Disassembler.h:174
void clearRelocations()
clear all relocations
Definition: Disassembler.h:134
void writeLabelsToEnd(size_t start, LabelIter labelIter, NamedLabelIter namedLabelIter)
write all labels to end
void addNamedLabel(size_t pos, CString &&name)
add named label to list (must be called before disassembly)
Definition: Disassembler.h:120
void setFlags(Flags flags)
get disassemblers flags
Definition: Disassembler.h:356
std::vector< CString > relSymbols
symbols used by relocations
Definition: Disassembler.h:85
RelocType type
relocation type
Definition: Disassembler.h:68
const AmdCL2DisasmInput * getAmdCL2Input() const
get disassembler input
Definition: Disassembler.h:367
void addNamedLabel(size_t pos, const CString &name)
add named label to list (must be called before disassembly)
Definition: Disassembler.h:117
const char * metadata
kernel's metadata
Definition: Disassembler.h:169
GCN architectur dissassembler.
Definition: Disassembler.h:144
const cxbyte * globalData
global (constants for kernels) data
Definition: Disassembler.h:231
size_t bssSize
size of global bss section
Definition: Disassembler.h:235
std::vector< GalliumDisasmKernelInput > kernels
list of input kernels
Definition: Disassembler.h:252
std::vector< size_t >::const_iterator LabelIter
label iterator
Definition: Disassembler.h:72
std::vector< std::pair< size_t, size_t > > samplerRelocs
sampler relocations
Definition: Disassembler.h:240
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:260
whole disassembler input (for Gallium driver GPU binaries)
Definition: Disassembler.h:246
whole disassembler input (for AMD Catalyst driver GPU binaries)
Definition: Disassembler.h:182
Definition: GalliumBinaries.h:235
std::vector< size_t > labels
list of local labels
Definition: Disassembler.h:83
CString kernelName
kernel name
Definition: Disassembler.h:207
std::vector< std::pair< size_t, Relocation > > relocations
relocations
Definition: Disassembler.h:86
virtual void beforeDisassemble()=0
makes some things before disassemblying
virtual void disassemble()=0
disassembles input code
cxuint RelocType
relocation type
Definition: Commons.h:32
const cxbyte * rwData
global rw data data
Definition: Disassembler.h:233
const cxbyte * metadata
kernel's metadata
Definition: Disassembler.h:209
std::vector< CALNoteInput > calNotes
ATI CAL notes.
Definition: Disassembler.h:172
size_t inputSize
size of input
Definition: Disassembler.h:81
const cxbyte * stub
data from inner binary
Definition: Disassembler.h:215
const cxbyte * globalData
global (constants for kernels) data
Definition: Disassembler.h:189
const cxbyte * isaMetadata
kernel's metadata
Definition: Disassembler.h:211
AMD OpenCL 2.0 main binary for GPU for 64-bit mode.
Definition: AmdCL2Binaries.h:314
bool is64BitMode
true if 64-bit mode of addressing
Definition: Disassembler.h:185
CString compileOptions
compile options which used by in clBuildProgram
Definition: Disassembler.h:228
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:226
size_t metadataSize
metadata size
Definition: Disassembler.h:168
GalliumCompute binaries handling (only with LLVM 3.6)
input output utilities
const AmdDisasmInput * getAmdInput() const
get disassembler input
Definition: Disassembler.h:363
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:248
GCNDisassembler(Disassembler &disassembler)
constructor
ISADisassembler(Disassembler &disassembler, cxuint outBufSize=500)
constructor
AMD binaries handling.
const cxbyte * globalData
global (constants for kernels) data
Definition: Disassembler.h:251
cxuint driverVersion
driver version
Definition: Disassembler.h:227
dump metadatas
Definition: Disassembler.h:50
AMD main binary for GPU for 64-bit mode.
Definition: AmdBinaries.h:595
std::ostream & getOutput()
get output stream
Definition: Disassembler.h:378
Disassembler & disassembler
disassembler instance
Definition: Disassembler.h:80
const cxbyte * code
code of kernel
Definition: Disassembler.h:176
const std::ostream & getOutput() const
get output stream
Definition: Disassembler.h:375
std::vector< AmdDisasmKernelInput > kernels
kernel inputs
Definition: Disassembler.h:190
const cxbyte * code
code of kernel
Definition: Disassembler.h:218
void addRelocation(size_t offset, RelocType type, size_t symIndex, int64_t addend)
add relocation
Definition: Disassembler.h:131
size_t codeSize
size of code of kernel
Definition: Disassembler.h:175
void writeLocation(size_t pos)
write location in the code
int64_t addend
addend
Definition: Disassembler.h:199
const cxbyte * input
input code
Definition: Disassembler.h:82
bool writeRelocation(size_t pos, RelocIter &relocIter)
write relocation to current place in instruction
std::vector< std::pair< size_t, CString > > namedLabels
named labels
Definition: Disassembler.h:84
std::vector< std::pair< size_t, CString > >::const_iterator NamedLabelIter
named label iterator
Definition: Disassembler.h:78
GPUDeviceType
type of GPU device
Definition: GPUId.h:38
print in comments float literals
Definition: Disassembler.h:53
const GalliumDisasmInput * getGalliumInput() const
get disassembler input
Definition: Disassembler.h:371
cxuint symbol
symbol
Definition: Disassembler.h:198
size_t bssAlignment
alignment of global bss section
Definition: Disassembler.h:234
bool is64BitMode
true if 64-bit mode of addressing
Definition: Disassembler.h:249
size_t headerSize
kernel header size
Definition: Disassembler.h:170
all disassembler flags (without config)
Definition: Disassembler.h:57
dump ATI CAL notes
Definition: Disassembler.h:52
utilities for other libraries and programs
AMD main binary for GPU for 32-bit mode.
Definition: AmdBinaries.h:554
CString kernelName
kernel name
Definition: Disassembler.h:167
AMD binaries generator.
RelocType type
relocation type
Definition: Disassembler.h:197
whole disassembler input (for AMD Catalyst driver GPU binaries)
Definition: Disassembler.h:224
size_t stubSize
data (from inner binary) size
Definition: Disassembler.h:214
single kernel input for disassembler
Definition: Disassembler.h:205
size_t samplerInitSize
sampler init data size
Definition: Disassembler.h:236
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:184
GPUDeviceType getDeviceType() const
get deviceType
size_t globalDataSize
global (constants for kernels) data size
Definition: Disassembler.h:230
const cxbyte * setup
data from inner binary
Definition: Disassembler.h:213
std::vector< AmdCL2RelaEntry > textRelocs
text relocations
Definition: Disassembler.h:216
disassembler input for raw code
Definition: Disassembler.h:258
const cxbyte * samplerInit
sampler init data
Definition: Disassembler.h:237
size_t globalDataSize
global (constants for kernels) data size
Definition: Disassembler.h:250
size_t codeSize
code size
Definition: Disassembler.h:261
CString compileOptions
compile options which used by in clBuildProgram
Definition: Disassembler.h:187
single kernel input for disassembler
Definition: Disassembler.h:165
size_t symbol
symbol index
Definition: Disassembler.h:67
Flags getFlags() const
get disassemblers flags
Definition: Disassembler.h:353
void disassemble()
disassemble code
std::vector< std::pair< size_t, Relocation > >::const_iterator RelocIter
relocation iterator
Definition: Disassembler.h:75
size_t addRelSymbol(const CString &symName)
add symbol to relocations
Definition: Disassembler.h:124
disassembler class
Definition: Disassembler.h:266
size_t codeSize
size of code of kernel
Definition: Disassembler.h:217
relocation with addend
Definition: Disassembler.h:194
std::vector< AmdCL2DisasmKernelInput > kernels
kernel inputs
Definition: Disassembler.h:241
print on left side hexadecimal code
Definition: Disassembler.h:54
simple C-string container
Definition: CString.h:38
print kernel configuration instead raw data
Definition: Disassembler.h:56