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-2017 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 = 600);
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  }
166  const std::vector<size_t>& getLabels() const
167  { return labels; }
169  const std::vector<std::pair<size_t, CString> >& getNamedLabels() const
170  { return namedLabels; }
172  void flushOutput()
173  { return output.flush(); }
174 };
175 
178 {
179 private:
180  bool instrOutOfCode;
181 
182  friend struct GCNDisasmUtils; // INTERNAL LOGIC
183 public:
187  ~GCNDisassembler();
188 
192  void disassemble();
193 };
194 
196 
199 {
201  size_t metadataSize;
202  const char* metadata;
203  size_t headerSize;
204  const cxbyte* header;
205  std::vector<CALNoteInput> calNotes;
206  size_t dataSize;
207  const cxbyte* data;
208  size_t codeSize;
209  const cxbyte* code;
210 };
211 
213 
216 {
218  bool is64BitMode;
221  size_t globalDataSize;
222  const cxbyte* globalData;
223  std::vector<AmdDisasmKernelInput> kernels;
224 };
225 
228 {
229  size_t offset;
231  cxuint symbol;
232  int64_t addend;
233 };
234 
236 
239 {
241  size_t metadataSize;
242  const cxbyte* metadata;
244  const cxbyte* isaMetadata;
245  size_t setupSize;
246  const cxbyte* setup;
247  size_t stubSize;
248  const cxbyte* stub;
249  std::vector<AmdCL2RelaEntry> textRelocs;
250  size_t codeSize;
251  const cxbyte* code;
252 };
253 
255 
258 {
260  uint32_t archMinor;
261  uint32_t archStepping;
262  bool is64BitMode;
263  cxuint driverVersion;
266  size_t globalDataSize;
267  const cxbyte* globalData;
268  size_t rwDataSize;
269  const cxbyte* rwData;
270  size_t bssAlignment;
271  size_t bssSize;
273  const cxbyte* samplerInit;
274 
276  std::vector<std::pair<size_t, size_t> > samplerRelocs;
277  std::vector<AmdCL2DisasmKernelInput> kernels;
278 };
279 
282 {
284  const cxbyte* setup;
285  size_t codeSize;
286  size_t offset;
287 };
288 
291 {
293  size_t size;
294  size_t offset;
296 };
297 
300 {
302  uint32_t archMinor;
303  uint32_t archStepping;
304  std::vector<ROCmDisasmRegionInput> regions;
305  size_t codeSize;
306  const cxbyte* code;
307 };
308 
311 {
313  GalliumProgInfoEntry progInfo[5];
314  uint32_t offset;
315  std::vector<GalliumArgInfo> argInfos;
316 };
317 
320 {
322  bool is64BitMode;
323  bool isLLVM390;
324  bool isMesa170;
325  size_t globalDataSize;
326  const cxbyte* globalData;
327  std::vector<GalliumDisasmKernelInput> kernels;
328  size_t codeSize;
329  const cxbyte* code;
330 };
331 
334 {
336  size_t codeSize;
337  const cxbyte* code;
338 };
339 
342 {
343 private:
344  friend class ISADisassembler;
345  std::unique_ptr<ISADisassembler> isaDisassembler;
346  bool fromBinary;
347  BinaryFormat binaryFormat;
348  union {
349  const AmdDisasmInput* amdInput;
350  const AmdCL2DisasmInput* amdCL2Input;
351  const GalliumDisasmInput* galliumInput;
352  const ROCmDisasmInput* rocmInput;
353  const RawCodeInput* rawInput;
354  };
355  std::ostream& output;
356  Flags flags;
357  size_t sectionCount;
358 public:
360 
365  Disassembler(const AmdMainGPUBinary32& binary, std::ostream& output,
366  Flags flags = 0);
368 
373  Disassembler(const AmdMainGPUBinary64& binary, std::ostream& output,
374  Flags flags = 0);
376 
382  Disassembler(const AmdCL2MainGPUBinary32& binary, std::ostream& output,
383  Flags flags = 0, cxuint driverVersion = 0);
385 
391  Disassembler(const AmdCL2MainGPUBinary64& binary, std::ostream& output,
392  Flags flags = 0, cxuint driverVersion = 0);
394 
399  Disassembler(const ROCmBinary& binary, std::ostream& output, Flags flags = 0);
401 
406  Disassembler(const AmdDisasmInput* disasmInput, std::ostream& output,
407  Flags flags = 0);
409 
414  Disassembler(const AmdCL2DisasmInput* disasmInput, std::ostream& output,
415  Flags flags = 0);
417 
422  Disassembler(const ROCmDisasmInput* disasmInput, std::ostream& output,
423  Flags flags = 0);
424 
426 
432  Disassembler(GPUDeviceType deviceType, const GalliumBinary& binary,
433  std::ostream& output, Flags flags = 0);
434 
436 
441  Disassembler(const GalliumDisasmInput* disasmInput, std::ostream& output,
442  Flags flags = 0);
443 
445  Disassembler(GPUDeviceType deviceType, size_t rawCodeSize, const cxbyte* rawCode,
446  std::ostream& output, Flags flags = 0);
447 
448  ~Disassembler();
449 
451  void disassemble();
452 
454  Flags getFlags() const
455  { return flags; }
457  void setFlags(Flags flags)
458  { this->flags = flags; }
459 
461  GPUDeviceType getDeviceType() const;
462 
465  { return amdInput; }
466 
469  { return amdCL2Input; }
470 
473  { return galliumInput; }
474 
476  const std::ostream& getOutput() const
477  { return output; }
479  std::ostream& getOutput()
480  { return output; }
481 };
482 
483 };
484 
485 #endif
common definitions for assembler and disassembler
void beforeDisassemble()
makes some things before disassemblying
size_t metadataSize
metadata size
Definition: Disassembler.h:241
const cxbyte * code
code
Definition: Disassembler.h:329
non copyable and non movable base structure (class)
Definition: Utilities.h:43
const cxbyte * header
kernel header size
Definition: Disassembler.h:204
size_t rwDataSize
global rw data size
Definition: Disassembler.h:268
bool is64BitMode
true if 64-bit mode of addressing
Definition: Disassembler.h:262
uint32_t archMinor
GPU arch minor.
Definition: Disassembler.h:302
int64_t addend
relocation addend
Definition: Disassembler.h:82
disasm kernel info structure (Gallium binaries)
Definition: Disassembler.h:310
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:312
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:261
size_t isaMetadataSize
metadata size
Definition: Disassembler.h:243
size_t dataSize
data (from inner binary) size
Definition: Disassembler.h:206
void clearNumberedLabels()
first part before disassemble - clear numbered labels
fast and direct output buffer
Definition: InputOutput.h:350
AMD OpenCL 2.0 main binary for GPU for 32-bit mode.
Definition: AmdCL2Binaries.h:478
size_t offset
offset
Definition: Disassembler.h:229
BinaryFormat
binary for Disassembler
Definition: Commons.h:33
print kernel configuration instead raw data
Definition: Disassembler.h:57
FastOutputBuffer output
output buffer
Definition: Disassembler.h:98
const cxbyte * code
code
Definition: Disassembler.h:337
size_t setupSize
data (from inner binary) size
Definition: Disassembler.h:245
AMD OpenCL 2.0 binaries handling.
CString kernelName
kernel name
Definition: Disassembler.h:283
size_t codeSize
code size
Definition: Disassembler.h:328
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:219
size_t globalDataSize
global (constants for kernels) data size
Definition: Disassembler.h:221
CString aclVersionString
acl version string
Definition: Disassembler.h:265
const cxbyte * data
data from inner binary
Definition: Disassembler.h:207
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:457
disasm ROCm region
Definition: Disassembler.h:290
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:468
void addNamedLabel(size_t pos, const CString &name)
add named label to list (must be called before disassembly)
Definition: Disassembler.h:143
ISADisassembler(Disassembler &disassembler, cxuint outBufSize=600)
constructor
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:301
const char * metadata
kernel&#39;s metadata
Definition: Disassembler.h:202
all disassembler flags (without config)
Definition: Disassembler.h:58
GCN architectur dissassembler.
Definition: Disassembler.h:177
dump code
Definition: Disassembler.h:50
const cxbyte * globalData
global (constants for kernels) data
Definition: Disassembler.h:267
size_t bssSize
size of global bss section
Definition: Disassembler.h:271
std::vector< GalliumDisasmKernelInput > kernels
list of input kernels
Definition: Disassembler.h:327
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:276
ROCm binaries handling.
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:335
whole disassembler input (for Gallium driver GPU binaries)
Definition: Disassembler.h:319
whole disassembler input (for AMD Catalyst driver GPU binaries)
Definition: Disassembler.h:215
Definition: GalliumBinaries.h:248
std::vector< size_t > labels
list of local labels
Definition: Disassembler.h:94
CString kernelName
kernel name
Definition: Disassembler.h:240
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:305
cxuint RelocType
relocation type
Definition: Commons.h:32
const cxbyte * rwData
global rw data data
Definition: Disassembler.h:269
dump metadatas
Definition: Disassembler.h:51
const cxbyte * metadata
kernel&#39;s metadata
Definition: Disassembler.h:242
std::vector< CALNoteInput > calNotes
ATI CAL notes.
Definition: Disassembler.h:205
const cxbyte * setup
setup
Definition: Disassembler.h:284
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:248
const cxbyte * globalData
global (constants for kernels) data
Definition: Disassembler.h:222
dump datas
Definition: Disassembler.h:52
const cxbyte * isaMetadata
kernel&#39;s metadata
Definition: Disassembler.h:244
ROCm main binary for GPU for 64-bit mode.
Definition: ROCmBinaries.h:70
bool is64BitMode
true if 64-bit mode of addressing
Definition: Disassembler.h:218
CString compileOptions
compile options which used by in clBuildProgram
Definition: Disassembler.h:264
bool isMesa170
if >=Mesa3D 17.0
Definition: Disassembler.h:324
print in comments float literals
Definition: Disassembler.h:54
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:259
void flushOutput()
flush output
Definition: Disassembler.h:172
size_t metadataSize
metadata size
Definition: Disassembler.h:201
GalliumCompute binaries handling (only with LLVM 3.6)
input output utilities
const AmdDisasmInput * getAmdInput() const
get disassembler input
Definition: Disassembler.h:464
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:321
AMD binaries handling.
size_t size
region size
Definition: Disassembler.h:293
print on left side hexadecimal code
Definition: Disassembler.h:55
const cxbyte * globalData
global (constants for kernels) data
Definition: Disassembler.h:326
cxuint driverVersion
driver version
Definition: Disassembler.h:263
kernel program info entry for Gallium binaries
Definition: GalliumBinaries.h:85
main namespace
Definition: AsmDefs.h:38
ROCmRegionType
ROCm region/symbol type.
Definition: ROCmBinaries.h:50
disasm ROCm input
Definition: Disassembler.h:299
AMD main binary for GPU for 64-bit mode.
Definition: AmdBinaries.h:607
std::ostream & getOutput()
get output stream
Definition: Disassembler.h:479
Disassembler & disassembler
disassembler instance
Definition: Disassembler.h:88
const cxbyte * code
code of kernel
Definition: Disassembler.h:209
const std::ostream & getOutput() const
get output stream
Definition: Disassembler.h:476
std::vector< AmdDisasmKernelInput > kernels
kernel inputs
Definition: Disassembler.h:223
dump ATI CAL notes
Definition: Disassembler.h:53
const cxbyte * code
code of kernel
Definition: Disassembler.h:251
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:208
size_t codeSize
code size
Definition: Disassembler.h:285
size_t offset
region offset in code
Definition: Disassembler.h:294
void writeLocation(size_t pos)
write location in the code
int64_t addend
addend
Definition: Disassembler.h:232
CString regionName
region name
Definition: Disassembler.h:292
const cxbyte * input
input code
Definition: Disassembler.h:92
bool writeRelocation(size_t pos, RelocIter &relocIter)
write relocation to current place in instruction
const std::vector< size_t > & getLabels() const
get numbered labels
Definition: Disassembler.h:166
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
bool isLLVM390
if >=LLVM3.9
Definition: Disassembler.h:323
GPUDeviceType
type of GPU device
Definition: GPUId.h:38
const GalliumDisasmInput * getGalliumInput() const
get disassembler input
Definition: Disassembler.h:472
cxuint symbol
symbol
Definition: Disassembler.h:231
size_t bssAlignment
alignment of global bss section
Definition: Disassembler.h:270
bool is64BitMode
true if 64-bit mode of addressing
Definition: Disassembler.h:322
size_t headerSize
kernel header size
Definition: Disassembler.h:203
utilities for other libraries and programs
size_t offset
kernel offset
Definition: Disassembler.h:286
AMD main binary for GPU for 32-bit mode.
Definition: AmdBinaries.h:563
CString kernelName
kernel name
Definition: Disassembler.h:200
const std::vector< std::pair< size_t, CString > > & getNamedLabels() const
get named labels
Definition: Disassembler.h:169
AMD binaries generator.
RelocType type
relocation type
Definition: Disassembler.h:230
whole disassembler input (for AMD Catalyst driver GPU binaries)
Definition: Disassembler.h:257
size_t stubSize
data (from inner binary) size
Definition: Disassembler.h:247
ROCmRegionType type
type
Definition: Disassembler.h:295
single kernel input for disassembler
Definition: Disassembler.h:238
size_t samplerInitSize
sampler init data size
Definition: Disassembler.h:272
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:217
std::vector< ROCmDisasmRegionInput > regions
regions
Definition: Disassembler.h:304
size_t globalDataSize
global (constants for kernels) data size
Definition: Disassembler.h:266
const cxbyte * setup
data from inner binary
Definition: Disassembler.h:246
std::vector< AmdCL2RelaEntry > textRelocs
text relocations
Definition: Disassembler.h:249
disassembler input for raw code
Definition: Disassembler.h:333
const cxbyte * samplerInit
sampler init data
Definition: Disassembler.h:273
size_t globalDataSize
global (constants for kernels) data size
Definition: Disassembler.h:325
size_t codeSize
code size
Definition: Disassembler.h:336
std::vector< GalliumArgInfo > argInfos
arguments
Definition: Disassembler.h:315
CString compileOptions
compile options which used by in clBuildProgram
Definition: Disassembler.h:220
single kernel input for disassembler
Definition: Disassembler.h:198
uint32_t archStepping
GPU arch stepping.
Definition: Disassembler.h:303
size_t symbol
symbol index
Definition: Disassembler.h:80
Flags getFlags() const
get disassemblers flags
Definition: Disassembler.h:454
void flush()
write output buffer
Definition: InputOutput.h:379
uint32_t archMinor
GPU arch minor.
Definition: Disassembler.h:260
std::vector< std::pair< size_t, Relocation > >::const_iterator RelocIter
relocation iterator
Definition: Disassembler.h:86
disasm ROCm kernel input
Definition: Disassembler.h:281
const cxbyte * code
code
Definition: Disassembler.h:306
AMD OpenCL 2.0 main binary for GPU for 64-bit mode.
Definition: AmdCL2Binaries.h:514
size_t addRelSymbol(const CString &symName)
add symbol to relocations
Definition: Disassembler.h:150
disassembler class
Definition: Disassembler.h:341
size_t codeSize
size of code of kernel
Definition: Disassembler.h:250
relocation with addend
Definition: Disassembler.h:227
std::vector< AmdCL2DisasmKernelInput > kernels
kernel inputs
Definition: Disassembler.h:277
simple C-string container
Definition: CString.h:38
uint32_t offset
offset of kernel code
Definition: Disassembler.h:314