1 Pull in r198029 from upstream llvm trunk (by Venkatraman Govindaraju):
3 [Sparc] Add target specific MCExpr class to handle sparc specific modifiers like %hi, %lo, etc.,
5 Introduced here: http://svnweb.freebsd.org/changeset/base/262261
7 Index: lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
8 ===================================================================
9 --- lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
10 +++ lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
12 +//===-- SparcMCExpr.cpp - Sparc specific MC expression classes --------===//
14 +// The LLVM Compiler Infrastructure
16 +// This file is distributed under the University of Illinois Open Source
17 +// License. See LICENSE.TXT for details.
19 +//===----------------------------------------------------------------------===//
21 +// This file contains the implementation of the assembly expression modifiers
22 +// accepted by the Sparc architecture (e.g. "%hi", "%lo", ...).
24 +//===----------------------------------------------------------------------===//
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"
34 +using namespace llvm;
37 +SparcMCExpr::Create(VariantKind Kind, const MCExpr *Expr,
39 + return new (Ctx) SparcMCExpr(Kind, Expr);
43 +void SparcMCExpr::PrintImpl(raw_ostream &OS) const
45 + bool closeParen = true;
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;
75 + const MCExpr *Expr = getSubExpr();
82 +SparcMCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
83 + const MCAsmLayout *Layout) const {
84 + assert(0 && "FIXME: Implement SparcMCExpr::EvaluateAsRelocatableImpl");
85 + return getSubExpr()->EvaluateAsRelocatable(Res, *Layout);
89 +void SparcMCExpr::fixELFSymbolsInTLSFixups(MCAssembler &Asm) const {
90 + assert(0 && "FIXME: Implement SparcMCExpr::fixELFSymbolsInTLSFixups");
93 +void SparcMCExpr::AddValueSymbols(MCAssembler *Asm) const {
94 + assert(0 && "FIXME: Implement SparcMCExpr::AddValueSymbols");
96 Index: lib/Target/Sparc/MCTargetDesc/CMakeLists.txt
97 ===================================================================
98 --- lib/Target/Sparc/MCTargetDesc/CMakeLists.txt
99 +++ lib/Target/Sparc/MCTargetDesc/CMakeLists.txt
101 add_llvm_library(LLVMSparcDesc
102 SparcMCTargetDesc.cpp
107 add_dependencies(LLVMSparcDesc SparcCommonTableGen)
108 Index: lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
109 ===================================================================
110 --- lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
111 +++ lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
113 +//====- SparcMCExpr.h - Sparc specific MC expression classes --*- C++ -*-=====//
115 +// The LLVM Compiler Infrastructure
117 +// This file is distributed under the University of Illinois Open Source
118 +// License. See LICENSE.TXT for details.
120 +//===----------------------------------------------------------------------===//
122 +// This file describes Sparc-specific MCExprs, used for modifiers like
123 +// "%hi" or "%lo" etc.,
125 +//===----------------------------------------------------------------------===//
127 +#ifndef LLVM_SPARCMCEXPR_H
128 +#define LLVM_SPARCMCEXPR_H
130 +#include "llvm/MC/MCExpr.h"
134 +class SparcMCExpr : public MCTargetExpr {
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
166 + const VariantKind Kind;
167 + const MCExpr *Expr;
169 + explicit SparcMCExpr(VariantKind _Kind, const MCExpr *_Expr)
170 + : Kind(_Kind), Expr(_Expr) {}
173 + /// @name Construction
176 + static const SparcMCExpr *Create(VariantKind Kind, const MCExpr *Expr,
179 + /// @name Accessors
182 + /// getOpcode - Get the kind of this expression.
183 + VariantKind getKind() const { return Kind; }
185 + /// getSubExpr - Get the child of this expression.
186 + const MCExpr *getSubExpr() const { return Expr; }
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();
197 + void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const;
199 + static bool classof(const MCExpr *E) {
200 + return E->getKind() == MCExpr::Target;
203 + static bool classof(const SparcMCExpr *) { return true; }
208 +} // end namespace llvm.