blob: 1b56f46c17544dc56090fc30330100fcda2bc529 [file] [log] [blame]
Tom Stellard75aadc22012-12-11 21:25:42 +00001//===-- AMDGPUTargetMachine.h - AMDGPU TargetMachine Interface --*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10/// \file
11/// \brief The AMDGPU TargetMachine interface definition for hw codgen targets.
12//
13//===----------------------------------------------------------------------===//
14
Matt Arsenault6b6a2c32016-03-11 08:00:27 +000015#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H
16#define LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H
Tom Stellard75aadc22012-12-11 21:25:42 +000017
Matt Arsenaultc791f392014-06-23 18:00:31 +000018#include "AMDGPUIntrinsicInfo.h"
Tom Stellard75aadc22012-12-11 21:25:42 +000019#include "AMDGPUSubtarget.h"
Tom Stellard75aadc22012-12-11 21:25:42 +000020
21namespace llvm {
22
Tom Stellard49f8bfd2015-01-06 18:00:21 +000023//===----------------------------------------------------------------------===//
24// AMDGPU Target Machine (R600+)
25//===----------------------------------------------------------------------===//
26
Tom Stellard75aadc22012-12-11 21:25:42 +000027class AMDGPUTargetMachine : public LLVMTargetMachine {
Tom Stellard49f8bfd2015-01-06 18:00:21 +000028protected:
Tom Stellarde135ffd2015-09-25 21:41:28 +000029 std::unique_ptr<TargetLoweringObjectFile> TLOF;
Eric Christopher34aaf972014-08-04 17:37:43 +000030 AMDGPUIntrinsicInfo IntrinsicInfo;
Tom Stellard75aadc22012-12-11 21:25:42 +000031
Matt Arsenault59c0ffa2016-06-27 20:48:03 +000032 StringRef getGPUName(const Function &F) const;
33 StringRef getFeatureString(const Function &F) const;
34
Tom Stellard75aadc22012-12-11 21:25:42 +000035public:
Tom Stellard5dde1d22016-02-05 18:29:17 +000036 AMDGPUTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
Rafael Espindola8c34dd82016-05-18 22:04:49 +000037 StringRef FS, TargetOptions Options,
38 Optional<Reloc::Model> RM, CodeModel::Model CM,
39 CodeGenOpt::Level OL);
Rafael Espindolabd6847f2013-05-23 03:28:39 +000040 ~AMDGPUTargetMachine();
Mehdi Amini93e1ea12015-03-12 00:07:24 +000041
Matt Arsenault43e92fe2016-06-24 06:30:11 +000042 const AMDGPUSubtarget *getSubtargetImpl() const;
Matt Arsenaultf9245b72016-07-22 17:01:25 +000043 const AMDGPUSubtarget *getSubtargetImpl(const Function &) const override = 0;
Matt Arsenault43e92fe2016-06-24 06:30:11 +000044
Benjamin Kramer8c90fd72014-09-03 11:41:21 +000045 const AMDGPUIntrinsicInfo *getIntrinsicInfo() const override {
46 return &IntrinsicInfo;
47 }
Chandler Carruth8b04c0d2015-02-01 13:20:00 +000048 TargetIRAnalysis getTargetIRAnalysis() override;
Chandler Carruth93dcdc42015-01-31 11:17:59 +000049
Aditya Nandakumara2719322014-11-13 09:26:31 +000050 TargetLoweringObjectFile *getObjFileLowering() const override {
Tom Stellarde135ffd2015-09-25 21:41:28 +000051 return TLOF.get();
Aditya Nandakumara2719322014-11-13 09:26:31 +000052 }
Stanislav Mekhanoshin50ea93a2016-12-08 19:46:04 +000053 void addEarlyAsPossiblePasses(PassManagerBase &PM) override;
Tom Stellard75aadc22012-12-11 21:25:42 +000054};
55
Tom Stellard49f8bfd2015-01-06 18:00:21 +000056//===----------------------------------------------------------------------===//
Tom Stellardc65b3602015-02-11 17:11:50 +000057// R600 Target Machine (R600 -> Cayman)
58//===----------------------------------------------------------------------===//
59
Matt Arsenault6b6a2c32016-03-11 08:00:27 +000060class R600TargetMachine final : public AMDGPUTargetMachine {
Matt Arsenault43e92fe2016-06-24 06:30:11 +000061private:
Matt Arsenault59c0ffa2016-06-27 20:48:03 +000062 mutable StringMap<std::unique_ptr<R600Subtarget>> SubtargetMap;
Tom Stellardc65b3602015-02-11 17:11:50 +000063
64public:
Tom Stellard5dde1d22016-02-05 18:29:17 +000065 R600TargetMachine(const Target &T, const Triple &TT, StringRef CPU,
Rafael Espindola8c34dd82016-05-18 22:04:49 +000066 StringRef FS, TargetOptions Options,
67 Optional<Reloc::Model> RM, CodeModel::Model CM,
68 CodeGenOpt::Level OL);
Tom Stellardde5b7b12015-02-11 17:11:51 +000069
70 TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
Matt Arsenault43e92fe2016-06-24 06:30:11 +000071
Matt Arsenault59c0ffa2016-06-27 20:48:03 +000072 const R600Subtarget *getSubtargetImpl(const Function &) const override;
Tom Stellardc65b3602015-02-11 17:11:50 +000073};
74
75//===----------------------------------------------------------------------===//
Tom Stellard49f8bfd2015-01-06 18:00:21 +000076// GCN Target Machine (SI+)
77//===----------------------------------------------------------------------===//
78
Matt Arsenault6b6a2c32016-03-11 08:00:27 +000079class GCNTargetMachine final : public AMDGPUTargetMachine {
Matt Arsenault43e92fe2016-06-24 06:30:11 +000080private:
Matt Arsenault59c0ffa2016-06-27 20:48:03 +000081 mutable StringMap<std::unique_ptr<SISubtarget>> SubtargetMap;
Tom Stellard49f8bfd2015-01-06 18:00:21 +000082
83public:
Tom Stellard5dde1d22016-02-05 18:29:17 +000084 GCNTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
Rafael Espindola8c34dd82016-05-18 22:04:49 +000085 StringRef FS, TargetOptions Options,
86 Optional<Reloc::Model> RM, CodeModel::Model CM,
87 CodeGenOpt::Level OL);
Tom Stellardde5b7b12015-02-11 17:11:51 +000088
89 TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
Matt Arsenault43e92fe2016-06-24 06:30:11 +000090
Matt Arsenault59c0ffa2016-06-27 20:48:03 +000091 const SISubtarget *getSubtargetImpl(const Function &) const override;
Tom Stellard49f8bfd2015-01-06 18:00:21 +000092};
93
Tom Stellard75aadc22012-12-11 21:25:42 +000094} // End namespace llvm
95
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000096#endif