CLRX  1
An unofficial OpenCL extensions designed for Radeon GPUs
AsmSource.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_ASMSOURCE_H__
24 #define __CLRX_ASMSOURCE_H__
25 
26 #include <CLRX/Config.h>
27 #include <cstdint>
28 #include <string>
29 #include <istream>
30 #include <ostream>
31 #include <vector>
32 #include <utility>
33 #include <memory>
34 #include <CLRX/amdasm/Commons.h>
35 #include <CLRX/utils/Utilities.h>
36 
38 namespace CLRX
39 {
40 
41 class Assembler;
42 
44 struct LineCol
45 {
47 
50 };
51 
52 /*
53  * assembler source position
54  */
55 
57 enum class AsmSourceType : cxbyte
58 {
59  FILE,
60  MACRO,
61  REPT
62 };
63 
66 {
68 
70  explicit AsmSource(AsmSourceType _type) : type(_type)
71  { }
73  virtual ~AsmSource();
74 };
75 
77 struct AsmFile: public AsmSource
78 {
84  const CString file;
85 
87  explicit AsmFile(const CString& _file) :
88  AsmSource(AsmSourceType::FILE), lineNo(1), file(_file)
89  { }
90 
92  AsmFile(const RefPtr<const AsmSource> _parent, LineNo _lineNo, ColNo _colNo,
93  const CString& _file) : AsmSource(AsmSourceType::FILE),
94  parent(_parent), lineNo(_lineNo), colNo(_colNo), file(_file)
95  { }
97  virtual ~AsmFile();
98 };
99 
102 {
109 
111  AsmMacroSubst(RefPtr<const AsmSource> _source, LineNo _lineNo, ColNo _colNo) :
112  source(_source), lineNo(_lineNo), colNo(_colNo)
113  { }
116  LineNo _lineNo, ColNo _colNo) : parent(_parent), source(_source),
117  lineNo(_lineNo), colNo(_colNo)
118  { }
119 };
120 
122 struct AsmMacroSource: public AsmSource
123 {
126 
129  : AsmSource(AsmSourceType::MACRO), macro(_macro), source(_source)
130  { }
132  virtual ~AsmMacroSource();
133 };
134 
137 {
139  uint64_t repeatCount;
140  uint64_t repeatsNum;
141 
143  AsmRepeatSource(RefPtr<const AsmSource> _source, uint64_t _repeatCount,
144  uint64_t _repeatsNum) : AsmSource(AsmSourceType::REPT), source(_source),
145  repeatCount(_repeatCount), repeatsNum(_repeatsNum)
146  { }
148  virtual ~AsmRepeatSource();
149 };
150 
153 {
159 
161  void print(std::ostream& os, cxuint indentLevel = 0) const;
162 };
163 
165 struct LineTrans
166 {
168  ssize_t position;
170 };
171 
174 {
177  bool vararg;
178  bool required;
179 };
180 
183 {
184 public:
186  struct SourceTrans
187  {
190  };
191 private:
192  LineNo contentLineNo;
193  AsmSourcePos sourcePos;
194  Array<AsmMacroArg> args;
195  std::vector<char> content;
196  std::vector<SourceTrans> sourceTranslations;
197  std::vector<LineTrans> colTranslations;
198 public:
200  AsmMacro(const AsmSourcePos& pos, const Array<AsmMacroArg>& args);
202  AsmMacro(const AsmSourcePos& pos, Array<AsmMacroArg>&& args);
203 
205 
212  void addLine(RefPtr<const AsmMacroSubst> macro, RefPtr<const AsmSource> source,
213  const std::vector<LineTrans>& colTrans, size_t lineSize, const char* line);
215  const std::vector<LineTrans>& getColTranslations() const
216  { return colTranslations; }
218  const std::vector<char>& getContent() const
219  { return content; }
221  size_t getSourceTransSize() const
222  { return sourceTranslations.size(); }
224  const SourceTrans& getSourceTrans(uint64_t index) const
225  { return sourceTranslations[index]; }
227  const AsmSourcePos& getSourcePos() const
228  { return sourcePos; }
230  const size_t getArgsNum() const
231  { return args.size(); }
233  const AsmMacroArg& getArg(size_t i) const
234  { return args[i]; }
235 };
236 
239 {
240 public:
242  struct SourceTrans
243  {
247  };
248 protected:
251  uint64_t repeatsNum;
252  std::vector<char> content;
253  std::vector<SourceTrans> sourceTranslations;
254  std::vector<LineTrans> colTranslations;
255 public:
257  explicit AsmRepeat(const AsmSourcePos& pos, uint64_t repeatsNum);
258 
260 
267  void addLine(RefPtr<const AsmMacroSubst> macro, RefPtr<const AsmSource> source,
268  const std::vector<LineTrans>& colTrans, size_t lineSize, const char* line);
270  const std::vector<LineTrans>& getColTranslations() const
271  { return colTranslations; }
273  const std::vector<char>& getContent() const
274  { return content; }
276  size_t getSourceTransSize() const
277  { return sourceTranslations.size(); }
279  const SourceTrans& getSourceTrans(uint64_t index) const
280  { return sourceTranslations[index]; }
282  const AsmSourcePos& getSourcePos() const
283  { return sourcePos; }
285  uint64_t getRepeatsNum() const
286  { return repeatsNum; }
287 };
288 
290 class AsmIRP: public AsmRepeat
291 {
292 private:
293  bool irpc; // is irpc
294  CString symbolName;
295  Array<CString> symValues;
296 public:
298  explicit AsmIRP(const AsmSourcePos& pos, const CString& symbolName,
299  const CString& symValString);
301  explicit AsmIRP(const AsmSourcePos& pos, const CString& symbolName,
302  const Array<CString>& symValues);
304  explicit AsmIRP(const AsmSourcePos& pos, const CString& symbolName,
305  Array<CString>&& symValues);
307  const CString& getSymbolName() const
308  { return symbolName; }
310  const CString& getSymbolValue(size_t i) const
311  { return symValues[i]; }
313  bool isIRPC() const
314  { return irpc; }
315 };
316 
319 {
320  STREAM = 0,
321  REPEAT,
322  MACROSUBST
323 };
324 
327 {
328 protected:
330  size_t pos;
333  std::vector<char> buffer;
334  std::vector<LineTrans> colTranslations;
336 
338  explicit AsmInputFilter(AsmInputFilterType _type): type(_type), pos(0), lineNo(1)
339  { }
343  : type(_type), pos(0), macroSubst(_macroSubst), source(_source), lineNo(1)
344  { }
345 public:
347  virtual ~AsmInputFilter();
348 
350  virtual const char* readLine(Assembler& assembler, size_t& lineSize) = 0;
351 
354  { return lineNo; }
355 
357 
361  LineCol translatePos(size_t position) const;
362 
364  const std::vector<LineTrans> getColTranslations() const
365  { return colTranslations; }
366 
369  { return source; }
372  { return macroSubst; }
373 
375  AsmSourcePos getSourcePos(size_t position) const
376  {
377  LineCol lineCol = translatePos(position);
378  return { macroSubst, source, lineCol.lineNo, lineCol.colNo };
379  }
382  { return type; }
383 };
384 
386 
390 {
391 private:
392  enum class LineMode: cxbyte
393  {
394  NORMAL = 0,
395  LSTRING,
396  STRING,
397  LONG_COMMENT,
398  LINE_COMMENT
399  };
400 
401  bool managed;
402  std::istream* stream;
403  LineMode mode;
404  size_t stmtPos;
405 
406 public:
408  explicit AsmStreamInputFilter(std::istream& is, const CString& filename = "");
410  explicit AsmStreamInputFilter(const CString& filename);
412  AsmStreamInputFilter(const AsmSourcePos& pos, std::istream& is,
413  const CString& filename = "");
415  AsmStreamInputFilter(const AsmSourcePos& pos, const CString& filename);
418 
419  const char* readLine(Assembler& assembler, size_t& lineSize);
420 };
421 
424 {
425 public:
429  typedef std::unordered_map<CString, uint64_t> MacroLocalMap;
430 private:
431  RefPtr<const AsmMacro> macro;
432  MacroArgMap argMap;
433  MacroLocalMap localMap;
434 
435  uint64_t macroCount;
436  LineNo contentLineNo;
437  size_t sourceTransIndex;
438  const LineTrans* curColTrans;
439  size_t realLinePos;
440  bool alternateMacro;
441 public:
444  const MacroArgMap& argMap, uint64_t macroCount, bool alternateMacro);
447  MacroArgMap&& argMap, uint64_t macroCount, bool alternateMacro);
448 
449  const char* readLine(Assembler& assembler, size_t& lineSize);
451  bool addLocal(const CString& name, uint64_t localNo);
452 };
453 
456 {
457 private:
458  std::unique_ptr<const AsmRepeat> repeat;
459  uint64_t repeatCount;
460  LineNo contentLineNo;
461  size_t sourceTransIndex;
462  const LineTrans* curColTrans;
463 public:
465  explicit AsmRepeatInputFilter(const AsmRepeat* repeat);
466 
467  const char* readLine(Assembler& assembler, size_t& lineSize);
468 
470  uint64_t getRepeatCount() const
471  { return repeatCount; }
472 };
473 
476 {
477 private:
478  std::unique_ptr<const AsmIRP> irp;
479  uint64_t repeatCount;
480  LineNo contentLineNo;
481  size_t sourceTransIndex;
482  const LineTrans* curColTrans;
483  size_t realLinePos;
484 public:
486  explicit AsmIRPInputFilter(const AsmIRP* irp);
487 
488  const char* readLine(Assembler& assembler, size_t& lineSize);
489 
491  uint64_t getRepeatCount() const
492  { return repeatCount; }
493 };
494 
495 };
496 
497 #endif
AsmRepeatInputFilter or AsmIRPInputFilter.
assembler macro aegument
Definition: AsmSource.h:173
common definitions for assembler and disassembler
main class of assembler
Definition: Assembler.h:401
line translations
Definition: AsmSource.h:165
RefPtr< const AsmSource > source
source of substituted content
Definition: AsmSource.h:125
const AsmSourcePos & getSourcePos() const
get source position
Definition: AsmSource.h:282
assembler IRP pseudo-op input filter
Definition: AsmSource.h:475
non copyable and non movable base structure (class)
Definition: Utilities.h:43
RefPtr< const AsmSource > source
source
Definition: AsmSource.h:246
LineNo lineNo
current line number
Definition: AsmSource.h:335
assembler repeat
Definition: AsmSource.h:238
AsmSourceType type
type of Asm source (file or macro)
Definition: AsmSource.h:67
assembler macro
Definition: AsmSource.h:182
const size_t getArgsNum() const
get number of arguments
Definition: AsmSource.h:230
uint64_t getRepeatsNum() const
get number of repetitions
Definition: AsmSource.h:285
const SourceTrans & getSourceTrans(uint64_t index) const
get source translation
Definition: AsmSource.h:279
ColNo colNo
column number, for macro substitution and IRP points to column preprocessed line
Definition: AsmSource.h:49
AsmSourceType
source type
Definition: AsmSource.h:57
AsmMacroSubst(RefPtr< const AsmMacroSubst > _parent, RefPtr< const AsmSource > _source, LineNo _lineNo, ColNo _colNo)
constructor with parent macro substitution
Definition: AsmSource.h:115
AsmFile(const CString &_file)
constructor
Definition: AsmSource.h:87
reference pointer based on Glibmm refptr
Definition: Utilities.h:774
assembler repeat input filter
Definition: AsmSource.h:455
bool isIRPC() const
get if IRPC
Definition: AsmSource.h:313
assembler macro input filter (for macro filtering)
Definition: AsmSource.h:423
AsmInputFilter(RefPtr< const AsmMacroSubst > _macroSubst, RefPtr< const AsmSource > _source, AsmInputFilterType _type)
constructor with macro substitution and source
Definition: AsmSource.h:341
assembler input layout filter
Definition: AsmSource.h:389
RefPtr< const AsmSource > source
current source
Definition: AsmSource.h:332
const CString & getSymbolName() const
get number of repetitions
Definition: AsmSource.h:307
source translation
Definition: AsmSource.h:186
ssize_t position
position in joined line, can be negative if filtered line is statement
Definition: AsmSource.h:168
AsmMacroSource(RefPtr< const AsmMacroSubst > _macro, RefPtr< const AsmSource > _source)
construcror
Definition: AsmSource.h:128
AsmRepeatSource(RefPtr< const AsmSource > _source, uint64_t _repeatCount, uint64_t _repeatsNum)
constructor
Definition: AsmSource.h:143
RefPtr< const AsmSource > source
source of content where macro substituted
Definition: AsmSource.h:106
an array class
Definition: Containers.h:38
AsmSourcePos sourcePos
current source position
Definition: AsmSource.h:250
ColNo colNo
column number
Definition: AsmSource.h:157
size_t pos
position in content
Definition: AsmSource.h:330
RefPtr< const AsmMacroSubst > macro
macro substitution in which message occurred
Definition: AsmSource.h:154
CString name
name
Definition: AsmSource.h:175
AsmInputFilterType
type of AsmInputFilter
Definition: AsmSource.h:318
line and column
Definition: AsmSource.h:44
LineNo getLineNo() const
get current line number after reading line
Definition: AsmSource.h:353
uint64_t getRepeatCount() const
get current repeat count
Definition: AsmSource.h:470
const AsmMacroArg & getArg(size_t i) const
get argument
Definition: AsmSource.h:233
LineNo lineNo
line number of top-most source
Definition: AsmSource.h:156
AsmStreamInputFilter.
size_t ColNo
column number type
Definition: Utilities.h:78
LineNo lineNo
line number
Definition: AsmSource.h:188
std::vector< LineTrans > colTranslations
column translations
Definition: AsmSource.h:334
Array< std::pair< CString, CString > > MacroArgMap
macro argument map type
Definition: AsmSource.h:427
uint64_t repeatsNum
number of all repetitions
Definition: AsmSource.h:140
RefPtr< const AsmSource > getSource() const
get current source after reading line
Definition: AsmSource.h:368
LineNo lineNo
line number
Definition: AsmSource.h:244
std::vector< LineTrans > colTranslations
column translations
Definition: AsmSource.h:254
RefPtr< const AsmSource > source
source in which message occurred
Definition: AsmSource.h:155
reference countable object (only for single threading usage)
Definition: Utilities.h:750
main namespace
Definition: AsmDefs.h:38
ColNo colNo
place in line where file is included
Definition: AsmSource.h:83
const AsmSourcePos * exprSourcePos
expression sourcepos from what evaluation made
Definition: AsmSource.h:158
LineNo contentLineNo
number of content&#39;s line
Definition: AsmSource.h:249
assembler IRP
Definition: AsmSource.h:290
const std::vector< LineTrans > getColTranslations() const
returns column translations after reading line
Definition: AsmSource.h:364
descriptor of assembler repetition
Definition: AsmSource.h:136
RefPtr< const AsmSource > source
source of content
Definition: AsmSource.h:138
bool vararg
is variadic argument
Definition: AsmSource.h:177
size_t getSourceTransSize() const
get source translations size
Definition: AsmSource.h:276
RefPtr< const AsmSource > source
source
Definition: AsmSource.h:189
const AsmSourcePos & getSourcePos() const
get source position
Definition: AsmSource.h:227
macro substitution
descriptor of file inclusion
Definition: AsmSource.h:77
AsmFile(const RefPtr< const AsmSource > _parent, LineNo _lineNo, ColNo _colNo, const CString &_file)
constructor with parent file inclustion
Definition: AsmSource.h:92
AsmInputFilter(AsmInputFilterType _type)
empty constructor
Definition: AsmSource.h:338
LineNo lineNo
place where file is included (0 if root)
Definition: AsmSource.h:82
AsmInputFilterType type
input filter type
Definition: AsmSource.h:329
RefPtr< const AsmSource > parent
parent source for this source (for file is parent file or macro substitution, for macro substitution ...
Definition: AsmSource.h:81
utilities for other libraries and programs
const CString & getSymbolValue(size_t i) const
get symbol value or string
Definition: AsmSource.h:310
RefPtr< const AsmMacroSubst > parent
parent source for this source (for file is parent file or macro substitution, for macro substitution ...
Definition: AsmSource.h:105
uint64_t getRepeatCount() const
get current repeat count
Definition: AsmSource.h:491
AsmInputFilterType getType() const
get input filter type
Definition: AsmSource.h:381
std::vector< SourceTrans > sourceTranslations
source translations
Definition: AsmSource.h:253
uint64_t repeatCount
number of repetition
Definition: AsmSource.h:139
bool required
is required
Definition: AsmSource.h:178
LineNo lineNo
source code line number
Definition: AsmSource.h:169
AsmMacroSubst(RefPtr< const AsmSource > _source, LineNo _lineNo, ColNo _colNo)
constructor
Definition: AsmSource.h:111
AsmSourcePos getSourcePos(size_t position) const
get source position after reading line
Definition: AsmSource.h:375
uint64_t repeatsNum
repeats number
Definition: AsmSource.h:251
descriptor assembler macro substitution
Definition: AsmSource.h:101
descriptor of macro source (used in source fields)
Definition: AsmSource.h:122
RefPtr< const AsmMacroSubst > macro
macro substitution
Definition: AsmSource.h:245
uint64_t LineNo
line number type
Definition: Utilities.h:75
const SourceTrans & getSourceTrans(uint64_t index) const
get source translations
Definition: AsmSource.h:224
size_t size() const
returns number of elements
Definition: Containers.h:169
std::vector< char > buffer
buffer of line (can be not used)
Definition: AsmSource.h:333
LineNo lineNo
line number
Definition: AsmSource.h:46
const std::vector< LineTrans > & getColTranslations() const
get column translations
Definition: AsmSource.h:215
source translations
Definition: AsmSource.h:242
assembler input filter for reading lines
Definition: AsmSource.h:326
std::unordered_map< CString, uint64_t > MacroLocalMap
macro local map type (key - name of variable, value - number of local label)
Definition: AsmSource.h:429
CString defaultValue
default value
Definition: AsmSource.h:176
RefPtr< const AsmMacroSubst > getMacroSubst() const
get current macro substitution after reading line
Definition: AsmSource.h:371
std::vector< char > content
content
Definition: AsmSource.h:252
RefPtr< const AsmMacroSubst > macro
macro substition
Definition: AsmSource.h:124
size_t getSourceTransSize() const
get source translations size
Definition: AsmSource.h:221
const CString file
file path
Definition: AsmSource.h:84
ColNo colNo
place in line where macro substituted
Definition: AsmSource.h:108
descriptor of assembler source for source position
Definition: AsmSource.h:65
const std::vector< LineTrans > & getColTranslations() const
get column translations
Definition: AsmSource.h:270
simple C-string container
Definition: CString.h:38
LineNo lineNo
place where macro substituted
Definition: AsmSource.h:107
const std::vector< char > & getContent() const
get content of repetition
Definition: AsmSource.h:273
AsmSource(AsmSourceType _type)
constructor
Definition: AsmSource.h:70
const std::vector< char > & getContent() const
get content vector
Definition: AsmSource.h:218
RefPtr< const AsmMacroSubst > macroSubst
current macro substitution
Definition: AsmSource.h:331
assembler source position
Definition: AsmSource.h:152