OLD | NEW |
1 //===- subzero/src/IceTargetLowering.h - Lowering interface -----*- C++ -*-===// | 1 //===- subzero/src/IceTargetLowering.h - Lowering interface -----*- C++ -*-===// |
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 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 // a TargetLowering object pointer and an Inst pointer, it adds appropriate | 50 // a TargetLowering object pointer and an Inst pointer, it adds appropriate |
51 // FakeDef and FakeUse instructions to try maintain liveness consistency. | 51 // FakeDef and FakeUse instructions to try maintain liveness consistency. |
52 #define UnimplementedLoweringError(Target, Instr) \ | 52 #define UnimplementedLoweringError(Target, Instr) \ |
53 do { \ | 53 do { \ |
54 if ((Target)->Ctx->getFlags().getSkipUnimplemented()) { \ | 54 if ((Target)->Ctx->getFlags().getSkipUnimplemented()) { \ |
55 (Target)->addFakeDefUses(Instr); \ | 55 (Target)->addFakeDefUses(Instr); \ |
56 } else { \ | 56 } else { \ |
57 /* Use llvm_unreachable instead of report_fatal_error, which gives \ | 57 /* Use llvm_unreachable instead of report_fatal_error, which gives \ |
58 better stack traces. */ \ | 58 better stack traces. */ \ |
59 llvm_unreachable( \ | 59 llvm_unreachable( \ |
60 ("Not yet implemented: " + Instr->getInstName()).c_str()); \ | 60 (std::string("Not yet implemented: ") + Instr->getInstName()) \ |
| 61 .c_str()); \ |
61 abort(); \ | 62 abort(); \ |
62 } \ | 63 } \ |
63 } while (0) | 64 } while (0) |
64 | 65 |
65 /// LoweringContext makes it easy to iterate through non-deleted instructions in | 66 /// LoweringContext makes it easy to iterate through non-deleted instructions in |
66 /// a node, and insert new (lowered) instructions at the current point. Along | 67 /// a node, and insert new (lowered) instructions at the current point. Along |
67 /// with the instruction list container and associated iterators, it holds the | 68 /// with the instruction list container and associated iterators, it holds the |
68 /// current node, which is needed when inserting new instructions in order to | 69 /// current node, which is needed when inserting new instructions in order to |
69 /// track whether variables are used as single-block or multi-block. | 70 /// track whether variables are used as single-block or multi-block. |
70 class LoweringContext { | 71 class LoweringContext { |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 /// } | 166 /// } |
166 class TargetLowering { | 167 class TargetLowering { |
167 TargetLowering() = delete; | 168 TargetLowering() = delete; |
168 TargetLowering(const TargetLowering &) = delete; | 169 TargetLowering(const TargetLowering &) = delete; |
169 TargetLowering &operator=(const TargetLowering &) = delete; | 170 TargetLowering &operator=(const TargetLowering &) = delete; |
170 | 171 |
171 public: | 172 public: |
172 static void staticInit(GlobalContext *Ctx); | 173 static void staticInit(GlobalContext *Ctx); |
173 // Each target must define a public static method: | 174 // Each target must define a public static method: |
174 // static void staticInit(GlobalContext *Ctx); | 175 // static void staticInit(GlobalContext *Ctx); |
| 176 static bool shouldBePooled(const class Constant *C); |
175 | 177 |
176 static std::unique_ptr<TargetLowering> createLowering(TargetArch Target, | 178 static std::unique_ptr<TargetLowering> createLowering(TargetArch Target, |
177 Cfg *Func); | 179 Cfg *Func); |
178 | 180 |
179 virtual std::unique_ptr<Assembler> createAssembler() const = 0; | 181 virtual std::unique_ptr<Assembler> createAssembler() const = 0; |
180 | 182 |
181 void translate() { | 183 void translate() { |
182 switch (Ctx->getFlags().getOptLevel()) { | 184 switch (Ctx->getFlags().getOptLevel()) { |
183 case Opt_m1: | 185 case Opt_m1: |
184 translateOm1(); | 186 translateOm1(); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 } | 232 } |
231 | 233 |
232 virtual SizeT getNumRegisters() const = 0; | 234 virtual SizeT getNumRegisters() const = 0; |
233 /// Returns a variable pre-colored to the specified physical register. This is | 235 /// Returns a variable pre-colored to the specified physical register. This is |
234 /// generally used to get very direct access to the register such as in the | 236 /// generally used to get very direct access to the register such as in the |
235 /// prolog or epilog or for marking scratch registers as killed by a call. If | 237 /// prolog or epilog or for marking scratch registers as killed by a call. If |
236 /// a Type is not provided, a target-specific default type is used. | 238 /// a Type is not provided, a target-specific default type is used. |
237 virtual Variable *getPhysicalRegister(RegNumT RegNum, | 239 virtual Variable *getPhysicalRegister(RegNumT RegNum, |
238 Type Ty = IceType_void) = 0; | 240 Type Ty = IceType_void) = 0; |
239 /// Returns a printable name for the register. | 241 /// Returns a printable name for the register. |
240 virtual IceString getRegName(RegNumT RegNum, Type Ty) const = 0; | 242 virtual const char *getRegName(RegNumT RegNum, Type Ty) const = 0; |
241 | 243 |
242 virtual bool hasFramePointer() const { return false; } | 244 virtual bool hasFramePointer() const { return false; } |
243 virtual void setHasFramePointer() = 0; | 245 virtual void setHasFramePointer() = 0; |
244 virtual RegNumT getStackReg() const = 0; | 246 virtual RegNumT getStackReg() const = 0; |
245 virtual RegNumT getFrameReg() const = 0; | 247 virtual RegNumT getFrameReg() const = 0; |
246 virtual RegNumT getFrameOrStackReg() const = 0; | 248 virtual RegNumT getFrameOrStackReg() const = 0; |
247 virtual size_t typeWidthInBytesOnStack(Type Ty) const = 0; | 249 virtual size_t typeWidthInBytesOnStack(Type Ty) const = 0; |
248 virtual uint32_t getStackAlignment() const = 0; | 250 virtual uint32_t getStackAlignment() const = 0; |
249 virtual void reserveFixedAllocaArea(size_t Size, size_t Align) = 0; | 251 virtual void reserveFixedAllocaArea(size_t Size, size_t Align) = 0; |
250 virtual int32_t getFrameFixedAllocaOffset() const = 0; | 252 virtual int32_t getFrameFixedAllocaOffset() const = 0; |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
357 InstBundleLock::Opt_None); | 359 InstBundleLock::Opt_None); |
358 ~AutoBundle(); | 360 ~AutoBundle(); |
359 | 361 |
360 private: | 362 private: |
361 TargetLowering *const Target; | 363 TargetLowering *const Target; |
362 const bool NeedSandboxing; | 364 const bool NeedSandboxing; |
363 }; | 365 }; |
364 | 366 |
365 explicit TargetLowering(Cfg *Func); | 367 explicit TargetLowering(Cfg *Func); |
366 // Applies command line filters to TypeToRegisterSet array. | 368 // Applies command line filters to TypeToRegisterSet array. |
367 static void | 369 static void filterTypeToRegisterSet( |
368 filterTypeToRegisterSet(GlobalContext *Ctx, int32_t NumRegs, | 370 GlobalContext *Ctx, int32_t NumRegs, SmallBitVector TypeToRegisterSet[], |
369 SmallBitVector TypeToRegisterSet[], | 371 size_t TypeToRegisterSetSize, |
370 size_t TypeToRegisterSetSize, | 372 std::function<std::string(RegNumT)> getRegName, |
371 std::function<IceString(RegNumT)> getRegName, | 373 std::function<const char *(RegClass)> getRegClassName); |
372 std::function<IceString(RegClass)> getRegClassName); | |
373 virtual void lowerAlloca(const InstAlloca *Instr) = 0; | 374 virtual void lowerAlloca(const InstAlloca *Instr) = 0; |
374 virtual void lowerArithmetic(const InstArithmetic *Instr) = 0; | 375 virtual void lowerArithmetic(const InstArithmetic *Instr) = 0; |
375 virtual void lowerAssign(const InstAssign *Instr) = 0; | 376 virtual void lowerAssign(const InstAssign *Instr) = 0; |
376 virtual void lowerBr(const InstBr *Instr) = 0; | 377 virtual void lowerBr(const InstBr *Instr) = 0; |
377 virtual void lowerCall(const InstCall *Instr) = 0; | 378 virtual void lowerCall(const InstCall *Instr) = 0; |
378 virtual void lowerCast(const InstCast *Instr) = 0; | 379 virtual void lowerCast(const InstCast *Instr) = 0; |
379 virtual void lowerFcmp(const InstFcmp *Instr) = 0; | 380 virtual void lowerFcmp(const InstFcmp *Instr) = 0; |
380 virtual void lowerExtractElement(const InstExtractElement *Instr) = 0; | 381 virtual void lowerExtractElement(const InstExtractElement *Instr) = 0; |
381 virtual void lowerIcmp(const InstIcmp *Instr) = 0; | 382 virtual void lowerIcmp(const InstIcmp *Instr) = 0; |
382 virtual void lowerInsertElement(const InstInsertElement *Instr) = 0; | 383 virtual void lowerInsertElement(const InstInsertElement *Instr) = 0; |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
576 class TargetDataLowering { | 577 class TargetDataLowering { |
577 TargetDataLowering() = delete; | 578 TargetDataLowering() = delete; |
578 TargetDataLowering(const TargetDataLowering &) = delete; | 579 TargetDataLowering(const TargetDataLowering &) = delete; |
579 TargetDataLowering &operator=(const TargetDataLowering &) = delete; | 580 TargetDataLowering &operator=(const TargetDataLowering &) = delete; |
580 | 581 |
581 public: | 582 public: |
582 static std::unique_ptr<TargetDataLowering> createLowering(GlobalContext *Ctx); | 583 static std::unique_ptr<TargetDataLowering> createLowering(GlobalContext *Ctx); |
583 virtual ~TargetDataLowering(); | 584 virtual ~TargetDataLowering(); |
584 | 585 |
585 virtual void lowerGlobals(const VariableDeclarationList &Vars, | 586 virtual void lowerGlobals(const VariableDeclarationList &Vars, |
586 const IceString &SectionSuffix) = 0; | 587 const std::string &SectionSuffix) = 0; |
587 virtual void lowerConstants() = 0; | 588 virtual void lowerConstants() = 0; |
588 virtual void lowerJumpTables() = 0; | 589 virtual void lowerJumpTables() = 0; |
589 | 590 |
590 protected: | 591 protected: |
591 void emitGlobal(const VariableDeclaration &Var, | 592 void emitGlobal(const VariableDeclaration &Var, |
592 const IceString &SectionSuffix); | 593 const std::string &SectionSuffix); |
593 | 594 |
594 /// For now, we assume .long is the right directive for emitting 4 byte emit | 595 /// For now, we assume .long is the right directive for emitting 4 byte emit |
595 /// global relocations. However, LLVM MIPS usually uses .4byte instead. | 596 /// global relocations. However, LLVM MIPS usually uses .4byte instead. |
596 /// Perhaps there is some difference when the location is unaligned. | 597 /// Perhaps there is some difference when the location is unaligned. |
597 static const char *getEmit32Directive() { return ".long"; } | 598 static const char *getEmit32Directive() { return ".long"; } |
598 | 599 |
599 explicit TargetDataLowering(GlobalContext *Ctx) : Ctx(Ctx) {} | 600 explicit TargetDataLowering(GlobalContext *Ctx) : Ctx(Ctx) {} |
600 GlobalContext *Ctx; | 601 GlobalContext *Ctx; |
601 }; | 602 }; |
602 | 603 |
(...skipping 13 matching lines...) Expand all Loading... |
616 virtual void lower() {} | 617 virtual void lower() {} |
617 | 618 |
618 protected: | 619 protected: |
619 explicit TargetHeaderLowering(GlobalContext *Ctx) : Ctx(Ctx) {} | 620 explicit TargetHeaderLowering(GlobalContext *Ctx) : Ctx(Ctx) {} |
620 GlobalContext *Ctx; | 621 GlobalContext *Ctx; |
621 }; | 622 }; |
622 | 623 |
623 } // end of namespace Ice | 624 } // end of namespace Ice |
624 | 625 |
625 #endif // SUBZERO_SRC_ICETARGETLOWERING_H | 626 #endif // SUBZERO_SRC_ICETARGETLOWERING_H |
OLD | NEW |