summaryrefslogtreecommitdiffstats
path: root/include/llvm/MC/MCValue.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/llvm/MC/MCValue.h')
-rw-r--r--include/llvm/MC/MCValue.h24
1 files changed, 21 insertions, 3 deletions
diff --git a/include/llvm/MC/MCValue.h b/include/llvm/MC/MCValue.h
index 7df12da..d032f17 100644
--- a/include/llvm/MC/MCValue.h
+++ b/include/llvm/MC/MCValue.h
@@ -15,6 +15,8 @@
#define LLVM_MC_MCVALUE_H
#include "llvm/Support/DataTypes.h"
+#include "llvm/MC/MCSymbol.h"
+#include <cassert>
namespace llvm {
class MCSymbol;
@@ -23,6 +25,10 @@ class MCSymbol;
/// form, this can hold "SymbolA - SymbolB + imm64". Not all targets supports
/// relocations of this general form, but we need to represent this anyway.
///
+/// In the general form, SymbolB can only be defined if SymbolA is, and both
+/// must be in the same (non-external) section. The latter constraint is not
+/// enforced, since a symbol's section may not be known at construction.
+///
/// Note that this class must remain a simple POD value class, because we need
/// it to live in unions etc.
class MCValue {
@@ -30,13 +36,25 @@ class MCValue {
int64_t Cst;
public:
- int64_t getCst() const { return Cst; }
+ int64_t getConstant() const { return Cst; }
MCSymbol *getSymA() const { return SymA; }
MCSymbol *getSymB() const { return SymB; }
-
-
+
+ /// isAbsolute - Is this an absolute (as opposed to relocatable) value.
+ bool isAbsolute() const { return !SymA && !SymB; }
+
+ /// getAssociatedSection - For relocatable values, return the section the
+ /// value is associated with.
+ ///
+ /// @result - The value's associated section, or null for external or constant
+ /// values.
+ MCSection *getAssociatedSection() const {
+ return SymA ? SymA->getSection() : 0;
+ }
+
static MCValue get(MCSymbol *SymA, MCSymbol *SymB = 0, int64_t Val = 0) {
MCValue R;
+ assert((!SymB || SymA) && "Invalid relocatable MCValue!");
R.Cst = Val;
R.SymA = SymA;
R.SymB = SymB;
OpenPOWER on IntegriCloud