]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/llvm/patches/patch-r262261-llvm-r198029-sparc.diff
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / llvm / patches / patch-r262261-llvm-r198029-sparc.diff
1 Pull 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
5 Introduced here: http://svnweb.freebsd.org/changeset/base/262261
6
7 Index: 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 +}
96 Index: 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)
108 Index: 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