[Modules] Fix potential ODR violations by sinking the DEBUG_TYPE
[oota-llvm.git] / lib / MC / MCFixup.cpp
1 //===- MCFixup.cpp - Assembly Fixup Implementation ------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "llvm/MC/MCFixup.h"
11 using namespace llvm;
12
13 static MCSymbolRefExpr::VariantKind getAccessVariant(const MCExpr *Expr) {
14   switch (Expr->getKind()) {
15   case MCExpr::Unary: {
16     assert(getAccessVariant(cast<MCUnaryExpr>(Expr)->getSubExpr()) ==
17            MCSymbolRefExpr::VK_None);
18     return MCSymbolRefExpr::VK_None;
19   }
20
21   case MCExpr::Target:
22     llvm_unreachable("unsupported");
23
24   case MCExpr::Constant:
25     return MCSymbolRefExpr::VK_None;
26
27   case MCExpr::SymbolRef: {
28     const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(Expr);
29     return SRE->getKind();
30   }
31   case MCExpr::Binary: {
32     const MCBinaryExpr *ABE = cast<MCBinaryExpr>(Expr);
33     assert(getAccessVariant(ABE->getRHS()) == MCSymbolRefExpr::VK_None);
34     return getAccessVariant(ABE->getLHS());
35   }
36   }
37   llvm_unreachable("unknown MCExpr kind");
38 }
39
40 MCSymbolRefExpr::VariantKind MCFixup::getAccessVariant() const {
41   return ::getAccessVariant(getValue());
42 }