diff options
Diffstat (limited to 'contrib/llvm/patches/patch-r262261-llvm-r198029-sparc.diff')
-rw-r--r-- | contrib/llvm/patches/patch-r262261-llvm-r198029-sparc.diff | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/contrib/llvm/patches/patch-r262261-llvm-r198029-sparc.diff b/contrib/llvm/patches/patch-r262261-llvm-r198029-sparc.diff new file mode 100644 index 0000000..6656bce --- /dev/null +++ b/contrib/llvm/patches/patch-r262261-llvm-r198029-sparc.diff @@ -0,0 +1,210 @@ +Pull in r198029 from upstream llvm trunk (by Venkatraman Govindaraju): + + [Sparc] Add target specific MCExpr class to handle sparc specific modifiers like %hi, %lo, etc., + +Introduced here: http://svn.freebsd.org/changeset/base/262261 + +Index: lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp +=================================================================== +--- lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp ++++ lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp +@@ -0,0 +1,84 @@ ++//===-- SparcMCExpr.cpp - Sparc specific MC expression classes --------===// ++// ++// The LLVM Compiler Infrastructure ++// ++// This file is distributed under the University of Illinois Open Source ++// License. See LICENSE.TXT for details. ++// ++//===----------------------------------------------------------------------===// ++// ++// This file contains the implementation of the assembly expression modifiers ++// accepted by the Sparc architecture (e.g. "%hi", "%lo", ...). ++// ++//===----------------------------------------------------------------------===// ++ ++#define DEBUG_TYPE "sparcmcexpr" ++#include "SparcMCExpr.h" ++#include "llvm/MC/MCContext.h" ++#include "llvm/MC/MCAssembler.h" ++#include "llvm/MC/MCELF.h" ++#include "llvm/Object/ELF.h" ++ ++ ++using namespace llvm; ++ ++const SparcMCExpr* ++SparcMCExpr::Create(VariantKind Kind, const MCExpr *Expr, ++ MCContext &Ctx) { ++ return new (Ctx) SparcMCExpr(Kind, Expr); ++} ++ ++ ++void SparcMCExpr::PrintImpl(raw_ostream &OS) const ++{ ++ bool closeParen = true; ++ switch (Kind) { ++ case VK_Sparc_None: closeParen = false; break; ++ case VK_Sparc_LO: OS << "%lo("; break; ++ case VK_Sparc_HI: OS << "%hi("; break; ++ case VK_Sparc_H44: OS << "%h44("; break; ++ case VK_Sparc_M44: OS << "%m44("; break; ++ case VK_Sparc_L44: OS << "%l44("; break; ++ case VK_Sparc_HH: OS << "%hh("; break; ++ case VK_Sparc_HM: OS << "%hm("; break; ++ case VK_Sparc_TLS_GD_HI22: OS << "%tgd_hi22("; break; ++ case VK_Sparc_TLS_GD_LO10: OS << "%tgd_lo10("; break; ++ case VK_Sparc_TLS_GD_ADD: OS << "%tgd_add("; break; ++ case VK_Sparc_TLS_GD_CALL: OS << "%tgd_call("; break; ++ case VK_Sparc_TLS_LDM_HI22: OS << "%tldm_hi22("; break; ++ case VK_Sparc_TLS_LDM_LO10: OS << "%tldm_lo10("; break; ++ case VK_Sparc_TLS_LDM_ADD: OS << "%tldm_add("; break; ++ case VK_Sparc_TLS_LDM_CALL: OS << "%tldm_call("; break; ++ case VK_Sparc_TLS_LDO_HIX22: OS << "%tldo_hix22("; break; ++ case VK_Sparc_TLS_LDO_LOX10: OS << "%tldo_lox10("; break; ++ case VK_Sparc_TLS_LDO_ADD: OS << "%tldo_add("; break; ++ case VK_Sparc_TLS_IE_HI22: OS << "%tie_hi22("; break; ++ case VK_Sparc_TLS_IE_LO10: OS << "%tie_lo10("; break; ++ case VK_Sparc_TLS_IE_LD: OS << "%tie_ld("; break; ++ case VK_Sparc_TLS_IE_LDX: OS << "%tie_ldx("; break; ++ case VK_Sparc_TLS_IE_ADD: OS << "%tie_add("; break; ++ case VK_Sparc_TLS_LE_HIX22: OS << "%tle_hix22("; break; ++ case VK_Sparc_TLS_LE_LOX10: OS << "%tle_lox10("; break; ++ } ++ ++ const MCExpr *Expr = getSubExpr(); ++ Expr->print(OS); ++ if (closeParen) ++ OS << ')'; ++} ++ ++bool ++SparcMCExpr::EvaluateAsRelocatableImpl(MCValue &Res, ++ const MCAsmLayout *Layout) const { ++ assert(0 && "FIXME: Implement SparcMCExpr::EvaluateAsRelocatableImpl"); ++ return getSubExpr()->EvaluateAsRelocatable(Res, *Layout); ++} ++ ++ ++void SparcMCExpr::fixELFSymbolsInTLSFixups(MCAssembler &Asm) const { ++ assert(0 && "FIXME: Implement SparcMCExpr::fixELFSymbolsInTLSFixups"); ++} ++ ++void SparcMCExpr::AddValueSymbols(MCAssembler *Asm) const { ++ assert(0 && "FIXME: Implement SparcMCExpr::AddValueSymbols"); ++} +Index: lib/Target/Sparc/MCTargetDesc/CMakeLists.txt +=================================================================== +--- lib/Target/Sparc/MCTargetDesc/CMakeLists.txt ++++ lib/Target/Sparc/MCTargetDesc/CMakeLists.txt +@@ -1,6 +1,7 @@ + add_llvm_library(LLVMSparcDesc + SparcMCTargetDesc.cpp + SparcMCAsmInfo.cpp ++ SparcMCExpr.cpp + ) + + add_dependencies(LLVMSparcDesc SparcCommonTableGen) +Index: lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h +=================================================================== +--- lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h ++++ lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h +@@ -0,0 +1,98 @@ ++//====- SparcMCExpr.h - Sparc specific MC expression classes --*- C++ -*-=====// ++// ++// The LLVM Compiler Infrastructure ++// ++// This file is distributed under the University of Illinois Open Source ++// License. See LICENSE.TXT for details. ++// ++//===----------------------------------------------------------------------===// ++// ++// This file describes Sparc-specific MCExprs, used for modifiers like ++// "%hi" or "%lo" etc., ++// ++//===----------------------------------------------------------------------===// ++ ++#ifndef LLVM_SPARCMCEXPR_H ++#define LLVM_SPARCMCEXPR_H ++ ++#include "llvm/MC/MCExpr.h" ++ ++namespace llvm { ++ ++class SparcMCExpr : public MCTargetExpr { ++public: ++ enum VariantKind { ++ VK_Sparc_None, ++ VK_Sparc_LO, ++ VK_Sparc_HI, ++ VK_Sparc_H44, ++ VK_Sparc_M44, ++ VK_Sparc_L44, ++ VK_Sparc_HH, ++ VK_Sparc_HM, ++ VK_Sparc_TLS_GD_HI22, ++ VK_Sparc_TLS_GD_LO10, ++ VK_Sparc_TLS_GD_ADD, ++ VK_Sparc_TLS_GD_CALL, ++ VK_Sparc_TLS_LDM_HI22, ++ VK_Sparc_TLS_LDM_LO10, ++ VK_Sparc_TLS_LDM_ADD, ++ VK_Sparc_TLS_LDM_CALL, ++ VK_Sparc_TLS_LDO_HIX22, ++ VK_Sparc_TLS_LDO_LOX10, ++ VK_Sparc_TLS_LDO_ADD, ++ VK_Sparc_TLS_IE_HI22, ++ VK_Sparc_TLS_IE_LO10, ++ VK_Sparc_TLS_IE_LD, ++ VK_Sparc_TLS_IE_LDX, ++ VK_Sparc_TLS_IE_ADD, ++ VK_Sparc_TLS_LE_HIX22, ++ VK_Sparc_TLS_LE_LOX10 ++ }; ++ ++private: ++ const VariantKind Kind; ++ const MCExpr *Expr; ++ ++ explicit SparcMCExpr(VariantKind _Kind, const MCExpr *_Expr) ++ : Kind(_Kind), Expr(_Expr) {} ++ ++public: ++ /// @name Construction ++ /// @{ ++ ++ static const SparcMCExpr *Create(VariantKind Kind, const MCExpr *Expr, ++ MCContext &Ctx); ++ /// @} ++ /// @name Accessors ++ /// @{ ++ ++ /// getOpcode - Get the kind of this expression. ++ VariantKind getKind() const { return Kind; } ++ ++ /// getSubExpr - Get the child of this expression. ++ const MCExpr *getSubExpr() const { return Expr; } ++ ++ /// @} ++ void PrintImpl(raw_ostream &OS) const; ++ bool EvaluateAsRelocatableImpl(MCValue &Res, ++ const MCAsmLayout *Layout) const; ++ void AddValueSymbols(MCAssembler *) const; ++ const MCSection *FindAssociatedSection() const { ++ return getSubExpr()->FindAssociatedSection(); ++ } ++ ++ void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const; ++ ++ static bool classof(const MCExpr *E) { ++ return E->getKind() == MCExpr::Target; ++ } ++ ++ static bool classof(const SparcMCExpr *) { return true; } ++ ++ ++}; ++ ++} // end namespace llvm. ++ ++#endif |