|
19 | 19 | namespace llvm { |
20 | 20 | class raw_ostream; |
21 | 21 |
|
22 | | -/// This represents an "assembler immediate". |
23 | | -/// |
24 | | -/// In its most general form, this can hold ":Kind:(SymbolA - SymbolB + |
25 | | -/// imm64)". Not all targets supports relocations of this general form, but we |
26 | | -/// need to represent this anyway. |
27 | | -/// |
28 | | -/// In general both SymbolA and SymbolB will also have a modifier |
29 | | -/// analogous to the top-level Kind. Current targets are not expected |
30 | | -/// to make use of both though. The choice comes down to whether |
31 | | -/// relocation modifiers apply to the closest symbol or the whole |
32 | | -/// expression. |
33 | | -/// |
34 | | -/// Note that this class must remain a simple POD value class, because we need |
35 | | -/// it to live in unions etc. |
| 22 | +// Represents a relocatable expression in its most general form: |
| 23 | +// relocation_specifier(SymA - SymB + imm64). |
| 24 | +// |
| 25 | +// Not all targets support SymB. For PC-relative relocations, a specifier is |
| 26 | +// typically used instead of setting SymB to DOT. |
| 27 | +// |
| 28 | +// Some targets encode the relocation specifier within SymA using |
| 29 | +// MCSymbolRefExpr::SubclassData and access it via getAccessVariant(), though |
| 30 | +// this method is now deprecated. |
| 31 | +// |
| 32 | +// This class must remain a simple POD value class, as it needs to reside in |
| 33 | +// unions and similar structures. |
36 | 34 | class MCValue { |
37 | 35 | const MCSymbolRefExpr *SymA = nullptr, *SymB = nullptr; |
38 | 36 | int64_t Cst = 0; |
39 | 37 | uint32_t Specifier = 0; |
40 | 38 |
|
| 39 | + // SymB cannot have a specifier. Use getSubSym instead. |
| 40 | + const MCSymbolRefExpr *getSymB() const { return SymB; } |
| 41 | + |
41 | 42 | public: |
| 43 | + friend class MCAssembler; |
42 | 44 | friend class MCExpr; |
43 | 45 | MCValue() = default; |
44 | 46 | int64_t getConstant() const { return Cst; } |
45 | 47 | const MCSymbolRefExpr *getSymA() const { return SymA; } |
46 | | - const MCSymbolRefExpr *getSymB() const { return SymB; } |
47 | 48 | uint32_t getRefKind() const { return Specifier; } |
48 | 49 | uint32_t getSpecifier() const { return Specifier; } |
49 | 50 | void setSpecifier(uint32_t S) { Specifier = S; } |
|
0 commit comments