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 {
68  size_t uniqueId;
70 
72  explicit AsmSource(AsmSourceType _type);
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 {
104  size_t uniqueId;
111 
113  AsmMacroSubst(RefPtr<const AsmSource> _source, LineNo _lineNo, ColNo _colNo);
116  LineNo _lineNo, ColNo _colNo);
117 };
118 
120 struct AsmMacroSource: public AsmSource
121 {
124 
127  : AsmSource(AsmSourceType::MACRO), macro(_macro), source(_source)
128  { }
130  virtual ~AsmMacroSource();
131 };
132 
135 {
137  uint64_t repeatCount;
138  uint64_t repeatsNum;
139 
141  AsmRepeatSource(RefPtr<const AsmSource> _source, uint64_t _repeatCount,
142  uint64_t _repeatsNum) : AsmSource(AsmSourceType::REPT), source(_source),
143  repeatCount(_repeatCount), repeatsNum(_repeatsNum)
144  { }
146  virtual ~AsmRepeatSource();
147 };
148 
151 {
157 
159  void print(std::ostream& os, cxuint indentLevel = 0) const;
160 };
161 
163 struct LineTrans
164 {
166  ssize_t position;
168 };
169 
172 {
175  bool vararg;
176  bool required;
177 };
178 
181 {
182 public:
184  struct SourceTrans
185  {
188  };
189 private:
190  LineNo contentLineNo;
191  AsmSourcePos sourcePos;
192  Array<AsmMacroArg> args;
193  std::vector<char> content;
194  std::vector<SourceTrans> sourceTranslations;
195  std::vector<LineTrans> colTranslations;
196 public:
198  AsmMacro(const AsmSourcePos& pos, const Array<AsmMacroArg>& args);
200  AsmMacro(const AsmSourcePos& pos, Array<AsmMacroArg>&& args);
201 
203 
210  void addLine(RefPtr<const AsmMacroSubst> macro, RefPtr<const AsmSource> source,
211  const std::vector<LineTrans>& colTrans, size_t lineSize, const char* line);
213  const std::vector<LineTrans>& getColTranslations() const
214  { return colTranslations; }
216  const std::vector<char>& getContent() const
217  { return content; }
219  size_t getSourceTransSize() const
220  { return sourceTranslations.size(); }
222  const SourceTrans& getSourceTrans(uint64_t index) const
223  { return sourceTranslations[index]; }
225  const AsmSourcePos& getSourcePos() const
226  { return sourcePos; }
228  const size_t getArgsNum() const
229  { return args.size(); }
231  const AsmMacroArg& getArg(size_t i) const
232  { return args[i]; }
233 };
234 
237 {
238 public:
240  struct SourceTrans
241  {
245  };
246 protected:
249  uint64_t repeatsNum;
250  std::vector<char> content;
251  std::vector<SourceTrans> sourceTranslations;
252  std::vector<LineTrans> colTranslations;
253 public:
255  explicit AsmRepeat(const AsmSourcePos& pos, uint64_t repeatsNum);
256  virtual ~AsmRepeat();
257 
259 
266  void addLine(RefPtr<const AsmMacroSubst> macro, RefPtr<const AsmSource> source,
267  const std::vector<LineTrans>& colTrans, size_t lineSize, const char* line);
269  const std::vector<LineTrans>& getColTranslations() const
270  { return colTranslations; }
272  const std::vector<char>& getContent() const
273  { return content; }
275  size_t getSourceTransSize() const
276  { return sourceTranslations.size(); }
278  const SourceTrans& getSourceTrans(uint64_t index) const
279  { return sourceTranslations[index]; }
281  const AsmSourcePos& getSourcePos() const
282  { return sourcePos; }
284  uint64_t getRepeatsNum() const
285  { return repeatsNum; }
286 };
287 
289 class AsmFor: public AsmRepeat
290 {
291 private:
292  void* iterSymEntry;
293  std::unique_ptr<AsmExpression> condExpr;
294  std::unique_ptr<AsmExpression> nextExpr;
295 public:
297  explicit AsmFor(const AsmSourcePos& pos, void* iterSymEntry,
298  AsmExpression* condExpr, AsmExpression* nextExpr);
299 
300  virtual ~AsmFor();
301 
303  const void* getIterSymEntry() const
304  { return iterSymEntry; }
306  const AsmExpression* getCondExpr() const
307  { return condExpr.get(); }
309  const AsmExpression* getNextExpr() const
310  { return nextExpr.get(); }
311 };
312 
314 class AsmIRP: public AsmRepeat
315 {
316 private:
317  bool irpc; // is irpc
318  CString symbolName;
319  Array<CString> symValues;
320 public:
322  explicit AsmIRP(const AsmSourcePos& pos, const CString& symbolName,
323  const CString& symValString);
325  explicit AsmIRP(const AsmSourcePos& pos, const CString& symbolName,
326  const Array<CString>& symValues);
328  explicit AsmIRP(const AsmSourcePos& pos, const CString& symbolName,
329  Array<CString>&& symValues);
331  const CString& getSymbolName() const
332  { return symbolName; }
334  const CString& getSymbolValue(size_t i) const
335  { return symValues[i]; }
337  bool isIRPC() const
338  { return irpc; }
339 };
340 
343 {
344  STREAM = 0,
345  REPEAT,
346  MACROSUBST
347 };
348 
351 {
352 protected:
354  size_t pos;
357  std::vector<char> buffer;
358  std::vector<LineTrans> colTranslations;
360 
362  explicit AsmInputFilter(AsmInputFilterType _type): type(_type), pos(0), lineNo(1)
363  { }
367  : type(_type), pos(0), macroSubst(_macroSubst), source(_source), lineNo(1)
368  { }
369 public:
371  virtual ~AsmInputFilter();
372 
374  virtual const char* readLine(Assembler& assembler, size_t& lineSize) = 0;
375 
378  { return lineNo; }
379 
381 
385  LineCol translatePos(size_t position) const;
386 
388  const std::vector<LineTrans> getColTranslations() const
389  { return colTranslations; }
390 
393  { return source; }
396  { return macroSubst; }
397 
399  AsmSourcePos getSourcePos(size_t position) const
400  {
401  LineCol lineCol = translatePos(position);
402  return { macroSubst, source, lineCol.lineNo, lineCol.colNo };
403  }
406  { return type; }
407 };
408 
410 
414 {
415 private:
416  enum class LineMode: cxbyte
417  {
418  NORMAL = 0,
419  LSTRING,
420  STRING,
421  LONG_COMMENT,
422  LINE_COMMENT
423  };
424 
425  bool managed;
426  std::istream* stream;
427  LineMode mode;
428  size_t stmtPos;
429 
430 public:
432  explicit AsmStreamInputFilter(std::istream& is, const CString& filename = "");
434  explicit AsmStreamInputFilter(const CString& filename);
436  AsmStreamInputFilter(const AsmSourcePos& pos, std::istream& is,
437  const CString& filename = "");
439  AsmStreamInputFilter(const AsmSourcePos& pos, const CString& filename);
442 
443  const char* readLine(Assembler& assembler, size_t& lineSize);
444 };
445 
448 {
449 public:
453  typedef std::unordered_map<CString, uint64_t> MacroLocalMap;
454 private:
455  RefPtr<const AsmMacro> macro;
456  MacroArgMap argMap;
457  MacroLocalMap localMap;
458 
459  uint64_t macroCount;
460  LineNo contentLineNo;
461  size_t sourceTransIndex;
462  const LineTrans* curColTrans;
463  size_t realLinePos;
464  bool alternateMacro;
465 public:
468  const MacroArgMap& argMap, uint64_t macroCount, bool alternateMacro);
471  MacroArgMap&& argMap, uint64_t macroCount, bool alternateMacro);
472 
473  const char* readLine(Assembler& assembler, size_t& lineSize);
475  bool addLocal(const CString& name, uint64_t localNo);
476 };
477 
480 {
481 protected:
482  std::unique_ptr<const AsmRepeat> repeat;
483  uint64_t repeatCount;
484  LineNo contentLineNo;
485  size_t sourceTransIndex;
486  const LineTrans* curColTrans;
487 public:
489  explicit AsmRepeatInputFilter(const AsmRepeat* repeat);
490 
491  const char* readLine(Assembler& assembler, size_t& lineSize);
492 
494  uint64_t getRepeatCount() const
495  { return repeatCount; }
496 };
497 
500 {
501 public:
503  explicit AsmForInputFilter(const AsmFor* forRpt);
504 
505  const char* readLine(Assembler& assembler, size_t& lineSize);
506 };
507 
510 {
511 private:
512  std::unique_ptr<const AsmIRP> irp;
513  uint64_t repeatCount;
514  LineNo contentLineNo;
515  size_t sourceTransIndex;
516  const LineTrans* curColTrans;
517  size_t realLinePos;
518 public:
520  explicit AsmIRPInputFilter(const AsmIRP* irp);
521 
522  const char* readLine(Assembler& assembler, size_t& lineSize);
523 
525  uint64_t getRepeatCount() const
526  { return repeatCount; }
527 };
528 
531 {
532 public:
533  struct ReadPos
534  {
535  size_t chunkPos;
536  size_t itemPos;
537  };
538 private:
539  struct Item
540  {
541  uint16_t offsetLo;
542  uint16_t lineNoLo;
543  uint16_t colNoLo;
544  };
545  struct Chunk
546  {
547  size_t offsetFirst; // first offset in chunk
550  LineNo lineNoHigh;
551  ColNo colNoHigh;
552  std::vector<Item> items;
553  };
554  std::vector<Chunk> chunks;
555 public:
559  void pushSourcePos(size_t offset, const AsmSourcePos& sourcePos);
561  bool hasNext(const ReadPos& readPos) const
562  { return readPos.chunkPos < chunks.size() && (readPos.chunkPos+1 != chunks.size() ||
563  readPos.itemPos < chunks.back().items.size()); }
565  std::pair<size_t, AsmSourcePos> nextSourcePos(ReadPos& rPos);
566  // find position by offset
567  ReadPos findPositionByOffset(size_t offset) const;
568 };
569 
570 };
571 
572 #endif
AsmRepeatInputFilter or AsmIRPInputFilter.
assembler macro aegument
Definition: AsmSource.h:171
common definitions for assembler and disassembler
main class of assembler
Definition: Assembler.h:516
line translations
Definition: AsmSource.h:163
RefPtr< const AsmSource > source
source of substituted content
Definition: AsmSource.h:123
const AsmSourcePos & getSourcePos() const
get source position
Definition: AsmSource.h:281
assembler IRP pseudo-op input filter
Definition: AsmSource.h:509
non copyable and non movable base structure (class)
Definition: Utilities.h:46
assembler expression class
Definition: AsmDefs.h:286
RefPtr< const AsmSource > source
source
Definition: AsmSource.h:244
LineNo lineNo
current line number
Definition: AsmSource.h:359
assembler repeat
Definition: AsmSource.h:236
AsmSourceType type
type of Asm source (file or macro)
Definition: AsmSource.h:69
assembler macro
Definition: AsmSource.h:180
const size_t getArgsNum() const
get number of arguments
Definition: AsmSource.h:228
uint64_t getRepeatsNum() const
get number of repetitions
Definition: AsmSource.h:284
const SourceTrans & getSourceTrans(uint64_t index) const
get source translation
Definition: AsmSource.h:278
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
AsmFile(const CString &_file)
constructor
Definition: AsmSource.h:88
reference pointer based on Glibmm refptr
Definition: Utilities.h:860
assembler repeat input filter
Definition: AsmSource.h:479
bool isIRPC() const
get if IRPC
Definition: AsmSource.h:337
assembler macro input filter (for macro filtering)
Definition: AsmSource.h:447
AsmInputFilter(RefPtr< const AsmMacroSubst > _macroSubst, RefPtr< const AsmSource > _source, AsmInputFilterType _type)
constructor with macro substitution and source
Definition: AsmSource.h:365
assembler input layout filter
Definition: AsmSource.h:413
RefPtr< const AsmSource > source
current source
Definition: AsmSource.h:356
const CString & getSymbolName() const
get number of repetitions
Definition: AsmSource.h:331
size_t uniqueId
unique id for equality
Definition: AsmSource.h:68
source translation
Definition: AsmSource.h:184
ssize_t position
position in joined line, can be negative if filtered line is statement
Definition: AsmSource.h:166
AsmMacroSource(RefPtr< const AsmMacroSubst > _macro, RefPtr< const AsmSource > _source)
construcror
Definition: AsmSource.h:126
AsmRepeatSource(RefPtr< const AsmSource > _source, uint64_t _repeatCount, uint64_t _repeatsNum)
constructor
Definition: AsmSource.h:141
RefPtr< const AsmSource > source
source of content where macro substituted
Definition: AsmSource.h:108
an array class
Definition: Containers.h:41
AsmSourcePos sourcePos
current source position
Definition: AsmSource.h:248
ColNo colNo
column number
Definition: AsmSource.h:155
Configuration header.
size_t pos
position in content
Definition: AsmSource.h:354
const AsmExpression * getNextExpr() const
get next expression
Definition: AsmSource.h:309
RefPtr< const AsmMacroSubst > macro
macro substitution in which message occurred
Definition: AsmSource.h:152
CString name
name
Definition: AsmSource.h:173
AsmInputFilterType
type of AsmInputFilter
Definition: AsmSource.h:342
Definition: AsmSource.h:533
line and column
Definition: AsmSource.h:45
LineNo getLineNo() const
get current line number after reading line
Definition: AsmSource.h:377
assembler &#39;for&#39; pseudo-op input filter
Definition: AsmSource.h:499
uint64_t getRepeatCount() const
get current repeat count
Definition: AsmSource.h:494
const AsmMacroArg & getArg(size_t i) const
get argument
Definition: AsmSource.h:231
LineNo lineNo
line number of top-most source
Definition: AsmSource.h:154
AsmStreamInputFilter.
size_t ColNo
column number type
Definition: Utilities.h:81
LineNo lineNo
line number
Definition: AsmSource.h:186
std::vector< LineTrans > colTranslations
column translations
Definition: AsmSource.h:358
assembler repeat &#39;for&#39;
Definition: AsmSource.h:289
Array< std::pair< CString, CString > > MacroArgMap
macro argument map type
Definition: AsmSource.h:451
uint64_t repeatsNum
number of all repetitions
Definition: AsmSource.h:138
RefPtr< const AsmSource > getSource() const
get current source after reading line
Definition: AsmSource.h:392
LineNo lineNo
line number
Definition: AsmSource.h:242
unsigned char cxbyte
unsigned byte
Definition: Config.h:229
std::vector< LineTrans > colTranslations
column translations
Definition: AsmSource.h:252
RefPtr< const AsmSource > source
source in which message occurred
Definition: AsmSource.h:153
reference countable object (only for single threading usage)
Definition: Utilities.h:836
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:156
LineNo contentLineNo
number of content&#39;s line
Definition: AsmSource.h:247
unsigned int cxuint
unsigned int
Definition: Config.h:237
assembler IRP
Definition: AsmSource.h:314
const std::vector< LineTrans > getColTranslations() const
returns column translations after reading line
Definition: AsmSource.h:388
descriptor of assembler repetition
Definition: AsmSource.h:134
RefPtr< const AsmSource > source
source of content
Definition: AsmSource.h:136
bool vararg
is variadic argument
Definition: AsmSource.h:175
size_t getSourceTransSize() const
get source translations size
Definition: AsmSource.h:275
RefPtr< const AsmSource > source
source
Definition: AsmSource.h:187
const AsmSourcePos & getSourcePos() const
get source position
Definition: AsmSource.h:225
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:362
LineNo lineNo
place where file is included (0 if root)
Definition: AsmSource.h:83
AsmInputFilterType type
input filter type
Definition: AsmSource.h:353
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:334
class holds source position for section offset
Definition: AsmSource.h:530
uint64_t getRepeatCount() const
get current repeat count
Definition: AsmSource.h:525
AsmInputFilterType getType() const
get input filter type
Definition: AsmSource.h:405
std::vector< SourceTrans > sourceTranslations
source translations
Definition: AsmSource.h:251
uint64_t repeatCount
number of repetition
Definition: AsmSource.h:137
bool required
is required
Definition: AsmSource.h:176
LineNo lineNo
source code line number
Definition: AsmSource.h:167
AsmSourcePos getSourcePos(size_t position) const
get source position after reading line
Definition: AsmSource.h:399
uint64_t repeatsNum
repeats number
Definition: AsmSource.h:249
descriptor assembler macro substitution
Definition: AsmSource.h:102
size_t uniqueId
unique id for equality parent source for this source (for file is parent file or macro substitution...
Definition: AsmSource.h:104
descriptor of macro source (used in source fields)
Definition: AsmSource.h:120
RefPtr< const AsmMacroSubst > macro
macro substitution
Definition: AsmSource.h:243
uint64_t LineNo
line number type
Definition: Utilities.h:78
const SourceTrans & getSourceTrans(uint64_t index) const
get source translations
Definition: AsmSource.h:222
const AsmExpression * getCondExpr() const
get condition expression
Definition: AsmSource.h:306
size_t size() const
returns number of elements
Definition: Containers.h:172
std::vector< char > buffer
buffer of line (can be not used)
Definition: AsmSource.h:357
LineNo lineNo
line number
Definition: AsmSource.h:47
const std::vector< LineTrans > & getColTranslations() const
get column translations
Definition: AsmSource.h:213
source translations
Definition: AsmSource.h:240
assembler input filter for reading lines
Definition: AsmSource.h:350
std::unordered_map< CString, uint64_t > MacroLocalMap
macro local map type (key - name of variable, value - number of local label)
Definition: AsmSource.h:453
CString defaultValue
default value
Definition: AsmSource.h:174
RefPtr< const AsmMacroSubst > getMacroSubst() const
get current macro substitution after reading line
Definition: AsmSource.h:395
std::vector< char > content
content
Definition: AsmSource.h:250
RefPtr< const AsmMacroSubst > macro
macro substition
Definition: AsmSource.h:122
const void * getIterSymEntry() const
get iteration symbol entry
Definition: AsmSource.h:303
size_t getSourceTransSize() const
get source translations size
Definition: AsmSource.h:219
const CString file
file path
Definition: AsmSource.h:85
ColNo colNo
place in line where macro substituted
Definition: AsmSource.h:110
descriptor of assembler source for source position
Definition: AsmSource.h:66
const std::vector< LineTrans > & getColTranslations() const
get column translations
Definition: AsmSource.h:269
simple C-string container
Definition: CString.h:38
LineNo lineNo
place where macro substituted
Definition: AsmSource.h:109
const std::vector< char > & getContent() const
get content of repetition
Definition: AsmSource.h:272
const std::vector< char > & getContent() const
get content vector
Definition: AsmSource.h:216
RefPtr< const AsmMacroSubst > macroSubst
current macro substitution
Definition: AsmSource.h:355
assembler source position
Definition: AsmSource.h:150
bool hasNext(const ReadPos &readPos) const
return true if has next
Definition: AsmSource.h:561