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 
48 {
49 public:
51  DisasmException() = default;
53  explicit DisasmException(const std::string& message);
55  virtual ~DisasmException() noexcept = default;
56 };
57 
58 class Disassembler;
59 
60 enum: Flags
61 {
68  DISASM_SETUP = 64,
69  DISASM_CONFIG = 128,
70  DISASM_BUGGYFPLIT = 0x100,
71  DISASM_CODEPOS = 0x200,
72  DISASM_HSACONFIG = 0x400,
73 
75  DISASM_ALL = FLAGS_ALL&(~(DISASM_CONFIG|DISASM_BUGGYFPLIT|DISASM_HSACONFIG))
76 };
77 
78 struct GCNDisasmUtils;
79 
82 {
83 private:
84  friend struct GCNDisasmUtils; // INTERNAL LOGIC
85 public:
86  typedef std::vector<size_t>::const_iterator LabelIter;
87 
89  typedef std::vector<std::pair<size_t, CString> >::const_iterator NamedLabelIter;
90 protected:
92  struct Relocation
93  {
94  size_t symbol;
96  int64_t addend;
97  };
98 
100  typedef std::vector<std::pair<size_t, Relocation> >::const_iterator RelocIter;
101 
103  size_t startOffset;
104  size_t labelStartOffset;
105  size_t inputSize;
106  const cxbyte* input;
107  bool dontPrintLabelsAfterCode;
108  std::vector<size_t> labels;
109  std::vector<std::pair<size_t, CString> > namedLabels;
110  std::vector<CString> relSymbols;
111  std::vector<std::pair<size_t, Relocation> > relocations;
113 
115  explicit ISADisassembler(Disassembler& disassembler, cxuint outBufSize = 600);
116 
118  void writeLocation(size_t pos);
120  bool writeRelocation(size_t pos, RelocIter& relocIter);
121 
122 public:
123  virtual ~ISADisassembler();
124 
126  void writeLabelsToPosition(size_t pos, LabelIter& labelIter,
127  NamedLabelIter& namedLabelIter);
129  void writeLabelsToEnd(size_t start, LabelIter labelIter, NamedLabelIter namedLabelIter);
130 
132  void setInput(size_t inputSize, const cxbyte* input, size_t startOffset = 0,
133  size_t labelStartOffset = 0)
134  {
135  this->inputSize = inputSize;
136  this->input = input;
137  this->startOffset = startOffset;
138  this->labelStartOffset = labelStartOffset;
139  }
140 
141  void setDontPrintLabels(bool after)
142  { dontPrintLabelsAfterCode = after; }
143 
145  virtual void analyzeBeforeDisassemble() = 0;
146 
148  void clearNumberedLabels();
150  void prepareLabelsAndRelocations();
152  void beforeDisassemble();
154  virtual void disassemble() = 0;
155 
157  void addNamedLabel(size_t pos, const CString& name)
158  { namedLabels.push_back(std::make_pair(pos, name)); }
160  void addNamedLabel(size_t pos, CString&& name)
161  { namedLabels.push_back(std::make_pair(pos, name)); }
162 
164  size_t addRelSymbol(const CString& symName)
165  {
166  size_t index = relSymbols.size();
167  relSymbols.push_back(symName);
168  return index;
169  }
171  void addRelocation(size_t offset, RelocType type, size_t symIndex, int64_t addend)
172  { relocations.push_back(std::make_pair(offset, Relocation{symIndex, type, addend})); }
175  {
176  relSymbols.clear();
177  relocations.clear();
178  }
180  const std::vector<size_t>& getLabels() const
181  { return labels; }
183  const std::vector<std::pair<size_t, CString> >& getNamedLabels() const
184  { return namedLabels; }
186  void flushOutput()
187  { return output.flush(); }
188 };
189 
192 {
193 private:
194  bool instrOutOfCode;
195 
196  friend struct GCNDisasmUtils; // INTERNAL LOGIC
197 public:
199  GCNDisassembler(Disassembler& disassembler);
201  ~GCNDisassembler();
202 
204  void analyzeBeforeDisassemble();
206  void disassemble();
207 };
208 
210 
213 {
215  size_t metadataSize;
216  const char* metadata;
217  size_t headerSize;
218  const cxbyte* header;
219  std::vector<CALNoteInput> calNotes;
220  size_t dataSize;
221  const cxbyte* data;
222  size_t codeSize;
223  const cxbyte* code;
224 };
225 
227 
230 {
232  bool is64BitMode;
235  size_t globalDataSize;
237  std::vector<AmdDisasmKernelInput> kernels;
238 };
239 
242 {
243  size_t offset;
246  int64_t addend;
247 };
248 
250 
253 {
255  size_t metadataSize;
256  const cxbyte* metadata;
259  size_t setupSize;
260  const cxbyte* setup;
261  size_t stubSize;
262  const cxbyte* stub;
263  std::vector<AmdCL2RelaEntry> textRelocs;
264  size_t codeSize;
265  const cxbyte* code;
266 };
267 
269 
272 {
274  uint32_t archMinor;
275  uint32_t archStepping;
276  bool is64BitMode;
280  size_t globalDataSize;
282  size_t rwDataSize;
283  const cxbyte* rwData;
284  size_t bssAlignment;
285  size_t bssSize;
288 
290  std::vector<std::pair<size_t, size_t> > samplerRelocs;
291  std::vector<AmdCL2DisasmKernelInput> kernels;
292 };
293 
296 {
298  const cxbyte* setup;
299  size_t codeSize;
300  size_t offset;
301 };
302 
305 {
307  size_t size;
308  size_t offset;
310 };
311 
314 {
316  uint32_t archMinor;
317  uint32_t archStepping;
318  std::vector<ROCmDisasmRegionInput> regions;
319  size_t codeSize;
320  const cxbyte* code;
321 };
322 
325 {
327  GalliumProgInfoEntry progInfo[5];
328  uint32_t offset;
329  std::vector<GalliumArgInfo> argInfos;
330 };
331 
334 {
336  bool is64BitMode;
337  bool isLLVM390;
338  bool isMesa170;
339  bool isAMDHSA;
340  size_t globalDataSize;
342  std::vector<GalliumDisasmKernelInput> kernels;
343  size_t codeSize;
344  const cxbyte* code;
345 };
346 
349 {
351  size_t codeSize;
352  const cxbyte* code;
353 };
354 
357 {
358 private:
359  friend class ISADisassembler;
360  std::unique_ptr<ISADisassembler> isaDisassembler;
361  bool fromBinary;
362  BinaryFormat binaryFormat;
363  union {
364  const AmdDisasmInput* amdInput;
365  const AmdCL2DisasmInput* amdCL2Input;
366  const GalliumDisasmInput* galliumInput;
367  const ROCmDisasmInput* rocmInput;
368  const RawCodeInput* rawInput;
369  };
370  std::ostream& output;
371  Flags flags;
372  size_t sectionCount;
373 public:
375 
380  Disassembler(const AmdMainGPUBinary32& binary, std::ostream& output,
381  Flags flags = 0);
383 
388  Disassembler(const AmdMainGPUBinary64& binary, std::ostream& output,
389  Flags flags = 0);
391 
397  Disassembler(const AmdCL2MainGPUBinary32& binary, std::ostream& output,
398  Flags flags = 0, cxuint driverVersion = 0);
400 
406  Disassembler(const AmdCL2MainGPUBinary64& binary, std::ostream& output,
407  Flags flags = 0, cxuint driverVersion = 0);
409 
414  Disassembler(const ROCmBinary& binary, std::ostream& output, Flags flags = 0);
416 
421  Disassembler(const AmdDisasmInput* disasmInput, std::ostream& output,
422  Flags flags = 0);
424 
429  Disassembler(const AmdCL2DisasmInput* disasmInput, std::ostream& output,
430  Flags flags = 0);
432 
437  Disassembler(const ROCmDisasmInput* disasmInput, std::ostream& output,
438  Flags flags = 0);
439 
441 
448  Disassembler(GPUDeviceType deviceType, const GalliumBinary& binary,
449  std::ostream& output, Flags flags = 0, cxuint llvmVersion = 0);
450 
452 
457  Disassembler(const GalliumDisasmInput* disasmInput, std::ostream& output,
458  Flags flags = 0);
459 
461  Disassembler(GPUDeviceType deviceType, size_t rawCodeSize, const cxbyte* rawCode,
462  std::ostream& output, Flags flags = 0);
463 
464  ~Disassembler();
465 
467  void disassemble();
468 
470  Flags getFlags() const
471  { return flags; }
473  void setFlags(Flags flags)
474  { this->flags = flags; }
475 
477  GPUDeviceType getDeviceType() const;
478 
481  { return amdInput; }
482 
485  { return amdCL2Input; }
486 
489  { return galliumInput; }
490 
492  const std::ostream& getOutput() const
493  { return output; }
495  std::ostream& getOutput()
496  { return output; }
497 };
498 
499 };
500 
501 #endif
common definitions for assembler and disassembler
size_t metadataSize
metadata size
Definition: Disassembler.h:255
const cxbyte * code
code
Definition: Disassembler.h:344
non copyable and non movable base structure (class)
Definition: Utilities.h:43
const cxbyte * header
kernel header size
Definition: Disassembler.h:218
size_t rwDataSize
global rw data size
Definition: Disassembler.h:282
bool is64BitMode
true if 64-bit mode of addressing
Definition: Disassembler.h:276
uint32_t archMinor
GPU arch minor.
Definition: Disassembler.h:316
int64_t addend
relocation addend
Definition: Disassembler.h:96
disasm kernel info structure (Gallium binaries)
Definition: Disassembler.h:324
print code position
Definition: Disassembler.h:71
main class for
Definition: Disassembler.h:81
uint32_t Flags
type for declaring various flags
Definition: Utilities.h:97
CString kernelName
kernel&#39;s name
Definition: Disassembler.h:326
internal relocation structure
Definition: Disassembler.h:92
void setInput(size_t inputSize, const cxbyte *input, size_t startOffset=0, size_t labelStartOffset=0)
set input code
Definition: Disassembler.h:132
uint32_t archStepping
GPU arch stepping.
Definition: Disassembler.h:275
size_t isaMetadataSize
metadata size
Definition: Disassembler.h:257
size_t dataSize
data (from inner binary) size
Definition: Disassembler.h:220
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:243
BinaryFormat
binary for Disassembler
Definition: Commons.h:33
print kernel configuration instead raw data
Definition: Disassembler.h:69
FastOutputBuffer output
output buffer
Definition: Disassembler.h:112
const cxbyte * code
code
Definition: Disassembler.h:352
size_t setupSize
data (from inner binary) size
Definition: Disassembler.h:259
AMD OpenCL 2.0 binaries handling.
CString kernelName
kernel name
Definition: Disassembler.h:297
size_t codeSize
code size
Definition: Disassembler.h:343
CString driverInfo
driver info (for AMD Catalyst drivers)
Definition: Disassembler.h:233
size_t globalDataSize
global (constants for kernels) data size
Definition: Disassembler.h:235
CString aclVersionString
acl version string
Definition: Disassembler.h:279
const cxbyte * data
data from inner binary
Definition: Disassembler.h:221
void clearRelocations()
clear all relocations
Definition: Disassembler.h:174
void addNamedLabel(size_t pos, CString &&name)
add named label to list (must be called before disassembly)
Definition: Disassembler.h:160
void setFlags(Flags flags)
get disassemblers flags
Definition: Disassembler.h:473
disasm ROCm region
Definition: Disassembler.h:304
std::vector< CString > relSymbols
symbols used by relocations
Definition: Disassembler.h:110
RelocType type
relocation type
Definition: Disassembler.h:95
const AmdCL2DisasmInput * getAmdCL2Input() const
get disassembler input
Definition: Disassembler.h:484
void addNamedLabel(size_t pos, const CString &name)
add named label to list (must be called before disassembly)
Definition: Disassembler.h:157
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:315
const char * metadata
kernel&#39;s metadata
Definition: Disassembler.h:216
GCN architectur dissassembler.
Definition: Disassembler.h:191
dump code
Definition: Disassembler.h:62
const cxbyte * globalData
global (constants for kernels) data
Definition: Disassembler.h:281
size_t bssSize
size of global bss section
Definition: Disassembler.h:285
std::vector< GalliumDisasmKernelInput > kernels
list of input kernels
Definition: Disassembler.h:342
std::vector< size_t >::const_iterator LabelIter
label iterator
Definition: Disassembler.h:86
std::vector< std::pair< size_t, size_t > > samplerRelocs
sampler relocations
Definition: Disassembler.h:290
ROCm binaries handling.
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:350
bool isAMDHSA
if AMDHSA (LLVM 4.0)
Definition: Disassembler.h:339
whole disassembler input (for Gallium driver GPU binaries)
Definition: Disassembler.h:333
whole disassembler input (for AMD Catalyst driver GPU binaries)
Definition: Disassembler.h:229
Definition: GalliumBinaries.h:246
std::vector< size_t > labels
list of local labels
Definition: Disassembler.h:108
CString kernelName
kernel name
Definition: Disassembler.h:254
std::vector< std::pair< size_t, Relocation > > relocations
relocations
Definition: Disassembler.h:111
Configuration header.
size_t codeSize
code size
Definition: Disassembler.h:319
cxuint RelocType
relocation type
Definition: Commons.h:33
const cxbyte * rwData
global rw data data
Definition: Disassembler.h:283
dump metadatas
Definition: Disassembler.h:63
const cxbyte * metadata
kernel&#39;s metadata
Definition: Disassembler.h:256
std::vector< CALNoteInput > calNotes
ATI CAL notes.
Definition: Disassembler.h:219
const cxbyte * setup
setup
Definition: Disassembler.h:298
size_t inputSize
< start offset of labels
Definition: Disassembler.h:105
const cxbyte * stub
data from inner binary
Definition: Disassembler.h:262
const cxbyte * globalData
global (constants for kernels) data
Definition: Disassembler.h:236
dump datas
Definition: Disassembler.h:64
const cxbyte * isaMetadata
kernel&#39;s metadata
Definition: Disassembler.h:258
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:232
CString compileOptions
compile options which used by in clBuildProgram
Definition: Disassembler.h:278
bool isMesa170
if >=Mesa3D 17.0
Definition: Disassembler.h:338
print in comments float literals
Definition: Disassembler.h:66
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:273
void flushOutput()
flush output
Definition: Disassembler.h:186
size_t metadataSize
metadata size
Definition: Disassembler.h:215
GalliumCompute binaries handling (only with LLVM 3.6)
input output utilities
const AmdDisasmInput * getAmdInput() const
get disassembler input
Definition: Disassembler.h:480
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:335
AMD binaries handling.
unsigned char cxbyte
unsigned byte
Definition: Config.h:215
size_t size
region size
Definition: Disassembler.h:307
print on left side hexadecimal code
Definition: Disassembler.h:67
const cxbyte * globalData
global (constants for kernels) data
Definition: Disassembler.h:341
cxuint driverVersion
driver version
Definition: Disassembler.h:277
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:313
AMD main binary for GPU for 64-bit mode.
Definition: AmdBinaries.h:612
std::ostream & getOutput()
get output stream
Definition: Disassembler.h:495
Disassembler & disassembler
disassembler instance
Definition: Disassembler.h:102
const cxbyte * code
code of kernel
Definition: Disassembler.h:223
const std::ostream & getOutput() const
get output stream
Definition: Disassembler.h:492
unsigned int cxuint
unsigned int
Definition: Config.h:223
std::vector< AmdDisasmKernelInput > kernels
kernel inputs
Definition: Disassembler.h:237
dump ATI CAL notes
Definition: Disassembler.h:65
const cxbyte * code
code of kernel
Definition: Disassembler.h:265
void addRelocation(size_t offset, RelocType type, size_t symIndex, int64_t addend)
add relocation
Definition: Disassembler.h:171
size_t codeSize
size of code of kernel
Definition: Disassembler.h:222
size_t codeSize
code size
Definition: Disassembler.h:299
size_t offset
region offset in code
Definition: Disassembler.h:308
int64_t addend
addend
Definition: Disassembler.h:246
CString regionName
region name
Definition: Disassembler.h:306
const cxbyte * input
input code
Definition: Disassembler.h:106
print HSA configuration
Definition: Disassembler.h:72
const std::vector< size_t > & getLabels() const
get numbered labels
Definition: Disassembler.h:180
std::vector< std::pair< size_t, CString > > namedLabels
named labels
Definition: Disassembler.h:109
std::vector< std::pair< size_t, CString > >::const_iterator NamedLabelIter
named label iterator
Definition: Disassembler.h:89
size_t startOffset
start offset
Definition: Disassembler.h:103
bool isLLVM390
if >=LLVM3.9
Definition: Disassembler.h:337
GPUDeviceType
type of GPU device
Definition: GPUId.h:51
virtual ~DisasmException() noexcept=default
destructor
const GalliumDisasmInput * getGalliumInput() const
get disassembler input
Definition: Disassembler.h:488
cxuint symbol
symbol
Definition: Disassembler.h:245
size_t bssAlignment
alignment of global bss section
Definition: Disassembler.h:284
bool is64BitMode
true if 64-bit mode of addressing
Definition: Disassembler.h:336
size_t headerSize
kernel header size
Definition: Disassembler.h:217
utilities for other libraries and programs
size_t offset
kernel offset
Definition: Disassembler.h:300
std::string message
message
Definition: Utilities.h:61
AMD main binary for GPU for 32-bit mode.
Definition: AmdBinaries.h:568
CString kernelName
kernel name
Definition: Disassembler.h:214
exception class
Definition: Utilities.h:58
const std::vector< std::pair< size_t, CString > > & getNamedLabels() const
get named labels
Definition: Disassembler.h:183
AMD binaries generator.
RelocType type
relocation type
Definition: Disassembler.h:244
whole disassembler input (for AMD Catalyst driver GPU binaries)
Definition: Disassembler.h:271
size_t stubSize
data (from inner binary) size
Definition: Disassembler.h:261
ROCmRegionType type
type
Definition: Disassembler.h:309
single kernel input for disassembler
Definition: Disassembler.h:252
size_t samplerInitSize
sampler init data size
Definition: Disassembler.h:286
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:231
std::vector< ROCmDisasmRegionInput > regions
regions
Definition: Disassembler.h:318
size_t globalDataSize
global (constants for kernels) data size
Definition: Disassembler.h:280
const cxbyte * setup
data from inner binary
Definition: Disassembler.h:260
std::vector< AmdCL2RelaEntry > textRelocs
text relocations
Definition: Disassembler.h:263
disassembler input for raw code
Definition: Disassembler.h:348
const cxbyte * samplerInit
sampler init data
Definition: Disassembler.h:287
size_t globalDataSize
global (constants for kernels) data size
Definition: Disassembler.h:340
size_t codeSize
code size
Definition: Disassembler.h:351
std::vector< GalliumArgInfo > argInfos
arguments
Definition: Disassembler.h:329
CString compileOptions
compile options which used by in clBuildProgram
Definition: Disassembler.h:234
single kernel input for disassembler
Definition: Disassembler.h:212
uint32_t archStepping
GPU arch stepping.
Definition: Disassembler.h:317
size_t symbol
symbol index
Definition: Disassembler.h:94
Flags getFlags() const
get disassemblers flags
Definition: Disassembler.h:470
void flush()
write output buffer
Definition: InputOutput.h:379
DisasmException()=default
empty constructor
uint32_t archMinor
GPU arch minor.
Definition: Disassembler.h:274
std::vector< std::pair< size_t, Relocation > >::const_iterator RelocIter
relocation iterator
Definition: Disassembler.h:100
disasm ROCm kernel input
Definition: Disassembler.h:295
const cxbyte * code
code
Definition: Disassembler.h:320
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:164
disassembler class
Definition: Disassembler.h:356
size_t codeSize
size of code of kernel
Definition: Disassembler.h:264
relocation with addend
Definition: Disassembler.h:241
std::vector< AmdCL2DisasmKernelInput > kernels
kernel inputs
Definition: Disassembler.h:291
Disassembler exception class.
Definition: Disassembler.h:47
simple C-string container
Definition: CString.h:38
uint32_t offset
offset of kernel code
Definition: Disassembler.h:328