diff options
Diffstat (limited to 'llvm/lib/MC/MCFixup.cpp')
-rw-r--r-- | llvm/lib/MC/MCFixup.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/llvm/lib/MC/MCFixup.cpp b/llvm/lib/MC/MCFixup.cpp new file mode 100644 index 00000000000..d0a4fed28f9 --- /dev/null +++ b/llvm/lib/MC/MCFixup.cpp @@ -0,0 +1,36 @@ +//===- MCFixup.cpp - Assembly Fixup Implementation ------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/MC/MCFixup.h" +using namespace llvm; + +static MCSymbolRefExpr::VariantKind getAccessVariant(const MCExpr *Expr) { + switch (Expr->getKind()) { + case MCExpr::Unary: + case MCExpr::Target: + llvm_unreachable("unsupported"); + + case MCExpr::Constant: + return MCSymbolRefExpr::VK_None; + + case MCExpr::SymbolRef: { + const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(Expr); + return SRE->getKind(); + } + case MCExpr::Binary: { + const MCBinaryExpr *ABE = cast<MCBinaryExpr>(Expr); + assert(getAccessVariant(ABE->getRHS()) == MCSymbolRefExpr::VK_None); + return getAccessVariant(ABE->getLHS()); + } + } +} + +MCSymbolRefExpr::VariantKind MCFixup::getAccessVariant() const { + return ::getAccessVariant(getValue()); +} |