patch-r262261-llvm-r198029-sparc.diff revision 269012
1Pull in r198029 from upstream llvm trunk (by Venkatraman Govindaraju): 2 3 [Sparc] Add target specific MCExpr class to handle sparc specific modifiers like %hi, %lo, etc., 4 5Introduced here: http://svnweb.freebsd.org/changeset/base/262261 6 7Index: lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp 8=================================================================== 9--- lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp 10+++ lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp 11@@ -0,0 +1,84 @@ 12+//===-- SparcMCExpr.cpp - Sparc specific MC expression classes --------===// 13+// 14+// The LLVM Compiler Infrastructure 15+// 16+// This file is distributed under the University of Illinois Open Source 17+// License. See LICENSE.TXT for details. 18+// 19+//===----------------------------------------------------------------------===// 20+// 21+// This file contains the implementation of the assembly expression modifiers 22+// accepted by the Sparc architecture (e.g. "%hi", "%lo", ...). 23+// 24+//===----------------------------------------------------------------------===// 25+ 26+#define DEBUG_TYPE "sparcmcexpr" 27+#include "SparcMCExpr.h" 28+#include "llvm/MC/MCContext.h" 29+#include "llvm/MC/MCAssembler.h" 30+#include "llvm/MC/MCELF.h" 31+#include "llvm/Object/ELF.h" 32+ 33+ 34+using namespace llvm; 35+ 36+const SparcMCExpr* 37+SparcMCExpr::Create(VariantKind Kind, const MCExpr *Expr, 38+ MCContext &Ctx) { 39+ return new (Ctx) SparcMCExpr(Kind, Expr); 40+} 41+ 42+ 43+void SparcMCExpr::PrintImpl(raw_ostream &OS) const 44+{ 45+ bool closeParen = true; 46+ switch (Kind) { 47+ case VK_Sparc_None: closeParen = false; break; 48+ case VK_Sparc_LO: OS << "%lo("; break; 49+ case VK_Sparc_HI: OS << "%hi("; break; 50+ case VK_Sparc_H44: OS << "%h44("; break; 51+ case VK_Sparc_M44: OS << "%m44("; break; 52+ case VK_Sparc_L44: OS << "%l44("; break; 53+ case VK_Sparc_HH: OS << "%hh("; break; 54+ case VK_Sparc_HM: OS << "%hm("; break; 55+ case VK_Sparc_TLS_GD_HI22: OS << "%tgd_hi22("; break; 56+ case VK_Sparc_TLS_GD_LO10: OS << "%tgd_lo10("; break; 57+ case VK_Sparc_TLS_GD_ADD: OS << "%tgd_add("; break; 58+ case VK_Sparc_TLS_GD_CALL: OS << "%tgd_call("; break; 59+ case VK_Sparc_TLS_LDM_HI22: OS << "%tldm_hi22("; break; 60+ case VK_Sparc_TLS_LDM_LO10: OS << "%tldm_lo10("; break; 61+ case VK_Sparc_TLS_LDM_ADD: OS << "%tldm_add("; break; 62+ case VK_Sparc_TLS_LDM_CALL: OS << "%tldm_call("; break; 63+ case VK_Sparc_TLS_LDO_HIX22: OS << "%tldo_hix22("; break; 64+ case VK_Sparc_TLS_LDO_LOX10: OS << "%tldo_lox10("; break; 65+ case VK_Sparc_TLS_LDO_ADD: OS << "%tldo_add("; break; 66+ case VK_Sparc_TLS_IE_HI22: OS << "%tie_hi22("; break; 67+ case VK_Sparc_TLS_IE_LO10: OS << "%tie_lo10("; break; 68+ case VK_Sparc_TLS_IE_LD: OS << "%tie_ld("; break; 69+ case VK_Sparc_TLS_IE_LDX: OS << "%tie_ldx("; break; 70+ case VK_Sparc_TLS_IE_ADD: OS << "%tie_add("; break; 71+ case VK_Sparc_TLS_LE_HIX22: OS << "%tle_hix22("; break; 72+ case VK_Sparc_TLS_LE_LOX10: OS << "%tle_lox10("; break; 73+ } 74+ 75+ const MCExpr *Expr = getSubExpr(); 76+ Expr->print(OS); 77+ if (closeParen) 78+ OS << ')'; 79+} 80+ 81+bool 82+SparcMCExpr::EvaluateAsRelocatableImpl(MCValue &Res, 83+ const MCAsmLayout *Layout) const { 84+ assert(0 && "FIXME: Implement SparcMCExpr::EvaluateAsRelocatableImpl"); 85+ return getSubExpr()->EvaluateAsRelocatable(Res, *Layout); 86+} 87+ 88+ 89+void SparcMCExpr::fixELFSymbolsInTLSFixups(MCAssembler &Asm) const { 90+ assert(0 && "FIXME: Implement SparcMCExpr::fixELFSymbolsInTLSFixups"); 91+} 92+ 93+void SparcMCExpr::AddValueSymbols(MCAssembler *Asm) const { 94+ assert(0 && "FIXME: Implement SparcMCExpr::AddValueSymbols"); 95+} 96Index: lib/Target/Sparc/MCTargetDesc/CMakeLists.txt 97=================================================================== 98--- lib/Target/Sparc/MCTargetDesc/CMakeLists.txt 99+++ lib/Target/Sparc/MCTargetDesc/CMakeLists.txt 100@@ -1,6 +1,7 @@ 101 add_llvm_library(LLVMSparcDesc 102 SparcMCTargetDesc.cpp 103 SparcMCAsmInfo.cpp 104+ SparcMCExpr.cpp 105 ) 106 107 add_dependencies(LLVMSparcDesc SparcCommonTableGen) 108Index: lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h 109=================================================================== 110--- lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h 111+++ lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h 112@@ -0,0 +1,98 @@ 113+//====- SparcMCExpr.h - Sparc specific MC expression classes --*- C++ -*-=====// 114+// 115+// The LLVM Compiler Infrastructure 116+// 117+// This file is distributed under the University of Illinois Open Source 118+// License. See LICENSE.TXT for details. 119+// 120+//===----------------------------------------------------------------------===// 121+// 122+// This file describes Sparc-specific MCExprs, used for modifiers like 123+// "%hi" or "%lo" etc., 124+// 125+//===----------------------------------------------------------------------===// 126+ 127+#ifndef LLVM_SPARCMCEXPR_H 128+#define LLVM_SPARCMCEXPR_H 129+ 130+#include "llvm/MC/MCExpr.h" 131+ 132+namespace llvm { 133+ 134+class SparcMCExpr : public MCTargetExpr { 135+public: 136+ enum VariantKind { 137+ VK_Sparc_None, 138+ VK_Sparc_LO, 139+ VK_Sparc_HI, 140+ VK_Sparc_H44, 141+ VK_Sparc_M44, 142+ VK_Sparc_L44, 143+ VK_Sparc_HH, 144+ VK_Sparc_HM, 145+ VK_Sparc_TLS_GD_HI22, 146+ VK_Sparc_TLS_GD_LO10, 147+ VK_Sparc_TLS_GD_ADD, 148+ VK_Sparc_TLS_GD_CALL, 149+ VK_Sparc_TLS_LDM_HI22, 150+ VK_Sparc_TLS_LDM_LO10, 151+ VK_Sparc_TLS_LDM_ADD, 152+ VK_Sparc_TLS_LDM_CALL, 153+ VK_Sparc_TLS_LDO_HIX22, 154+ VK_Sparc_TLS_LDO_LOX10, 155+ VK_Sparc_TLS_LDO_ADD, 156+ VK_Sparc_TLS_IE_HI22, 157+ VK_Sparc_TLS_IE_LO10, 158+ VK_Sparc_TLS_IE_LD, 159+ VK_Sparc_TLS_IE_LDX, 160+ VK_Sparc_TLS_IE_ADD, 161+ VK_Sparc_TLS_LE_HIX22, 162+ VK_Sparc_TLS_LE_LOX10 163+ }; 164+ 165+private: 166+ const VariantKind Kind; 167+ const MCExpr *Expr; 168+ 169+ explicit SparcMCExpr(VariantKind _Kind, const MCExpr *_Expr) 170+ : Kind(_Kind), Expr(_Expr) {} 171+ 172+public: 173+ /// @name Construction 174+ /// @{ 175+ 176+ static const SparcMCExpr *Create(VariantKind Kind, const MCExpr *Expr, 177+ MCContext &Ctx); 178+ /// @} 179+ /// @name Accessors 180+ /// @{ 181+ 182+ /// getOpcode - Get the kind of this expression. 183+ VariantKind getKind() const { return Kind; } 184+ 185+ /// getSubExpr - Get the child of this expression. 186+ const MCExpr *getSubExpr() const { return Expr; } 187+ 188+ /// @} 189+ void PrintImpl(raw_ostream &OS) const; 190+ bool EvaluateAsRelocatableImpl(MCValue &Res, 191+ const MCAsmLayout *Layout) const; 192+ void AddValueSymbols(MCAssembler *) const; 193+ const MCSection *FindAssociatedSection() const { 194+ return getSubExpr()->FindAssociatedSection(); 195+ } 196+ 197+ void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const; 198+ 199+ static bool classof(const MCExpr *E) { 200+ return E->getKind() == MCExpr::Target; 201+ } 202+ 203+ static bool classof(const SparcMCExpr *) { return true; } 204+ 205+ 206+}; 207+ 208+} // end namespace llvm. 209+ 210+#endif 211