OLD | NEW |
1 //===- subzero/src/IceTargetLowering.cpp - Basic lowering implementation --===// | 1 //===- subzero/src/IceTargetLowering.cpp - Basic lowering implementation --===// |
2 // | 2 // |
3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 /// | 9 /// |
10 /// \file | 10 /// \file |
11 /// \brief Implements the skeleton of the TargetLowering class. | 11 /// \brief Implements the skeleton of the TargetLowering class. |
12 /// | 12 /// |
13 /// Specifically this invokes the appropriate lowering method for a given | 13 /// Specifically this invokes the appropriate lowering method for a given |
14 /// instruction kind and driving global register allocation. It also implements | 14 /// instruction kind and driving global register allocation. It also implements |
15 /// the non-deleted instruction iteration in LoweringContext. | 15 /// the non-deleted instruction iteration in LoweringContext. |
16 /// | 16 /// |
17 //===----------------------------------------------------------------------===// | 17 //===----------------------------------------------------------------------===// |
18 | 18 |
19 #include "IceTargetLowering.h" | 19 #include "IceTargetLowering.h" |
20 | 20 |
21 #include "IceBitVector.h" | 21 #include "IceBitVector.h" |
22 #include "IceCfg.h" // setError() | 22 #include "IceCfg.h" // setError() |
23 #include "IceCfgNode.h" | 23 #include "IceCfgNode.h" |
24 #include "IceGlobalContext.h" | 24 #include "IceGlobalContext.h" |
25 #include "IceGlobalInits.h" | 25 #include "IceGlobalInits.h" |
26 #include "IceInstVarIter.h" | 26 #include "IceInstVarIter.h" |
27 #include "IceOperand.h" | 27 #include "IceOperand.h" |
28 #include "IceRegAlloc.h" | 28 #include "IceRegAlloc.h" |
29 | 29 |
| 30 #define TARGET_LOWERING_CLASS_FOR(t) Target_##t |
| 31 |
30 // We prevent target-specific implementation details from leaking outside their | 32 // We prevent target-specific implementation details from leaking outside their |
31 // implementations by forbidding #include of target-specific header files | 33 // implementations by forbidding #include of target-specific header files |
32 // anywhere outside their own files. To create target-specific objects | 34 // anywhere outside their own files. To create target-specific objects |
33 // (TargetLowering, TargetDataLowering, and TargetHeaderLowering) we use the | 35 // (TargetLowering, TargetDataLowering, and TargetHeaderLowering) we use the |
34 // following named constructors. For reference, each target Foo needs to | 36 // following named constructors. For reference, each target Foo needs to |
35 // implement the following named constructors and initializer: | 37 // implement the following named constructors and initializer: |
36 // | 38 // |
37 // namespace Foo { | 39 // namespace Foo { |
38 // unique_ptr<Ice::TargetLowering> createTargetLowering(Ice::Cfg *); | 40 // unique_ptr<Ice::TargetLowering> createTargetLowering(Ice::Cfg *); |
39 // unique_ptr<Ice::TargetDataLowering> | 41 // unique_ptr<Ice::TargetDataLowering> |
40 // createTargetDataLowering(Ice::GlobalContext*); | 42 // createTargetDataLowering(Ice::GlobalContext*); |
41 // unique_ptr<Ice::TargetHeaderLowering> | 43 // unique_ptr<Ice::TargetHeaderLowering> |
42 // createTargetHeaderLowering(Ice::GlobalContext *); | 44 // createTargetHeaderLowering(Ice::GlobalContext *); |
43 // void staticInit(::Ice::GlobalContext *); | 45 // void staticInit(::Ice::GlobalContext *); |
44 // } | 46 // } |
45 #define SUBZERO_TARGET(X) \ | 47 #define SUBZERO_TARGET(X) \ |
46 namespace X { \ | 48 namespace X { \ |
47 std::unique_ptr<::Ice::TargetLowering> \ | 49 std::unique_ptr<::Ice::TargetLowering> \ |
48 createTargetLowering(::Ice::Cfg *Func); \ | 50 createTargetLowering(::Ice::Cfg *Func); \ |
49 std::unique_ptr<::Ice::TargetDataLowering> \ | 51 std::unique_ptr<::Ice::TargetDataLowering> \ |
50 createTargetDataLowering(::Ice::GlobalContext *Ctx); \ | 52 createTargetDataLowering(::Ice::GlobalContext *Ctx); \ |
51 std::unique_ptr<::Ice::TargetHeaderLowering> \ | 53 std::unique_ptr<::Ice::TargetHeaderLowering> \ |
52 createTargetHeaderLowering(::Ice::GlobalContext *Ctx); \ | 54 createTargetHeaderLowering(::Ice::GlobalContext *Ctx); \ |
53 void staticInit(::Ice::GlobalContext *Ctx); \ | 55 void staticInit(::Ice::GlobalContext *Ctx); \ |
54 } // end of namespace X | 56 } // end of namespace X |
55 #include "llvm/Config/SZTargets.def" | 57 #include "SZTargets.def" |
56 #undef SUBZERO_TARGET | 58 #undef SUBZERO_TARGET |
57 | 59 |
58 namespace Ice { | 60 namespace Ice { |
59 void LoweringContext::init(CfgNode *N) { | 61 void LoweringContext::init(CfgNode *N) { |
60 Node = N; | 62 Node = N; |
61 End = getNode()->getInsts().end(); | 63 End = getNode()->getInsts().end(); |
62 rewind(); | 64 rewind(); |
63 advanceForward(Next); | 65 advanceForward(Next); |
64 } | 66 } |
65 | 67 |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 Str << "\n"; | 245 Str << "\n"; |
244 } | 246 } |
245 } | 247 } |
246 | 248 |
247 std::unique_ptr<TargetLowering> | 249 std::unique_ptr<TargetLowering> |
248 TargetLowering::createLowering(TargetArch Target, Cfg *Func) { | 250 TargetLowering::createLowering(TargetArch Target, Cfg *Func) { |
249 switch (Target) { | 251 switch (Target) { |
250 default: | 252 default: |
251 badTargetFatalError(Target); | 253 badTargetFatalError(Target); |
252 #define SUBZERO_TARGET(X) \ | 254 #define SUBZERO_TARGET(X) \ |
253 case Target_##X: \ | 255 case TARGET_LOWERING_CLASS_FOR(X): \ |
254 return ::X::createTargetLowering(Func); | 256 return ::X::createTargetLowering(Func); |
255 #include "llvm/Config/SZTargets.def" | 257 #include "SZTargets.def" |
256 #undef SUBZERO_TARGET | 258 #undef SUBZERO_TARGET |
257 } | 259 } |
258 } | 260 } |
259 | 261 |
260 void TargetLowering::staticInit(GlobalContext *Ctx) { | 262 void TargetLowering::staticInit(GlobalContext *Ctx) { |
261 const TargetArch Target = Ctx->getFlags().getTargetArch(); | 263 const TargetArch Target = Ctx->getFlags().getTargetArch(); |
262 // Call the specified target's static initializer. | 264 // Call the specified target's static initializer. |
263 switch (Target) { | 265 switch (Target) { |
264 default: | 266 default: |
265 badTargetFatalError(Target); | 267 badTargetFatalError(Target); |
266 #define SUBZERO_TARGET(X) \ | 268 #define SUBZERO_TARGET(X) \ |
267 case Target_##X: { \ | 269 case TARGET_LOWERING_CLASS_FOR(X): { \ |
268 static bool InitGuard##X = false; \ | 270 static bool InitGuard##X = false; \ |
269 if (InitGuard##X) { \ | 271 if (InitGuard##X) { \ |
270 return; \ | 272 return; \ |
271 } \ | 273 } \ |
272 InitGuard##X = true; \ | 274 InitGuard##X = true; \ |
273 ::X::staticInit(Ctx); \ | 275 ::X::staticInit(Ctx); \ |
274 } break; | 276 } break; |
275 #include "llvm/Config/SZTargets.def" | 277 #include "SZTargets.def" |
276 #undef SUBZERO_TARGET | 278 #undef SUBZERO_TARGET |
277 } | 279 } |
278 } | 280 } |
279 | 281 |
280 TargetLowering::SandboxType | 282 TargetLowering::SandboxType |
281 TargetLowering::determineSandboxTypeFromFlags(const ClFlags &Flags) { | 283 TargetLowering::determineSandboxTypeFromFlags(const ClFlags &Flags) { |
282 assert(!Flags.getUseSandboxing() || !Flags.getUseNonsfi()); | 284 assert(!Flags.getUseSandboxing() || !Flags.getUseNonsfi()); |
283 if (Flags.getUseNonsfi()) { | 285 if (Flags.getUseNonsfi()) { |
284 return TargetLowering::ST_Nonsfi; | 286 return TargetLowering::ST_Nonsfi; |
285 } | 287 } |
(...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
739 } | 741 } |
740 } | 742 } |
741 | 743 |
742 std::unique_ptr<TargetDataLowering> | 744 std::unique_ptr<TargetDataLowering> |
743 TargetDataLowering::createLowering(GlobalContext *Ctx) { | 745 TargetDataLowering::createLowering(GlobalContext *Ctx) { |
744 TargetArch Target = Ctx->getFlags().getTargetArch(); | 746 TargetArch Target = Ctx->getFlags().getTargetArch(); |
745 switch (Target) { | 747 switch (Target) { |
746 default: | 748 default: |
747 badTargetFatalError(Target); | 749 badTargetFatalError(Target); |
748 #define SUBZERO_TARGET(X) \ | 750 #define SUBZERO_TARGET(X) \ |
749 case Target_##X: \ | 751 case TARGET_LOWERING_CLASS_FOR(X): \ |
750 return ::X::createTargetDataLowering(Ctx); | 752 return ::X::createTargetDataLowering(Ctx); |
751 #include "llvm/Config/SZTargets.def" | 753 #include "SZTargets.def" |
752 #undef SUBZERO_TARGET | 754 #undef SUBZERO_TARGET |
753 } | 755 } |
754 } | 756 } |
755 | 757 |
756 TargetDataLowering::~TargetDataLowering() = default; | 758 TargetDataLowering::~TargetDataLowering() = default; |
757 | 759 |
758 namespace { | 760 namespace { |
759 | 761 |
760 // dataSectionSuffix decides whether to use SectionSuffix or VarName as data | 762 // dataSectionSuffix decides whether to use SectionSuffix or VarName as data |
761 // section suffix. Essentially, when using separate data sections for globals | 763 // section suffix. Essentially, when using separate data sections for globals |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
870 Str << "\t.size\t" << Name << ", " << Size << "\n"; | 872 Str << "\t.size\t" << Name << ", " << Size << "\n"; |
871 } | 873 } |
872 | 874 |
873 std::unique_ptr<TargetHeaderLowering> | 875 std::unique_ptr<TargetHeaderLowering> |
874 TargetHeaderLowering::createLowering(GlobalContext *Ctx) { | 876 TargetHeaderLowering::createLowering(GlobalContext *Ctx) { |
875 TargetArch Target = Ctx->getFlags().getTargetArch(); | 877 TargetArch Target = Ctx->getFlags().getTargetArch(); |
876 switch (Target) { | 878 switch (Target) { |
877 default: | 879 default: |
878 badTargetFatalError(Target); | 880 badTargetFatalError(Target); |
879 #define SUBZERO_TARGET(X) \ | 881 #define SUBZERO_TARGET(X) \ |
880 case Target_##X: \ | 882 case TARGET_LOWERING_CLASS_FOR(X): \ |
881 return ::X::createTargetHeaderLowering(Ctx); | 883 return ::X::createTargetHeaderLowering(Ctx); |
882 #include "llvm/Config/SZTargets.def" | 884 #include "SZTargets.def" |
883 #undef SUBZERO_TARGET | 885 #undef SUBZERO_TARGET |
884 } | 886 } |
885 } | 887 } |
886 | 888 |
887 TargetHeaderLowering::~TargetHeaderLowering() = default; | 889 TargetHeaderLowering::~TargetHeaderLowering() = default; |
888 | 890 |
889 } // end of namespace Ice | 891 } // end of namespace Ice |
OLD | NEW |