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,
58  DISASM_BUGGYFPLIT = 0x100,
59  DISASM_CODEPOS = 0x200,
60  DISASM_HSACONFIG = 0x400,
61 
63  DISASM_ALL = FLAGS_ALL&(~(DISASM_CONFIG|DISASM_BUGGYFPLIT|DISASM_HSACONFIG))
64 };
65 
66 struct GCNDisasmUtils;
67 
70 {
71 private:
72  friend struct GCNDisasmUtils; // INTERNAL LOGIC
73 public:
74  typedef std::vector<size_t>::const_iterator LabelIter;
75 
77  typedef std::vector<std::pair<size_t, CString> >::const_iterator NamedLabelIter;
78 protected:
80  struct Relocation
81  {
82  size_t symbol;
84  int64_t addend;
85  };
86 
88  typedef std::vector<std::pair<size_t, Relocation> >::const_iterator RelocIter;
89 
91  size_t startOffset;
92  size_t labelStartOffset;
93  size_t inputSize;
94  const cxbyte* input;
95  bool dontPrintLabelsAfterCode;
96  std::vector<size_t> labels;
97  std::vector<std::pair<size_t, CString> > namedLabels;
98  std::vector<CString> relSymbols;
99  std::vector<std::pair<size_t, Relocation> > relocations;
101 
103  explicit ISADisassembler(Disassembler& disassembler, cxuint outBufSize = 600);
104 
106  void writeLocation(size_t pos);
108  bool writeRelocation(size_t pos, RelocIter& relocIter);
109 
110 public:
111  virtual ~ISADisassembler();
112 
114  void writeLabelsToPosition(size_t pos, LabelIter& labelIter,
115  NamedLabelIter& namedLabelIter);
117  void writeLabelsToEnd(size_t start, LabelIter labelIter, NamedLabelIter namedLabelIter);
118 
120  void setInput(size_t inputSize, const cxbyte* input, size_t startOffset = 0,
121  size_t labelStartOffset = 0)
122  {
123  this->inputSize = inputSize;
124  this->input = input;
125  this->startOffset = startOffset;
126  this->labelStartOffset = labelStartOffset;
127  }
128 
129  void setDontPrintLabels(bool after)
130  { dontPrintLabelsAfterCode = after; }
131 
133  virtual void analyzeBeforeDisassemble() = 0;
134 
136  void clearNumberedLabels();
140  void beforeDisassemble();
142  virtual void disassemble() = 0;
143 
145  void addNamedLabel(size_t pos, const CString& name)
146  { namedLabels.push_back(std::make_pair(pos, name)); }
148  void addNamedLabel(size_t pos, CString&& name)
149  { namedLabels.push_back(std::make_pair(pos, name)); }
150 
152  size_t addRelSymbol(const CString& symName)
153  {
154  size_t index = relSymbols.size();
155  relSymbols.push_back(symName);
156  return index;
157  }
159  void addRelocation(size_t offset, RelocType type, size_t symIndex, int64_t addend)
160  { relocations.push_back(std::make_pair(offset, Relocation{symIndex, type, addend})); }
163  {
164  relSymbols.clear();
165  relocations.clear();
166  }
168  const std::vector<size_t>& getLabels() const
169  { return labels; }
171  const std::vector<std::pair<size_t, CString> >& getNamedLabels() const
172  { return namedLabels; }
174  void flushOutput()
175  { return output.flush(); }
176 };
177 
180 {
181 private:
182  bool instrOutOfCode;
183 
184  friend struct GCNDisasmUtils; // INTERNAL LOGIC
185 public:
189  ~GCNDisassembler();
190 
194  void disassemble();
195 };
196 
198 
201 {
203  size_t metadataSize;
204  const char* metadata;
205  size_t headerSize;
206  const cxbyte* header;
207  std::vector<CALNoteInput> calNotes;
208  size_t dataSize;
209  const cxbyte* data;
210  size_t codeSize;
211  const cxbyte* code;
212 };
213 
215 
218 {
220  bool is64BitMode;
223  size_t globalDataSize;
225  std::vector<AmdDisasmKernelInput> kernels;
226 };
227 
230 {
231  size_t offset;
234  int64_t addend;
235 };
236 
238 
241 {
243  size_t metadataSize;
244  const cxbyte* metadata;
247  size_t setupSize;
248  const cxbyte* setup;
249  size_t stubSize;
250  const cxbyte* stub;
251  std::vector<AmdCL2RelaEntry> textRelocs;
252  size_t codeSize;
253  const cxbyte* code;
254 };
255 
257 
260 {
262  uint32_t archMinor;
263  uint32_t archStepping;
264  bool is64BitMode;
268  size_t globalDataSize;
270  size_t rwDataSize;
271  const cxbyte* rwData;
272  size_t bssAlignment;
273  size_t bssSize;
276 
278  std::vector<std::pair<size_t, size_t> > samplerRelocs;
279  std::vector<AmdCL2DisasmKernelInput> kernels;
280 };
281 
284 {
286  const cxbyte* setup;
287  size_t codeSize;
288  size_t offset;
289 };
290 
293 {
295  size_t size;
296  size_t offset;
298 };
299 
302 {
304  uint32_t archMinor;
305  uint32_t archStepping;
306  std::vector<ROCmDisasmRegionInput> regions;
307  size_t codeSize;
308  const cxbyte* code;
309 };
310 
313 {
315  GalliumProgInfoEntry progInfo[5];
316  uint32_t offset;
317  std::vector<GalliumArgInfo> argInfos;
318 };
319 
322 {
324  bool is64BitMode;
325  bool isLLVM390;
326  bool isMesa170;
327  bool isAMDHSA;
328  size_t globalDataSize;
330  std::vector<GalliumDisasmKernelInput> kernels;
331  size_t codeSize;
332  const cxbyte* code;
333 };
334 
337 {
339  size_t codeSize;
340  const cxbyte* code;
341 };
342 
345 {
346 private:
347  friend class ISADisassembler;
348  std::unique_ptr<ISADisassembler> isaDisassembler;
349  bool fromBinary;
350  BinaryFormat binaryFormat;
351  union {
352  const AmdDisasmInput* amdInput;
353  const AmdCL2DisasmInput* amdCL2Input;
354  const GalliumDisasmInput* galliumInput;
355  const ROCmDisasmInput* rocmInput;
356  const RawCodeInput* rawInput;
357  };
358  std::ostream& output;
359  Flags flags;
360  size_t sectionCount;
361 public:
363 
368  Disassembler(const AmdMainGPUBinary32& binary, std::ostream& output,
369  Flags flags = 0);
371 
376  Disassembler(const AmdMainGPUBinary64& binary, std::ostream& output,
377  Flags flags = 0);
379 
385  Disassembler(const AmdCL2MainGPUBinary32& binary, std::ostream& output,
386  Flags flags = 0, cxuint driverVersion = 0);
388 
394  Disassembler(const AmdCL2MainGPUBinary64& binary, std::ostream& output,
395  Flags flags = 0, cxuint driverVersion = 0);
397 
402  Disassembler(const ROCmBinary& binary, std::ostream& output, Flags flags = 0);
404 
409  Disassembler(const AmdDisasmInput* disasmInput, std::ostream& output,
410  Flags flags = 0);
412 
417  Disassembler(const AmdCL2DisasmInput* disasmInput, std::ostream& output,
418  Flags flags = 0);
420 
425  Disassembler(const ROCmDisasmInput* disasmInput, std::ostream& output,
426  Flags flags = 0);
427 
429 
436  Disassembler(GPUDeviceType deviceType, const GalliumBinary& binary,
437  std::ostream& output, Flags flags = 0, cxuint llvmVersion = 0);
438 
440 
445  Disassembler(const GalliumDisasmInput* disasmInput, std::ostream& output,
446  Flags flags = 0);
447 
449  Disassembler(GPUDeviceType deviceType, size_t rawCodeSize, const cxbyte* rawCode,
450  std::ostream& output, Flags flags = 0);
451 
452  ~Disassembler();
453 
455  void disassemble();
456 
458  Flags getFlags() const
459  { return flags; }
461  void setFlags(Flags flags)
462  { this->flags = flags; }
463 
465  GPUDeviceType getDeviceType() const;
466 
469  { return amdInput; }
470 
473  { return amdCL2Input; }
474 
477  { return galliumInput; }
478 
480  const std::ostream& getOutput() const
481  { return output; }
483  std::ostream& getOutput()
484  { return output; }
485 };
486 
487 };
488 
489 #endif
common definitions for assembler and disassembler
void beforeDisassemble()
makes some things before disassemblying
size_t metadataSize
metadata size
Definition: Disassembler.h:243
const cxbyte * code
code
Definition: Disassembler.h:332
non copyable and non movable base structure (class)
Definition: Utilities.h:43
const cxbyte * header
kernel header size
Definition: Disassembler.h:206
size_t rwDataSize
global rw data size
Definition: Disassembler.h:270
bool is64BitMode
true if 64-bit mode of addressing
Definition: Disassembler.h:264
uint32_t archMinor
GPU arch minor.
Definition: Disassembler.h:304
int64_t addend
relocation addend
Definition: Disassembler.h:84
disasm kernel info structure (Gallium binaries)
Definition: Disassembler.h:312
print code position
Definition: Disassembler.h:59
main class for
Definition: Disassembler.h:69
uint32_t Flags
type for declaring various flags
Definition: Utilities.h:97
CString kernelName
kernel&#39;s name
Definition: Disassembler.h:314
internal relocation structure
Definition: Disassembler.h:80
void setInput(size_t inputSize, const cxbyte *input, size_t startOffset=0, size_t labelStartOffset=0)
set input code
Definition: Disassembler.h:120
virtual void analyzeBeforeDisassemble()=0
analyze code before disassemblying
uint32_t archStepping
GPU arch stepping.
Definition: Disassembler.h:263
size_t isaMetadataSize
metadata size
Definition: Disassembler.h:245
size_t dataSize
data (from inner binary) size
Definition: Disassembler.h:208
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:231
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:100
const cxbyte * code
code
Definition: Disassembler.h:340
size_t setupSize
data (from inner binary) size
Definition: Disassembler.h:247
AMD OpenCL 2.0 binaries handling.
CString kernelName
kernel name
Definition: Disassembler.h:285
size_t codeSize
code size
Definition: Disassembler.h:331
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:221
size_t globalDataSize
global (constants for kernels) data size
Definition: Disassembler.h:223
CString aclVersionString
acl version string
Definition: Disassembler.h:267
const cxbyte * data
data from inner binary
Definition: Disassembler.h:209
void clearRelocations()
clear all relocations
Definition: Disassembler.h:162
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:148
void setFlags(Flags flags)
get disassemblers flags
Definition: Disassembler.h:461
disasm ROCm region
Definition: Disassembler.h:292
std::vector< CString > relSymbols
symbols used by relocations
Definition: Disassembler.h:98
RelocType type
relocation type
Definition: Disassembler.h:83
const AmdCL2DisasmInput * getAmdCL2Input() const
get disassembler input
Definition: Disassembler.h:472
void addNamedLabel(size_t pos, const CString &name)
add named label to list (must be called before disassembly)
Definition: Disassembler.h:145
ISADisassembler(Disassembler &disassembler, cxuint outBufSize=600)
constructor
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:303
const char * metadata
kernel&#39;s metadata
Definition: Disassembler.h:204
GCN architectur dissassembler.
Definition: Disassembler.h:179
dump code
Definition: Disassembler.h:50
const cxbyte * globalData
global (constants for kernels) data
Definition: Disassembler.h:269
size_t bssSize
size of global bss section
Definition: Disassembler.h:273
std::vector< GalliumDisasmKernelInput > kernels
list of input kernels
Definition: Disassembler.h:330
std::vector< size_t >::const_iterator LabelIter
label iterator
Definition: Disassembler.h:74
std::vector< std::pair< size_t, size_t > > samplerRelocs
sampler relocations
Definition: Disassembler.h:278
ROCm binaries handling.
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:338
bool isAMDHSA
if AMDHSA (LLVM 4.0)
Definition: Disassembler.h:327
whole disassembler input (for Gallium driver GPU binaries)
Definition: Disassembler.h:321
whole disassembler input (for AMD Catalyst driver GPU binaries)
Definition: Disassembler.h:217
Definition: GalliumBinaries.h:246
std::vector< size_t > labels
list of local labels
Definition: Disassembler.h:96
CString kernelName
kernel name
Definition: Disassembler.h:242
std::vector< std::pair< size_t, Relocation > > relocations
relocations
Definition: Disassembler.h:99
virtual void disassemble()=0
disassembles input code
Configuration header.
size_t codeSize
code size
Definition: Disassembler.h:307
cxuint RelocType
relocation type
Definition: Commons.h:33
const cxbyte * rwData
global rw data data
Definition: Disassembler.h:271
dump metadatas
Definition: Disassembler.h:51
const cxbyte * metadata
kernel&#39;s metadata
Definition: Disassembler.h:244
std::vector< CALNoteInput > calNotes
ATI CAL notes.
Definition: Disassembler.h:207
const cxbyte * setup
setup
Definition: Disassembler.h:286
void prepareLabelsAndRelocations()
last part before disassemble - prepare labels (sorting)
size_t inputSize
< start offset of labels
Definition: Disassembler.h:93
const cxbyte * stub
data from inner binary
Definition: Disassembler.h:250
const cxbyte * globalData
global (constants for kernels) data
Definition: Disassembler.h:224
dump datas
Definition: Disassembler.h:52
const cxbyte * isaMetadata
kernel&#39;s metadata
Definition: Disassembler.h:246
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:220
CString compileOptions
compile options which used by in clBuildProgram
Definition: Disassembler.h:266
bool isMesa170
if >=Mesa3D 17.0
Definition: Disassembler.h:326
print in comments float literals
Definition: Disassembler.h:54
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:261
void flushOutput()
flush output
Definition: Disassembler.h:174
size_t metadataSize
metadata size
Definition: Disassembler.h:203
GalliumCompute binaries handling (only with LLVM 3.6)
input output utilities
const AmdDisasmInput * getAmdInput() const
get disassembler input
Definition: Disassembler.h:468
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:323
AMD binaries handling.
unsigned char cxbyte
unsigned byte
Definition: Config.h:213
size_t size
region size
Definition: Disassembler.h:295
print on left side hexadecimal code
Definition: Disassembler.h:55
const cxbyte * globalData
global (constants for kernels) data
Definition: Disassembler.h:329
cxuint driverVersion
driver version
Definition: Disassembler.h:265
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:301
AMD main binary for GPU for 64-bit mode.
Definition: AmdBinaries.h:611
std::ostream & getOutput()
get output stream
Definition: Disassembler.h:483
Disassembler & disassembler
disassembler instance
Definition: Disassembler.h:90
const cxbyte * code
code of kernel
Definition: Disassembler.h:211
const std::ostream & getOutput() const
get output stream
Definition: Disassembler.h:480
unsigned int cxuint
unsigned int
Definition: Config.h:221
std::vector< AmdDisasmKernelInput > kernels
kernel inputs
Definition: Disassembler.h:225
dump ATI CAL notes
Definition: Disassembler.h:53
const cxbyte * code
code of kernel
Definition: Disassembler.h:253
void addRelocation(size_t offset, RelocType type, size_t symIndex, int64_t addend)
add relocation
Definition: Disassembler.h:159
size_t codeSize
size of code of kernel
Definition: Disassembler.h:210
size_t codeSize
code size
Definition: Disassembler.h:287
size_t offset
region offset in code
Definition: Disassembler.h:296
void writeLocation(size_t pos)
write location in the code
int64_t addend
addend
Definition: Disassembler.h:234
CString regionName
region name
Definition: Disassembler.h:294
const cxbyte * input
input code
Definition: Disassembler.h:94
bool writeRelocation(size_t pos, RelocIter &relocIter)
write relocation to current place in instruction
print HSA configuration
Definition: Disassembler.h:60
const std::vector< size_t > & getLabels() const
get numbered labels
Definition: Disassembler.h:168
std::vector< std::pair< size_t, CString > > namedLabels
named labels
Definition: Disassembler.h:97
std::vector< std::pair< size_t, CString > >::const_iterator NamedLabelIter
named label iterator
Definition: Disassembler.h:77
size_t startOffset
start offset
Definition: Disassembler.h:91
bool isLLVM390
if >=LLVM3.9
Definition: Disassembler.h:325
GPUDeviceType
type of GPU device
Definition: GPUId.h:38
const GalliumDisasmInput * getGalliumInput() const
get disassembler input
Definition: Disassembler.h:476
cxuint symbol
symbol
Definition: Disassembler.h:233
size_t bssAlignment
alignment of global bss section
Definition: Disassembler.h:272
bool is64BitMode
true if 64-bit mode of addressing
Definition: Disassembler.h:324
size_t headerSize
kernel header size
Definition: Disassembler.h:205
utilities for other libraries and programs
size_t offset
kernel offset
Definition: Disassembler.h:288
AMD main binary for GPU for 32-bit mode.
Definition: AmdBinaries.h:567
CString kernelName
kernel name
Definition: Disassembler.h:202
const std::vector< std::pair< size_t, CString > > & getNamedLabels() const
get named labels
Definition: Disassembler.h:171
AMD binaries generator.
RelocType type
relocation type
Definition: Disassembler.h:232
whole disassembler input (for AMD Catalyst driver GPU binaries)
Definition: Disassembler.h:259
size_t stubSize
data (from inner binary) size
Definition: Disassembler.h:249
ROCmRegionType type
type
Definition: Disassembler.h:297
single kernel input for disassembler
Definition: Disassembler.h:240
size_t samplerInitSize
sampler init data size
Definition: Disassembler.h:274
GPUDeviceType deviceType
GPU device type.
Definition: Disassembler.h:219
std::vector< ROCmDisasmRegionInput > regions
regions
Definition: Disassembler.h:306
size_t globalDataSize
global (constants for kernels) data size
Definition: Disassembler.h:268
const cxbyte * setup
data from inner binary
Definition: Disassembler.h:248
std::vector< AmdCL2RelaEntry > textRelocs
text relocations
Definition: Disassembler.h:251
disassembler input for raw code
Definition: Disassembler.h:336
const cxbyte * samplerInit
sampler init data
Definition: Disassembler.h:275
size_t globalDataSize
global (constants for kernels) data size
Definition: Disassembler.h:328
size_t codeSize
code size
Definition: Disassembler.h:339
std::vector< GalliumArgInfo > argInfos
arguments
Definition: Disassembler.h:317
CString compileOptions
compile options which used by in clBuildProgram
Definition: Disassembler.h:222
single kernel input for disassembler
Definition: Disassembler.h:200
uint32_t archStepping
GPU arch stepping.
Definition: Disassembler.h:305
size_t symbol
symbol index
Definition: Disassembler.h:82
Flags getFlags() const
get disassemblers flags
Definition: Disassembler.h:458
void flush()
write output buffer
Definition: InputOutput.h:379
uint32_t archMinor
GPU arch minor.
Definition: Disassembler.h:262
std::vector< std::pair< size_t, Relocation > >::const_iterator RelocIter
relocation iterator
Definition: Disassembler.h:88
disasm ROCm kernel input
Definition: Disassembler.h:283
const cxbyte * code
code
Definition: Disassembler.h:308
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:152
disassembler class
Definition: Disassembler.h:344
size_t codeSize
size of code of kernel
Definition: Disassembler.h:252
relocation with addend
Definition: Disassembler.h:229
std::vector< AmdCL2DisasmKernelInput > kernels
kernel inputs
Definition: Disassembler.h:279
simple C-string container
Definition: CString.h:38
uint32_t offset
offset of kernel code
Definition: Disassembler.h:316