CLRX  1
An unofficial OpenCL extensions designed for Radeon GPUs
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>
37 #include <CLRX/amdbin/AmdBinGen.h>
38 #include <CLRX/amdasm/Commons.h>
39 #include <CLRX/utils/Utilities.h>
40 #include <CLRX/utils/InputOutput.h>
41 
43 namespace CLRX
44 {
45 
46 class Disassembler;
47 
48 enum: Flags
49 {
56  DISASM_SETUP = 64,
57  DISASM_CONFIG = 128,
59 
61  DISASM_ALL = FLAGS_ALL&(~(DISASM_CONFIG|DISASM_BUGGYFPLIT))
62 };
63 
64 struct GCNDisasmUtils;
65 
68 {
69 private:
70  friend struct GCNDisasmUtils; // INTERNAL LOGIC
71 public:
72  typedef std::vector<size_t>::const_iterator LabelIter;
73 
75  typedef std::vector<std::pair<size_t, CString> >::const_iterator NamedLabelIter;
76 protected:
78  struct Relocation
79  {
80  size_t symbol;
82  int64_t addend;
83  };
84 
86  typedef std::vector<std::pair<size_t, Relocation> >::const_iterator RelocIter;
87 
89  size_t startOffset;
90  size_t labelStartOffset;
91  size_t inputSize;
92  const cxbyte* input;
93  bool dontPrintLabelsAfterCode;
94  std::vector<size_t> labels;
95  std::vector<std::pair<size_t, CString> > namedLabels;
96  std::vector<CString> relSymbols;
97  std::vector<std::pair<size_t, Relocation> > relocations;
99 
101  explicit ISADisassembler(Disassembler& disassembler, cxuint outBufSize = 500);
102 
104  void writeLocation(size_t pos);
106  bool writeRelocation(size_t pos, RelocIter& relocIter);
107 
108 public:
109  virtual ~ISADisassembler();
110 
112  void writeLabelsToPosition(size_t pos, LabelIter& labelIter,
113  NamedLabelIter& namedLabelIter);
115  void writeLabelsToEnd(size_t start, LabelIter labelIter, NamedLabelIter namedLabelIter);
116 
118  void setInput(size_t inputSize, const cxbyte* input, size_t startOffset = 0,
119  size_t labelStartOffset = 0)
120  {
121  this->inputSize = inputSize;
122  this->input = input;
123  this->startOffset = startOffset;
124  this->labelStartOffset = labelStartOffset;
125  }
126 
127  void setDontPrintLabels(bool after)
128  { dontPrintLabelsAfterCode = after; }
129 
131  virtual void analyzeBeforeDisassemble() = 0;
132 
134  void clearNumberedLabels();
138  void beforeDisassemble();
140  virtual void disassemble() = 0;
141 
143  void addNamedLabel(size_t pos, const CString& name)
144  { namedLabels.push_back(std::make_pair(pos, name)); }
146  void addNamedLabel(size_t pos, CString&& name)
147  { namedLabels.push_back(std::make_pair(pos, name)); }
148 
150  size_t addRelSymbol(const CString& symName)
151  {
152  size_t index = relSymbols.size();
153  relSymbols.push_back(symName);
154  return index;
155  }
157  void addRelocation(size_t offset, RelocType type, size_t symIndex, int64_t addend)
158  { relocations.push_back(std::make_pair(offset, Relocation{symIndex, type, addend})); }
161  {
162  relSymbols.clear();
163  relocations.clear();
164  }
165 
166  const std::vector<size_t>& getLabels() const
167  { return labels; }
168  const std::vector<std::pair<size_t, CString> >& getNamedLabels() const
169  { return namedLabels; }
170 
171  void flushOutput()
172  { return output.flush(); }
173 };
174 
177 {
178 private:
179  bool instrOutOfCode;
180 
181  friend struct GCNDisasmUtils; // INTERNAL LOGIC
182 public:
186  ~GCNDisassembler();
187 
191  void disassemble();
192 };
193 
195 
198 {
200  size_t metadataSize;
201  const char* metadata;
202  size_t headerSize;
203  const cxbyte* header;
204  std::vector<CALNoteInput> calNotes;
205  size_t dataSize;
206  const cxbyte* data;
207  size_t codeSize;
208  const cxbyte* code;
209 };
210 
212 
215 {
217  bool is64BitMode;
220  size_t globalDataSize;
221  const cxbyte* globalData;
222  std::vector<AmdDisasmKernelInput> kernels;
223 };
224 
227 {
228  size_t offset;
230  cxuint symbol;
231  int64_t addend;
232 };
233 
235 
238 {
240  size_t metadataSize;
241  const cxbyte* metadata;
243  const cxbyte* isaMetadata;
244  size_t setupSize;
245  const cxbyte* setup;
246  size_t stubSize;
247  const cxbyte* stub;
248  std::vector<AmdCL2RelaEntry> textRelocs;
249  size_t codeSize;
250  const cxbyte* code;
251 };
252 
254 
257 {
259  uint32_t archMinor;
260  uint32_t archStepping;
261  cxuint driverVersion;
264  size_t globalDataSize;
265  const cxbyte* globalData;
266  size_t rwDataSize;
267  const cxbyte* rwData;
268  size_t bssAlignment;
269  size_t bssSize;
271  const cxbyte* samplerInit;
272 
274  std::vector<std::pair<size_t, size_t> > samplerRelocs;
275  std::vector<AmdCL2DisasmKernelInput> kernels;
276 };
277 
279 {
281  const cxbyte* setup;
282  size_t codeSize;
283  size_t offset;
284 };
285 
288 {
290  size_t size;
291  size_t offset;
293 };
294 
296 {
298  uint32_t archMinor;
299  uint32_t archStepping;
300  std::vector<ROCmDisasmRegionInput> regions;
301  size_t codeSize;
302  const cxbyte* code;
303 };
304 
307 {
309  GalliumProgInfoEntry progInfo[3];
310  uint32_t offset;
311  std::vector<GalliumArgInfo> argInfos;
312 };
313 
316 {
318  bool is64BitMode;
319  size_t globalDataSize;
320  const cxbyte* globalData;
321  std::vector<GalliumDisasmKernelInput> kernels;
322  size_t codeSize;
323  const cxbyte* code;
324 };
325 
328 {
330  size_t codeSize;
331  const cxbyte* code;
332 };
333 
336 {
337 private:
338  friend class ISADisassembler;
339  std::unique_ptr<ISADisassembler> isaDisassembler;
340  bool fromBinary;
341  BinaryFormat binaryFormat;
342  union {
343  const AmdDisasmInput* amdInput;
344  const AmdCL2DisasmInput* amdCL2Input;
345  const GalliumDisasmInput* galliumInput;
346  const ROCmDisasmInput* rocmInput;
347  const RawCodeInput* rawInput;
348  };
349  std::ostream& output;
350  Flags flags;
351  size_t sectionCount;
352 public:
354 
359  Disassembler(const AmdMainGPUBinary32& binary, std::ostream& output,
360  Flags flags = 0);
362 
367  Disassembler(const AmdMainGPUBinary64& binary, std::ostream& output,
368  Flags flags = 0);
370 
375  Disassembler(const AmdCL2MainGPUBinary& binary, std::ostream& output,
376  Flags flags = 0);
378 
383  Disassembler(const ROCmBinary& binary, std::ostream& output, Flags flags = 0);
385 
390  Disassembler(const AmdDisasmInput* disasmInput, std::ostream& output,
391  Flags flags = 0);
393 
398  Disassembler(const AmdCL2DisasmInput* disasmInput, std::ostream& output,
399  Flags flags = 0);
401 
406  Disassembler(const ROCmDisasmInput* disasmInput, std::ostream& output,
407  Flags flags = 0);
408 
410 
416  Disassembler(GPUDeviceType deviceType, const GalliumBinary& binary,
417  std::ostream& output, Flags flags = 0);
418 
420 
425  Disassembler(const GalliumDisasmInput* disasmInput, std::ostream& output,
426  Flags flags = 0);
427 
429  Disassembler(GPUDeviceType deviceType, size_t rawCodeSize, const cxbyte* rawCode,
430  std::ostream& output, Flags flags = 0);
431 
432  ~Disassembler();
433 
435  void disassemble();
436 
438  Flags getFlags() const
439  { return flags; }
441  void setFlags(Flags flags)
442  { this->flags = flags; }
443 
445  GPUDeviceType getDeviceType() const;
446 
449  { return amdInput; }
450 
453  { return amdCL2Input; }
454 
457  { return galliumInput; }
458 
460  const std::ostream& getOutput() const
461  { return output; }
463  std::ostream& getOutput()
464  { return output; }
465 };
466 
467 };
468 
469 #endif
print kernel configuration instead raw data
Definition: Disassembler.h:57
common definitions for assembler and disassembler
void beforeDisassemble()
makes some things before disassemblying
all disassembler flags (without config)
Definition: Disassembler.h:58
size_t metadataSize
metadata size
Definition: Disassembler.h:240
const cxbyte * code
code
Definition: Disassembler.h:323
non copyable and non movable base structure (class)
Definition: Utilities.h:43
const cxbyte * header
kernel header size
Definition: Disassembler.h:203
size_t rwDataSize
global rw data size
Definition: Disassembler.h:266
uint32_t archMinor
GPU arch minor.
Definition: Disassembler.h:298
int64_t addend
relocation addend
Definition: Disassembler.h:82
disasm kernel info structure (Gallium binaries)
Definition: Disassembler.h:306
main class for
Definition: Disassembler.h:67
uint32_t Flags
type for declaring various flags
Definition: Utilities.h:97
CString kernelName
kernel&#39;s name
Definition: Disassembler.h:308
internal relocation structure
Definition: Disassembler.h:78
void setInput(size_t inputSize, const cxbyte *input, size_t startOffset=0, size_t labelStartOffset=0)
set input code
Definition: Disassembler.h:118
virtual void analyzeBeforeDisassemble()=0
analyze code before disassemblying
uint32_t archStepping
GPU arch stepping.
Definition: Disassembler.h:260
size_t isaMetadataSize
metadata size
Definition: Disassembler.h:242
size_t dataSize
data (from inner binary) size
Definition: Disassembler.h:205
void clearNumberedLabels()
first part before disassemble - clear numbered labels
fast and direct output buffer
Definition: InputOutput.h:350
size_t offset
offset
Definition: Disassembler.h:228
BinaryFormat
binary for Disassembler
Definition: Commons.h:33
FastOutputBuffer output
output buffer
Definition: Disassembler.h:98
const cxbyte * code
code
Definition: Disassembler.h:331
size_t setupSize
data (from inner binary) size
Definition: Disassembler.h:244
AMD OpenCL 2.0 binaries handling.
CString kernelName
kernel name
Definition: Disassembler.h:280
size_t codeSize
code size
Definition: Disassembler.h:322
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:218
size_t globalDataSize
global (constants for kernels) data size
Definition: Disassembler.h:220
CString aclVersionString
acl version string
Definition: Disassembler.h:263
const cxbyte * data
data from inner binary
Definition: Disassembler.h:206
void clearRelocations()
clear all relocations
Definition: Disassembler.h:160
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:146
void setFlags(Flags flags)
get disassemblers flags
Definition: Disassembler.h:441
disasm ROCm region
Definition: Disassembler.h:287
std::vector< CString > relSymbols
symbols used by relocations
Definition: Disassembler.h:96
RelocType type
relocation type
Definition: Disassembler.h:81
const AmdCL2DisasmInput * getAmdCL2Input() const
get disassembler input
Definition: Disassembler.h:452
void addNamedLabel(size_t pos, const CString &name)
add named label to list (must be called before disassembly)
Definition: Disassembler.h:143
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:297
const char * metadata
kernel&#39;s metadata
Definition: Disassembler.h:201
GCN architectur dissassembler.
Definition: Disassembler.h:176
const cxbyte * globalData
global (constants for kernels) data
Definition: Disassembler.h:265
size_t bssSize
size of global bss section
Definition: Disassembler.h:269
std::vector< GalliumDisasmKernelInput > kernels
list of input kernels
Definition: Disassembler.h:321
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:274
ROCm binaries handling.
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:329
whole disassembler input (for Gallium driver GPU binaries)
Definition: Disassembler.h:315
whole disassembler input (for AMD Catalyst driver GPU binaries)
Definition: Disassembler.h:214
Definition: GalliumBinaries.h:235
std::vector< size_t > labels
list of local labels
Definition: Disassembler.h:94
CString kernelName
kernel name
Definition: Disassembler.h:239
std::vector< std::pair< size_t, Relocation > > relocations
relocations
Definition: Disassembler.h:97
virtual void disassemble()=0
disassembles input code
size_t codeSize
code size
Definition: Disassembler.h:301
cxuint RelocType
relocation type
Definition: Commons.h:32
const cxbyte * rwData
global rw data data
Definition: Disassembler.h:267
dump code
Definition: Disassembler.h:50
const cxbyte * metadata
kernel&#39;s metadata
Definition: Disassembler.h:241
std::vector< CALNoteInput > calNotes
ATI CAL notes.
Definition: Disassembler.h:204
void prepareLabelsAndRelocations()
last part before disassemble - prepare labels (sorting)
size_t inputSize
< start offset of labels
Definition: Disassembler.h:91
const cxbyte * stub
data from inner binary
Definition: Disassembler.h:247
const cxbyte * globalData
global (constants for kernels) data
Definition: Disassembler.h:221
const cxbyte * isaMetadata
kernel&#39;s metadata
Definition: Disassembler.h:243
ROCm main binary for GPU for 64-bit mode.
Definition: ROCmBinaries.h:70
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:217
CString compileOptions
compile options which used by in clBuildProgram
Definition: Disassembler.h:262
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:258
size_t metadataSize
metadata size
Definition: Disassembler.h:200
print in comments float literals
Definition: Disassembler.h:54
GalliumCompute binaries handling (only with LLVM 3.6)
input output utilities
const AmdDisasmInput * getAmdInput() const
get disassembler input
Definition: Disassembler.h:448
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:317
dump ATI CAL notes
Definition: Disassembler.h:53
ISADisassembler(Disassembler &disassembler, cxuint outBufSize=500)
constructor
AMD binaries handling.
size_t size
region size
Definition: Disassembler.h:290
const cxbyte * globalData
global (constants for kernels) data
Definition: Disassembler.h:320
cxuint driverVersion
driver version
Definition: Disassembler.h:261
kernel program info entry for Gallium binaries
Definition: GalliumBinaries.h:85
main namespace
Definition: AsmFormats.h:41
ROCmRegionType
ROCm region/symbol type.
Definition: ROCmBinaries.h:50
Definition: Disassembler.h:295
AMD main binary for GPU for 64-bit mode.
Definition: AmdBinaries.h:595
std::ostream & getOutput()
get output stream
Definition: Disassembler.h:463
Disassembler & disassembler
disassembler instance
Definition: Disassembler.h:88
const cxbyte * code
code of kernel
Definition: Disassembler.h:208
const std::ostream & getOutput() const
get output stream
Definition: Disassembler.h:460
std::vector< AmdDisasmKernelInput > kernels
kernel inputs
Definition: Disassembler.h:222
const cxbyte * code
code of kernel
Definition: Disassembler.h:250
void addRelocation(size_t offset, RelocType type, size_t symIndex, int64_t addend)
add relocation
Definition: Disassembler.h:157
size_t codeSize
size of code of kernel
Definition: Disassembler.h:207
dump metadatas
Definition: Disassembler.h:51
size_t offset
region offset in code
Definition: Disassembler.h:291
void writeLocation(size_t pos)
write location in the code
int64_t addend
addend
Definition: Disassembler.h:231
CString regionName
region name
Definition: Disassembler.h:289
const cxbyte * input
input code
Definition: Disassembler.h:92
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:95
std::vector< std::pair< size_t, CString > >::const_iterator NamedLabelIter
named label iterator
Definition: Disassembler.h:75
size_t startOffset
start offset
Definition: Disassembler.h:89
GPUDeviceType
type of GPU device
Definition: GPUId.h:38
print on left side hexadecimal code
Definition: Disassembler.h:55
const GalliumDisasmInput * getGalliumInput() const
get disassembler input
Definition: Disassembler.h:456
cxuint symbol
symbol
Definition: Disassembler.h:230
size_t bssAlignment
alignment of global bss section
Definition: Disassembler.h:268
bool is64BitMode
true if 64-bit mode of addressing
Definition: Disassembler.h:318
size_t headerSize
kernel header size
Definition: Disassembler.h:202
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:199
AMD binaries generator.
RelocType type
relocation type
Definition: Disassembler.h:229
whole disassembler input (for AMD Catalyst driver GPU binaries)
Definition: Disassembler.h:256
size_t stubSize
data (from inner binary) size
Definition: Disassembler.h:246
ROCmRegionType type
type
Definition: Disassembler.h:292
single kernel input for disassembler
Definition: Disassembler.h:237
size_t samplerInitSize
sampler init data size
Definition: Disassembler.h:270
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:216
std::vector< ROCmDisasmRegionInput > regions
regions
Definition: Disassembler.h:300
size_t globalDataSize
global (constants for kernels) data size
Definition: Disassembler.h:264
const cxbyte * setup
data from inner binary
Definition: Disassembler.h:245
std::vector< AmdCL2RelaEntry > textRelocs
text relocations
Definition: Disassembler.h:248
disassembler input for raw code
Definition: Disassembler.h:327
const cxbyte * samplerInit
sampler init data
Definition: Disassembler.h:271
size_t globalDataSize
global (constants for kernels) data size
Definition: Disassembler.h:319
size_t codeSize
code size
Definition: Disassembler.h:330
std::vector< GalliumArgInfo > argInfos
arguments
Definition: Disassembler.h:311
CString compileOptions
compile options which used by in clBuildProgram
Definition: Disassembler.h:219
single kernel input for disassembler
Definition: Disassembler.h:197
uint32_t archStepping
GPU arch stepping.
Definition: Disassembler.h:299
size_t symbol
symbol index
Definition: Disassembler.h:80
Flags getFlags() const
get disassemblers flags
Definition: Disassembler.h:438
void flush()
write output buffer
Definition: InputOutput.h:379
uint32_t archMinor
GPU arch minor.
Definition: Disassembler.h:259
std::vector< std::pair< size_t, Relocation > >::const_iterator RelocIter
relocation iterator
Definition: Disassembler.h:86
Definition: Disassembler.h:278
const cxbyte * code
code
Definition: Disassembler.h:302
dump datas
Definition: Disassembler.h:52
size_t addRelSymbol(const CString &symName)
add symbol to relocations
Definition: Disassembler.h:150
disassembler class
Definition: Disassembler.h:335
size_t codeSize
size of code of kernel
Definition: Disassembler.h:249
relocation with addend
Definition: Disassembler.h:226
std::vector< AmdCL2DisasmKernelInput > kernels
kernel inputs
Definition: Disassembler.h:275
simple C-string container
Definition: CString.h:38
uint32_t offset
offset of kernel code
Definition: Disassembler.h:310