23 #ifndef __CLRX_ASMDEFS_H__ 24 #define __CLRX_ASMDEFS_H__ 31 #include <unordered_map> 61 enum : AsmExprTargetType
169 refCount(1), sectionId(
ASMSECT_ABS), info(0), other(0), hasValue(false),
170 onceDefined(_onceDefined), resolving(false), base(false), snapshot(false),
171 regRange(false), detached(false), withUnevalExpr(false),
172 value(0), size(0), expression(nullptr)
176 refCount(1), sectionId(
ASMSECT_ABS), info(0), other(0), hasValue(false),
177 onceDefined(_onceDefined), resolving(false), base(_base),
178 snapshot(false), regRange(false), detached(false), withUnevalExpr(false),
179 value(0), size(0), expression(expr)
183 : refCount(1), sectionId(_sectionId), info(0), other(0), hasValue(true),
184 onceDefined(_onceDefined), resolving(false), base(false), snapshot(false),
185 regRange(false), detached(false), withUnevalExpr(false),
186 value(_value), size(0), expression(nullptr)
193 { occurrencesInExprs.push_back({expr, argIndex, opIndex}); }
195 void removeOccurrenceInExpr(
AsmExpression* expr,
size_t argIndex,
size_t opIndex);
197 void clearOccurrencesInExpr();
202 {
return hasValue || expression!=
nullptr; }
230 : type(_type), sectionId(_sectionId), offset(_offset)
289 class TempSymbolSnapshotMap;
294 bool relativeSymOccurs;
297 std::unique_ptr<LineCol[]> messagePositions;
298 std::unique_ptr<AsmExprArg[]> args;
303 pos.
lineNo = messagePositions[msgPosIndex].lineNo;
304 pos.
colNo = messagePositions[msgPosIndex].colNo;
308 static bool makeSymbolSnapshot(
Assembler& assembler,
309 TempSymbolSnapshotMap* snapshotMap,
const AsmSymbolEntry& symEntry,
310 AsmSymbolEntry*& outSymEntry,
const AsmSourcePos* topParentSourcePos);
313 void setParams(
size_t symOccursNum,
bool relativeSymOccurs,
314 size_t _opsNum,
const AsmExprOp* ops,
size_t opPosNum,
const LineCol* opPos,
315 size_t argsNum,
const AsmExprArg* args,
bool baseExpr =
false);
319 size_t opsNum,
size_t opPosNum,
size_t argsNum,
bool baseExpr =
false);
322 size_t opsNum,
const AsmExprOp* ops,
size_t opPosNum,
324 bool baseExpr =
false);
330 {
return ops.empty(); }
337 { target = _target; }
350 uint64_t& value,
AsmSectionId& sectionId,
bool withSectionDiffs =
false)
const;
361 bool withSectionDiffs =
false)
const 362 {
return tryEvaluate(assembler, 0, ops.size(), value, sectionId, withSectionDiffs); }
372 {
return tryEvaluate(assembler, 0, ops.size(), value, sectionId) !=
386 {
return tryEvaluate(assembler, opStart, opEnd, value, sectionId) !=
398 bool makeBase =
false,
bool dontResolveSymbolsLater =
false);
409 bool makeBase =
false,
bool dontResolveSymbolsLater =
false);
413 {
return (AsmExprOp::FIRST_ARG <= op && op <= AsmExprOp::LAST_ARG); }
425 {
return symOccursNum; }
428 {
return relativeSymOccurs; }
431 {
return --symOccursNum!=0; }
438 AsmSymbolEntry* newSymEntry);
444 {
return args.get(); }
447 {
return sourcePos; }
450 size_t toTop(
size_t opIndex)
const;
456 static bool makeSymbolSnapshot(
Assembler& assembler,
const AsmSymbolEntry& symEntry,
457 AsmSymbolEntry*& outSymEntry,
const AsmSourcePos* parentExprSourcePos);
460 static bool fastExprEvaluate(
Assembler& assembler,
const char*& linePtr,
462 static bool fastExprEvaluate(
Assembler& assembler,
size_t& linePos,
468 if (base)
delete expression;
469 clearOccurrencesInExpr();
487 args[occurrence.
argIndex].relValue.value = value;
488 args[occurrence.
argIndex].relValue.sectionId = sectionId;
490 relativeSymOccurs =
true;
494 AsmSymbolEntry* newSymEntry)
496 args[occurrence.
argIndex].symbol = newSymEntry;
524 {
return regVar == r2.
regVar && index == r2.
index; }
527 {
return regVar == r2.
regVar && index == r2.
index; }
571 ASM_DELAYED_OP_MAX_TYPES_NUM = 8,
572 ASM_WAIT_MAX_TYPES_NUM = 4
591 uint16_t waitQueueSizes[ASM_WAIT_MAX_TYPES_NUM];
617 uint16_t waits[ASM_WAIT_MAX_TYPES_NUM];
640 typedef std::unordered_map<CString, RefPtr<const AsmMacro> >
AsmMacroMap;
645 typedef std::unordered_map<CString, AsmScope*>
AsmScopeMap;
659 std::unordered_map<AsmScope*, std::list<AsmScope*>::iterator>
usedScopesSet;
663 bool _temporary =
false)
664 : parent(_parent), symbolMap(_symbolMap), temporary(_temporary), enumCount(0)
668 : parent(_parent), temporary(_temporary), enumCount(0)
674 void startUsingScope(
AsmScope* scope);
676 void stopUsingScope(
AsmScope* scope);
681 usedScopesSet.clear();
684 void deleteSymbolsRecursively();
714 uint64_t _alignment, uint64_t _size = 0,
cxuint _relSpace = UINT_MAX,
715 uint64_t _relAddress = UINT64_MAX)
716 : name(_name), kernelId(_kernelId), type(_type), flags(_flags),
717 alignment(_alignment), size(_size), relSpace(_relSpace),
718 relAddress(_relAddress)
728 { codeFlow.push_back(entry); }
732 {
return ((flags&ASMSECT_WRITEABLE) != 0) ? content.size() : size; }
743 void openCodeRegion(
size_t offset);
745 void closeCodeRegion(
size_t offset);
759 for (it = begin(); it != end(); ++it)
760 if (it->first <= p.first && it->second >= p.second)
774 struct hash<
CLRX::AsmSingleVReg>
782 std::hash<const CLRX::AsmRegVar*> h1;
783 std::hash<uint16_t> h2;
AsmRegVarMap regVarMap
regvar map
Definition: AsmDefs.h:652
bool evaluate(Assembler &assembler, uint64_t &value, AsmSectionId §ionId) const
try to evaluate expression
Definition: AsmDefs.h:371
common definitions for assembler and disassembler
size_t target
target jump addreses
Definition: AsmDefs.h:635
main class of assembler
Definition: Assembler.h:529
AsmExprTargetType type
type of target
Definition: AsmDefs.h:213
non copyable and non movable base structure (class)
Definition: Utilities.h:46
assembler expression class
Definition: AsmDefs.h:286
AsmSymbolEntry * symbol
symbol
Definition: AsmDefs.h:271
AsmSymbol(bool _onceDefined=false)
empty constructor
Definition: AsmDefs.h:168
AsmSectionId sectionId
section id of destination
Definition: AsmDefs.h:218
kernel entry structure
Definition: AsmDefs.h:736
uint32_t Flags
type for declaring various flags
Definition: Utilities.h:100
std::unordered_map< CString, AsmRegVar > AsmRegVarMap
regvar map
Definition: AsmDefs.h:535
AsmExpression * expression
expression of symbol (if not resolved)
Definition: AsmDefs.h:160
bool operator==(const AsmExprSymbolOccurrence &b) const
comparison operator
Definition: AsmDefs.h:135
AsmRegVarMap::value_type AsmRegVarEntry
regvar entry
Definition: AsmDefs.h:537
target is 32-bit word
Definition: AsmDefs.h:66
AsmExprTarget(AsmExprTargetType _type, AsmSectionId _sectionId, size_t _offset)
constructor to create custom target
Definition: AsmDefs.h:229
target is 64-bit word
Definition: AsmDefs.h:67
AsmSymbolEntry * symbol
symbol entry (if ASMXTGT_SYMBOL)
Definition: AsmDefs.h:216
static AsmExprTarget codeFlowTarget(AsmSectionId sectionId, size_t cflowIndex)
make code flow target for expression
Definition: AsmDefs.h:242
target for assembler expression
Definition: AsmDefs.h:211
~AsmSymbol()
destructor
Definition: AsmDefs.h:466
size_t operator()(const CLRX::AsmSingleVReg &r1) const
a calling operator
Definition: AsmDefs.h:780
AsmExprOp
assembler expression operator
Definition: AsmDefs.h:76
delayed result for register for instruction with delayed results
Definition: AsmDefs.h:600
assembler section
Definition: AsmDefs.h:692
AsmSectionId relSectionId
section for which relocation is defined
Definition: AsmDefs.h:272
AsmExprTarget()
empty constructor
Definition: AsmDefs.h:226
for internal usage
Definition: AsmDefs.h:545
size_t offset
offset in section
Definition: AsmDefs.h:551
code flow entry
Definition: AsmDefs.h:68
static AsmExprTarget symbolTarget(AsmSymbolEntry *entry)
make symbol target for expression
Definition: AsmDefs.h:234
assembler scope for symbol, macros, regvars
Definition: AsmDefs.h:648
Regvar info structure.
Definition: AsmDefs.h:510
std::unique_ptr< ISAWaitHandler > waitHandler
wait handler
Definition: AsmDefs.h:706
cxbyte info
ELF symbol info.
Definition: AsmDefs.h:147
asm delay instr type entry
Definition: AsmDefs.h:576
cxuint type
scalar/vector/other
Definition: AsmDefs.h:512
std::vector< AsmCodeFlowEntry > codeFlow
code flow info
Definition: AsmDefs.h:707
const AsmExprTarget & getTarget() const
get targer of expression
Definition: AsmDefs.h:421
signed (arithmetic) shift right
void addCodeFlowEntry(const AsmCodeFlowEntry &entry)
add code flow entry to this section
Definition: AsmDefs.h:727
static bool isUnaryOp(AsmExprOp op)
return true if is unary op
Definition: AsmDefs.h:415
uint16_t index
index of regvar array
Definition: AsmDefs.h:520
AsmSourcePos sourcePos
source position of definition
Definition: AsmDefs.h:739
size_t getSymOccursNum() const
get number of symbol occurrences in expression
Definition: AsmDefs.h:424
std::list< AsmScope * > usedScopes
list of used scope in this scope
Definition: AsmDefs.h:655
assembler symbol occurrence in expression
Definition: AsmDefs.h:128
uint16_t rstart
register start
Definition: AsmDefs.h:566
std::unordered_map< CString, AsmScope * > AsmScopeMap
type definition of scope's map
Definition: AsmDefs.h:642
void addOccurrenceInExpr(AsmExpression *expr, size_t argIndex, size_t opIndex)
adds occurrence in expression
Definition: AsmDefs.h:192
ColNo colNo
column number
Definition: AsmSource.h:155
void stopUsingScopes()
remove all usings
Definition: AsmDefs.h:678
cxuint AsmSectionId
type for Asm section id (index)
Definition: Commons.h:35
cxuint RelocType
relocation type
Definition: Commons.h:33
AsmTryStatus
class of return value for a trying routines
Definition: AsmDefs.h:278
void setTarget(AsmExprTarget _target)
set target of expression
Definition: AsmDefs.h:336
for internal usage
Definition: AsmDefs.h:544
uint16_t rend
register end
Definition: AsmDefs.h:567
std::unordered_map< AsmScope *, std::list< AsmScope * >::iterator > usedScopesSet
set of used scopes in this scope
Definition: AsmDefs.h:659
size_t cflowId
cflow index of destination
Definition: AsmDefs.h:221
return from procedure
Definition: AsmDefs.h:626
AsmScope * parent
parent scope
Definition: AsmDefs.h:650
line and column
Definition: AsmSource.h:45
bool isEmpty() const
return true if expression is empty
Definition: AsmDefs.h:329
std::unordered_map< CString, AsmSymbol > AsmSymbolMap
assembler symbol map
Definition: AsmDefs.h:206
internal structure for regvar linear dependencies
Definition: AsmDefs.h:562
AsmScope(AsmScope *_parent, const AsmSymbolMap &_symbolMap, bool _temporary=false)
constructor
Definition: AsmDefs.h:662
const AsmRegVar * regVar
regvar
Definition: AsmDefs.h:565
LineNo lineNo
line number of top-most source
Definition: AsmSource.h:154
size_t offset
offset of relocation
Definition: AsmDefs.h:268
uint64_t value
value of symbol
Definition: AsmDefs.h:157
single regvar id
Definition: AsmDefs.h:517
assembler relocation
Definition: AsmDefs.h:265
cxbyte rwFlags
1 - read, 2 - write
Definition: AsmDefs.h:556
bool temporary
true if temporary
Definition: AsmDefs.h:654
AsmException()=default
empty constructor
wait handler
Definition: Assembler.h:182
void replaceOccurrenceSymbol(AsmExprSymbolOccurrence occurrence, AsmSymbolEntry *newSymEntry)
replace symbol in expression
Definition: AsmDefs.h:493
size_t opIndex
operator index
Definition: AsmDefs.h:132
if failed now, no later trial
const char * name
name of kernel
Definition: AsmDefs.h:738
AsmSectionType
assembler section type
Definition: AsmFormats.h:47
unsigned char cxbyte
unsigned byte
Definition: Config.h:229
std::unordered_map< CString, RefPtr< const AsmMacro > > AsmMacroMap
assembler macro map
Definition: AsmDefs.h:640
main namespace
Definition: AsmDefs.h:38
AsmSymbolEntry * symbol
if symbol
Definition: AsmDefs.h:475
symbol without defined value
AsmKernelId kernelId
kernel id (optional)
Definition: AsmDefs.h:695
const AsmRegVar * regVar
regvar
Definition: AsmDefs.h:519
AsmSymbol(AsmSectionId _sectionId, uint64_t _value, bool _onceDefined=false)
constructor with value and section id
Definition: AsmDefs.h:182
bool finishOnRegReadOut
waiting finished on register read out (true) or on operation
Definition: AsmDefs.h:581
static bool isArg(AsmExprOp op)
return true if is argument op
Definition: AsmDefs.h:412
bool unrefSymOccursNum()
unreference symbol occurrences in expression (used internally)
Definition: AsmDefs.h:430
void substituteOccurrence(AsmExprSymbolOccurrence occurrence, uint64_t value, AsmSectionId sectionId=ASMSECT_ABS)
substitute occurrence in expression by value
Definition: AsmDefs.h:483
unsigned int cxuint
unsigned int
Definition: Config.h:237
bool operator!=(const AsmSingleVReg &r2) const
not equal operator
Definition: AsmDefs.h:526
static bool isBinaryOp(AsmExprOp op)
return true if is binary op
Definition: AsmDefs.h:418
code end
Definition: AsmDefs.h:628
target is byte
Definition: AsmDefs.h:64
uint64_t size
size of symbol
Definition: AsmDefs.h:158
size_t getSize() const
get section's size
Definition: AsmDefs.h:731
cxuint relSpace
relative space where is section
Definition: AsmDefs.h:700
AsmScope(AsmScope *_parent=nullptr, bool _temporary=false)
constructor
Definition: AsmDefs.h:667
AsmSection(const char *_name, AsmKernelId _kernelId, AsmSectionType _type, Flags _flags, uint64_t _alignment, uint64_t _size=0, cxuint _relSpace=UINT_MAX, uint64_t _relAddress=UINT64_MAX)
constructor
Definition: AsmDefs.h:713
static AsmExprTarget dataTarget(AsmSectionId sectionId, size_t offset)
make n-bit word target for expression
Definition: AsmDefs.h:253
uint64_t relAddress
relative address
Definition: AsmDefs.h:701
cxbyte AsmExprTargetType
expression target type (one byte)
Definition: AsmDefs.h:59
AsmCodeFlowType type
type of code flow entry
Definition: AsmDefs.h:636
uint16_t rend
register end
Definition: AsmDefs.h:554
uint64_t size
section size
Definition: AsmDefs.h:699
std::vector< AsmExprSymbolOccurrence > occurrencesInExprs
Definition: AsmDefs.h:165
target is 16-bit word
Definition: AsmDefs.h:65
AsmSectionId sectionId
sectionId
Definition: AsmDefs.h:479
std::vector< cxbyte > content
content of section
Definition: AsmDefs.h:702
AsmSymbolMap::value_type AsmSymbolEntry
assembler symbol entry
Definition: AsmDefs.h:208
Flags flags
section flags
Definition: AsmDefs.h:697
cxuint AsmKernelId
type for Asm kernel id (index)
Definition: Commons.h:33
target is symbol
Definition: AsmDefs.h:63
uint64_t value
value
Definition: AsmDefs.h:476
cxuint refCount
reference counter (for internal use only)
Definition: AsmDefs.h:145
size_t offset
offset of destination
Definition: AsmDefs.h:220
uint16_t size
in regs
Definition: AsmDefs.h:513
size_t offset
offset where is this entry
Definition: AsmDefs.h:634
size_t argIndex
argument index
Definition: AsmDefs.h:131
utilities for other libraries and programs
const Array< AsmExprOp > & getOps() const
get operators list
Definition: AsmDefs.h:440
std::unique_ptr< ISAUsageHandler > usageHandler
usage handler
Definition: AsmDefs.h:704
class holds source position for section offset
Definition: AsmSource.h:530
RelocType type
relocation type
Definition: AsmDefs.h:269
uint64_t alignment
section alignment
Definition: AsmDefs.h:698
bool operator<(const AsmSingleVReg &r2) const
less operator
Definition: AsmDefs.h:530
const AsmRegVar * regVar
if null, then usage of called register
Definition: AsmDefs.h:552
std::string message
message
Definition: Utilities.h:64
exception class
Definition: Utilities.h:61
AsmSymbolMap symbolMap
symbol map
Definition: AsmDefs.h:651
AsmSectionId sectionId
section id
Definition: AsmDefs.h:146
AsmScopeMap scopeMap
scope map
Definition: AsmDefs.h:653
code start
Definition: AsmDefs.h:627
AsmSectionType type
type of section
Definition: AsmDefs.h:696
regvar usage in code
Definition: AsmDefs.h:549
linears for regvars
Definition: AsmDefs.h:749
uint16_t rstart
register start
Definition: AsmDefs.h:553
AsmTryStatus tryEvaluate(Assembler &assembler, uint64_t &value, AsmSectionId §ionId, bool withSectionDiffs=false) const
try to evaluate expression with/without section differences
Definition: AsmDefs.h:360
AsmRegVarLinears()
constructor
Definition: AsmDefs.h:753
call of procedure
Definition: AsmDefs.h:625
AsmSymbol(AsmExpression *expr, bool _onceDefined=false, bool _base=false)
constructor with expression
Definition: AsmDefs.h:175
for internal usage (regtype)
Definition: AsmDefs.h:543
register will be read
Definition: AsmDefs.h:540
std::unique_ptr< ISALinearDepHandler > linearDepHandler
linear dep handler
Definition: AsmDefs.h:705
void insertRegion(const std::pair< uint16_t, uint16_t > &p)
insert new region if whole region is not some already region
Definition: AsmDefs.h:756
code flow entry
Definition: AsmDefs.h:632
cxbyte other
ELF symbol other.
Definition: AsmDefs.h:148
jump
Definition: AsmDefs.h:623
description of the WAIT instruction (for waiting for results)
Definition: AsmDefs.h:614
std::vector< std::pair< size_t, size_t > > codeRegions
code regions
Definition: AsmDefs.h:740
const char * name
section name
Definition: AsmDefs.h:694
absolute section id
Definition: AsmFormats.h:86
an assembler sources handling
virtual ~AsmException() noexcept=default
destructor
AsmCodeFlowType
code flow type
Definition: AsmDefs.h:621
Assembler exception class.
Definition: AsmDefs.h:42
assembler symbol structure
Definition: AsmDefs.h:143
bool useRegMode
if RVU from useReg pseudo-ops
Definition: AsmDefs.h:558
asm wait system configuration
Definition: AsmDefs.h:586
bool isDefined() const
return true if symbol defined (have value or expression)
Definition: AsmDefs.h:201
cxbyte counting
counting (255 - per instr), 1-254 - per element size
Definition: AsmDefs.h:582
register will be written
Definition: AsmDefs.h:541
cxbyte AsmRegField
type of register field
Definition: AsmDefs.h:500
const AsmExprArg * getArgs() const
get argument list
Definition: AsmDefs.h:443
ISA regvar linear handler.
Definition: Assembler.h:136
ISA (register and regvar) Usage handler.
Definition: Assembler.h:80
size_t hasRelativeSymOccurs() const
get number of symbol occurrences in expression
Definition: AsmDefs.h:427
AsmRegField regField
place in instruction
Definition: AsmDefs.h:555
uint64_t addend
addend
Definition: AsmDefs.h:274
conditional jump
Definition: AsmDefs.h:624
AsmExpression * expression
target expression pointer
Definition: AsmDefs.h:130
assembler expression argument
Definition: AsmDefs.h:473
access mask
Definition: AsmDefs.h:542
cxbyte align
register alignment
Definition: AsmDefs.h:557
bool operator==(const AsmSingleVReg &r2) const
equal operator
Definition: AsmDefs.h:523
CLRX::AsmSingleVReg argument_type
argument type
Definition: AsmDefs.h:776
const AsmSourcePos & getSourcePos() const
get source position
Definition: AsmDefs.h:446
bool evaluate(Assembler &assembler, size_t opStart, size_t opEnd, uint64_t &value, AsmSectionId §ionId) const
try to evaluate expression
Definition: AsmDefs.h:384
assembler source position
Definition: AsmSource.h:150
std::size_t result_type
result type
Definition: AsmDefs.h:777
AsmSectionId sectionId
section id where relocation is present
Definition: AsmDefs.h:267