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-2018 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 class AsmExpression;
43 
45 struct LineCol
46 {
48 
51 };
52 
53 /*
54  * assembler source position
55  */
56 
58 enum class AsmSourceType : cxbyte
59 {
60  FILE,
61  MACRO,
62  REPT
63 };
64 
67 {
69 
71  explicit AsmSource(AsmSourceType _type) : type(_type)
72  { }
74  virtual ~AsmSource();
75 };
76 
78 struct AsmFile: public AsmSource
79 {
85  const CString file;
86 
88  explicit AsmFile(const CString& _file) :
89  AsmSource(AsmSourceType::FILE), lineNo(1), file(_file)
90  { }
91 
93  AsmFile(const RefPtr<const AsmSource> _parent, LineNo _lineNo, ColNo _colNo,
94  const CString& _file) : AsmSource(AsmSourceType::FILE),
95  parent(_parent), lineNo(_lineNo), colNo(_colNo), file(_file)
96  { }
98  virtual ~AsmFile();
99 };
100 
103 {
110 
112  AsmMacroSubst(RefPtr<const AsmSource> _source, LineNo _lineNo, ColNo _colNo) :
113  source(_source), lineNo(_lineNo), colNo(_colNo)
114  { }
117  LineNo _lineNo, ColNo _colNo) : parent(_parent), source(_source),
118  lineNo(_lineNo), colNo(_colNo)
119  { }
120 };
121 
123 struct AsmMacroSource: public AsmSource
124 {
127 
130  : AsmSource(AsmSourceType::MACRO), macro(_macro), source(_source)
131  { }
133  virtual ~AsmMacroSource();
134 };
135 
138 {
140  uint64_t repeatCount;
141  uint64_t repeatsNum;
142 
144  AsmRepeatSource(RefPtr<const AsmSource> _source, uint64_t _repeatCount,
145  uint64_t _repeatsNum) : AsmSource(AsmSourceType::REPT), source(_source),
146  repeatCount(_repeatCount), repeatsNum(_repeatsNum)
147  { }
149  virtual ~AsmRepeatSource();
150 };
151 
154 {
160 
162  void print(std::ostream& os, cxuint indentLevel = 0) const;
163 };
164 
166 struct LineTrans
167 {
169  ssize_t position;
171 };
172 
175 {
178  bool vararg;
179  bool required;
180 };
181 
184 {
185 public:
187  struct SourceTrans
188  {
191  };
192 private:
193  LineNo contentLineNo;
194  AsmSourcePos sourcePos;
195  Array<AsmMacroArg> args;
196  std::vector<char> content;
197  std::vector<SourceTrans> sourceTranslations;
198  std::vector<LineTrans> colTranslations;
199 public:
201  AsmMacro(const AsmSourcePos& pos, const Array<AsmMacroArg>& args);
203  AsmMacro(const AsmSourcePos& pos, Array<AsmMacroArg>&& args);
204 
206 
213  void addLine(RefPtr<const AsmMacroSubst> macro, RefPtr<const AsmSource> source,
214  const std::vector<LineTrans>& colTrans, size_t lineSize, const char* line);
216  const std::vector<LineTrans>& getColTranslations() const
217  { return colTranslations; }
219  const std::vector<char>& getContent() const
220  { return content; }
222  size_t getSourceTransSize() const
223  { return sourceTranslations.size(); }
225  const SourceTrans& getSourceTrans(uint64_t index) const
226  { return sourceTranslations[index]; }
228  const AsmSourcePos& getSourcePos() const
229  { return sourcePos; }
231  const size_t getArgsNum() const
232  { return args.size(); }
234  const AsmMacroArg& getArg(size_t i) const
235  { return args[i]; }
236 };
237 
240 {
241 public:
243  struct SourceTrans
244  {
248  };
249 protected:
252  uint64_t repeatsNum;
253  std::vector<char> content;
254  std::vector<SourceTrans> sourceTranslations;
255  std::vector<LineTrans> colTranslations;
256 public:
258  explicit AsmRepeat(const AsmSourcePos& pos, uint64_t repeatsNum);
259  virtual ~AsmRepeat();
260 
262 
269  void addLine(RefPtr<const AsmMacroSubst> macro, RefPtr<const AsmSource> source,
270  const std::vector<LineTrans>& colTrans, size_t lineSize, const char* line);
272  const std::vector<LineTrans>& getColTranslations() const
273  { return colTranslations; }
275  const std::vector<char>& getContent() const
276  { return content; }
278  size_t getSourceTransSize() const
279  { return sourceTranslations.size(); }
281  const SourceTrans& getSourceTrans(uint64_t index) const
282  { return sourceTranslations[index]; }
284  const AsmSourcePos& getSourcePos() const
285  { return sourcePos; }
287  uint64_t getRepeatsNum() const
288  { return repeatsNum; }
289 };
290 
292 class AsmFor: public AsmRepeat
293 {
294 private:
295  void* iterSymEntry;
296  std::unique_ptr<AsmExpression> condExpr;
297  std::unique_ptr<AsmExpression> nextExpr;
298 public:
300  explicit AsmFor(const AsmSourcePos& pos, void* iterSymEntry,
301  AsmExpression* condExpr, AsmExpression* nextExpr);
302 
303  virtual ~AsmFor();
304 
306  const void* getIterSymEntry() const
307  { return iterSymEntry; }
309  const AsmExpression* getCondExpr() const
310  { return condExpr.get(); }
312  const AsmExpression* getNextExpr() const
313  { return nextExpr.get(); }
314 };
315 
317 class AsmIRP: public AsmRepeat
318 {
319 private:
320  bool irpc; // is irpc
321  CString symbolName;
322  Array<CString> symValues;
323 public:
325  explicit AsmIRP(const AsmSourcePos& pos, const CString& symbolName,
326  const CString& symValString);
328  explicit AsmIRP(const AsmSourcePos& pos, const CString& symbolName,
329  const Array<CString>& symValues);
331  explicit AsmIRP(const AsmSourcePos& pos, const CString& symbolName,
332  Array<CString>&& symValues);
334  const CString& getSymbolName() const
335  { return symbolName; }
337  const CString& getSymbolValue(size_t i) const
338  { return symValues[i]; }
340  bool isIRPC() const
341  { return irpc; }
342 };
343 
346 {
347  STREAM = 0,
348  REPEAT,
349  MACROSUBST
350 };
351 
354 {
355 protected:
357  size_t pos;
360  std::vector<char> buffer;
361  std::vector<LineTrans> colTranslations;
363 
365  explicit AsmInputFilter(AsmInputFilterType _type): type(_type), pos(0), lineNo(1)
366  { }
370  : type(_type), pos(0), macroSubst(_macroSubst), source(_source), lineNo(1)
371  { }
372 public:
374  virtual ~AsmInputFilter();
375 
377  virtual const char* readLine(Assembler& assembler, size_t& lineSize) = 0;
378 
381  { return lineNo; }
382 
384 
388  LineCol translatePos(size_t position) const;
389 
391  const std::vector<LineTrans> getColTranslations() const
392  { return colTranslations; }
393 
396  { return source; }
399  { return macroSubst; }
400 
402  AsmSourcePos getSourcePos(size_t position) const
403  {
404  LineCol lineCol = translatePos(position);
405  return { macroSubst, source, lineCol.lineNo, lineCol.colNo };
406  }
409  { return type; }
410 };
411 
413 
417 {
418 private:
419  enum class LineMode: cxbyte
420  {
421  NORMAL = 0,
422  LSTRING,
423  STRING,
424  LONG_COMMENT,
425  LINE_COMMENT
426  };
427 
428  bool managed;
429  std::istream* stream;
430  LineMode mode;
431  size_t stmtPos;
432 
433 public:
435  explicit AsmStreamInputFilter(std::istream& is, const CString& filename = "");
437  explicit AsmStreamInputFilter(const CString& filename);
439  AsmStreamInputFilter(const AsmSourcePos& pos, std::istream& is,
440  const CString& filename = "");
442  AsmStreamInputFilter(const AsmSourcePos& pos, const CString& filename);
445 
446  const char* readLine(Assembler& assembler, size_t& lineSize);
447 };
448 
451 {
452 public:
456  typedef std::unordered_map<CString, uint64_t> MacroLocalMap;
457 private:
458  RefPtr<const AsmMacro> macro;
459  MacroArgMap argMap;
460  MacroLocalMap localMap;
461 
462  uint64_t macroCount;
463  LineNo contentLineNo;
464  size_t sourceTransIndex;
465  const LineTrans* curColTrans;
466  size_t realLinePos;
467  bool alternateMacro;
468 public:
471  const MacroArgMap& argMap, uint64_t macroCount, bool alternateMacro);
474  MacroArgMap&& argMap, uint64_t macroCount, bool alternateMacro);
475 
476  const char* readLine(Assembler& assembler, size_t& lineSize);
478  bool addLocal(const CString& name, uint64_t localNo);
479 };
480 
483 {
484 protected:
485  std::unique_ptr<const AsmRepeat> repeat;
486  uint64_t repeatCount;
487  LineNo contentLineNo;
488  size_t sourceTransIndex;
489  const LineTrans* curColTrans;
490 public:
492  explicit AsmRepeatInputFilter(const AsmRepeat* repeat);
493 
494  const char* readLine(Assembler& assembler, size_t& lineSize);
495 
497  uint64_t getRepeatCount() const
498  { return repeatCount; }
499 };
500 
503 {
504 public:
506  explicit AsmForInputFilter(const AsmFor* forRpt);
507 
508  const char* readLine(Assembler& assembler, size_t& lineSize);
509 };
510 
513 {
514 private:
515  std::unique_ptr<const AsmIRP> irp;
516  uint64_t repeatCount;
517  LineNo contentLineNo;
518  size_t sourceTransIndex;
519  const LineTrans* curColTrans;
520  size_t realLinePos;
521 public:
523  explicit AsmIRPInputFilter(const AsmIRP* irp);
524 
525  const char* readLine(Assembler& assembler, size_t& lineSize);
526 
528  uint64_t getRepeatCount() const
529  { return repeatCount; }
530 };
531 
532 };
533 
534 #endif
AsmRepeatInputFilter or AsmIRPInputFilter.
assembler macro aegument
Definition: AsmSource.h:174
common definitions for assembler and disassembler
main class of assembler
Definition: Assembler.h:404
line translations
Definition: AsmSource.h:166
RefPtr< const AsmSource > source
source of substituted content
Definition: AsmSource.h:126
const AsmSourcePos & getSourcePos() const
get source position
Definition: AsmSource.h:284
assembler IRP pseudo-op input filter
Definition: AsmSource.h:512
non copyable and non movable base structure (class)
Definition: Utilities.h:43
assembler expression class
Definition: AsmDefs.h:301
RefPtr< const AsmSource > source
source
Definition: AsmSource.h:247
LineNo lineNo
current line number
Definition: AsmSource.h:362
assembler repeat
Definition: AsmSource.h:239
AsmSourceType type
type of Asm source (file or macro)
Definition: AsmSource.h:68
assembler macro
Definition: AsmSource.h:183
const size_t getArgsNum() const
get number of arguments
Definition: AsmSource.h:231
uint64_t getRepeatsNum() const
get number of repetitions
Definition: AsmSource.h:287
const SourceTrans & getSourceTrans(uint64_t index) const
get source translation
Definition: AsmSource.h:281
ColNo colNo
column number, for macro substitution and IRP points to column preprocessed line
Definition: AsmSource.h:50
AsmSourceType
source type
Definition: AsmSource.h:58
AsmMacroSubst(RefPtr< const AsmMacroSubst > _parent, RefPtr< const AsmSource > _source, LineNo _lineNo, ColNo _colNo)
constructor with parent macro substitution
Definition: AsmSource.h:116
AsmFile(const CString &_file)
constructor
Definition: AsmSource.h:88
reference pointer based on Glibmm refptr
Definition: Utilities.h:786
assembler repeat input filter
Definition: AsmSource.h:482
bool isIRPC() const
get if IRPC
Definition: AsmSource.h:340
assembler macro input filter (for macro filtering)
Definition: AsmSource.h:450
AsmInputFilter(RefPtr< const AsmMacroSubst > _macroSubst, RefPtr< const AsmSource > _source, AsmInputFilterType _type)
constructor with macro substitution and source
Definition: AsmSource.h:368
assembler input layout filter
Definition: AsmSource.h:416
RefPtr< const AsmSource > source
current source
Definition: AsmSource.h:359
const CString & getSymbolName() const
get number of repetitions
Definition: AsmSource.h:334
source translation
Definition: AsmSource.h:187
ssize_t position
position in joined line, can be negative if filtered line is statement
Definition: AsmSource.h:169
AsmMacroSource(RefPtr< const AsmMacroSubst > _macro, RefPtr< const AsmSource > _source)
construcror
Definition: AsmSource.h:129
AsmRepeatSource(RefPtr< const AsmSource > _source, uint64_t _repeatCount, uint64_t _repeatsNum)
constructor
Definition: AsmSource.h:144
RefPtr< const AsmSource > source
source of content where macro substituted
Definition: AsmSource.h:107
an array class
Definition: Containers.h:38
AsmSourcePos sourcePos
current source position
Definition: AsmSource.h:251
ColNo colNo
column number
Definition: AsmSource.h:158
Configuration header.
size_t pos
position in content
Definition: AsmSource.h:357
const AsmExpression * getNextExpr() const
get next expression
Definition: AsmSource.h:312
RefPtr< const AsmMacroSubst > macro
macro substitution in which message occurred
Definition: AsmSource.h:155
CString name
name
Definition: AsmSource.h:176
AsmInputFilterType
type of AsmInputFilter
Definition: AsmSource.h:345
line and column
Definition: AsmSource.h:45
LineNo getLineNo() const
get current line number after reading line
Definition: AsmSource.h:380
assembler &#39;for&#39; pseudo-op input filter
Definition: AsmSource.h:502
uint64_t getRepeatCount() const
get current repeat count
Definition: AsmSource.h:497
const AsmMacroArg & getArg(size_t i) const
get argument
Definition: AsmSource.h:234
LineNo lineNo
line number of top-most source
Definition: AsmSource.h:157
AsmStreamInputFilter.
size_t ColNo
column number type
Definition: Utilities.h:78
LineNo lineNo
line number
Definition: AsmSource.h:189
std::vector< LineTrans > colTranslations
column translations
Definition: AsmSource.h:361
assembler repeat &#39;for&#39;
Definition: AsmSource.h:292
Array< std::pair< CString, CString > > MacroArgMap
macro argument map type
Definition: AsmSource.h:454
uint64_t repeatsNum
number of all repetitions
Definition: AsmSource.h:141
RefPtr< const AsmSource > getSource() const
get current source after reading line
Definition: AsmSource.h:395
LineNo lineNo
line number
Definition: AsmSource.h:245
unsigned char cxbyte
unsigned byte
Definition: Config.h:215
std::vector< LineTrans > colTranslations
column translations
Definition: AsmSource.h:255
RefPtr< const AsmSource > source
source in which message occurred
Definition: AsmSource.h:156
reference countable object (only for single threading usage)
Definition: Utilities.h:762
main namespace
Definition: AsmDefs.h:38
ColNo colNo
place in line where file is included
Definition: AsmSource.h:84
const AsmSourcePos * exprSourcePos
expression sourcepos from what evaluation made
Definition: AsmSource.h:159
LineNo contentLineNo
number of content&#39;s line
Definition: AsmSource.h:250
unsigned int cxuint
unsigned int
Definition: Config.h:223
assembler IRP
Definition: AsmSource.h:317
const std::vector< LineTrans > getColTranslations() const
returns column translations after reading line
Definition: AsmSource.h:391
descriptor of assembler repetition
Definition: AsmSource.h:137
RefPtr< const AsmSource > source
source of content
Definition: AsmSource.h:139
bool vararg
is variadic argument
Definition: AsmSource.h:178
size_t getSourceTransSize() const
get source translations size
Definition: AsmSource.h:278
RefPtr< const AsmSource > source
source
Definition: AsmSource.h:190
const AsmSourcePos & getSourcePos() const
get source position
Definition: AsmSource.h:228
macro substitution
descriptor of file inclusion
Definition: AsmSource.h:78
AsmFile(const RefPtr< const AsmSource > _parent, LineNo _lineNo, ColNo _colNo, const CString &_file)
constructor with parent file inclustion
Definition: AsmSource.h:93
AsmInputFilter(AsmInputFilterType _type)
empty constructor
Definition: AsmSource.h:365
LineNo lineNo
place where file is included (0 if root)
Definition: AsmSource.h:83
AsmInputFilterType type
input filter type
Definition: AsmSource.h:356
RefPtr< const AsmSource > parent
parent source for this source (for file is parent file or macro substitution, for macro substitution ...
Definition: AsmSource.h:82
utilities for other libraries and programs
const CString & getSymbolValue(size_t i) const
get symbol value or string
Definition: AsmSource.h:337
RefPtr< const AsmMacroSubst > parent
parent source for this source (for file is parent file or macro substitution, for macro substitution ...
Definition: AsmSource.h:106
uint64_t getRepeatCount() const
get current repeat count
Definition: AsmSource.h:528
AsmInputFilterType getType() const
get input filter type
Definition: AsmSource.h:408
std::vector< SourceTrans > sourceTranslations
source translations
Definition: AsmSource.h:254
uint64_t repeatCount
number of repetition
Definition: AsmSource.h:140
bool required
is required
Definition: AsmSource.h:179
LineNo lineNo
source code line number
Definition: AsmSource.h:170
AsmMacroSubst(RefPtr< const AsmSource > _source, LineNo _lineNo, ColNo _colNo)
constructor
Definition: AsmSource.h:112
AsmSourcePos getSourcePos(size_t position) const
get source position after reading line
Definition: AsmSource.h:402
uint64_t repeatsNum
repeats number
Definition: AsmSource.h:252
descriptor assembler macro substitution
Definition: AsmSource.h:102
descriptor of macro source (used in source fields)
Definition: AsmSource.h:123
RefPtr< const AsmMacroSubst > macro
macro substitution
Definition: AsmSource.h:246
uint64_t LineNo
line number type
Definition: Utilities.h:75
const SourceTrans & getSourceTrans(uint64_t index) const
get source translations
Definition: AsmSource.h:225
const AsmExpression * getCondExpr() const
get condition expression
Definition: AsmSource.h:309
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:360
LineNo lineNo
line number
Definition: AsmSource.h:47
const std::vector< LineTrans > & getColTranslations() const
get column translations
Definition: AsmSource.h:216
source translations
Definition: AsmSource.h:243
assembler input filter for reading lines
Definition: AsmSource.h:353
std::unordered_map< CString, uint64_t > MacroLocalMap
macro local map type (key - name of variable, value - number of local label)
Definition: AsmSource.h:456
CString defaultValue
default value
Definition: AsmSource.h:177
RefPtr< const AsmMacroSubst > getMacroSubst() const
get current macro substitution after reading line
Definition: AsmSource.h:398
std::vector< char > content
content
Definition: AsmSource.h:253
RefPtr< const AsmMacroSubst > macro
macro substition
Definition: AsmSource.h:125
const void * getIterSymEntry() const
get iteration symbol entry
Definition: AsmSource.h:306
size_t getSourceTransSize() const
get source translations size
Definition: AsmSource.h:222
const CString file
file path
Definition: AsmSource.h:85
ColNo colNo
place in line where macro substituted
Definition: AsmSource.h:109
descriptor of assembler source for source position
Definition: AsmSource.h:66
const std::vector< LineTrans > & getColTranslations() const
get column translations
Definition: AsmSource.h:272
simple C-string container
Definition: CString.h:38
LineNo lineNo
place where macro substituted
Definition: AsmSource.h:108
const std::vector< char > & getContent() const
get content of repetition
Definition: AsmSource.h:275
AsmSource(AsmSourceType _type)
constructor
Definition: AsmSource.h:71
const std::vector< char > & getContent() const
get content vector
Definition: AsmSource.h:219
RefPtr< const AsmMacroSubst > macroSubst
current macro substitution
Definition: AsmSource.h:358
assembler source position
Definition: AsmSource.h:153