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