llvm.org GIT mirror llvm / release_39 lib / Target / AMDGPU / AMDGPUTargetMachine.h
release_39

Tree @release_39 (Download .tar.gz)

AMDGPUTargetMachine.h @release_39

f98f2ce
 
 
 
 
 
 
 
 
 
 
 
 
 
7137d0d
 
f98f2ce
b170a80
f98f2ce
 
 
 
1f996fa
 
 
 
f98f2ce
1f996fa
1566e71
b88bbc0
f98f2ce
d35aece
 
 
f98f2ce
739e22c
ac8db59
 
 
23e24bd
ceb9150
759ed7e
 
 
a80ff26
 
 
6e89e13
1937233
847729d
1566e71
847729d
f98f2ce
 
1f996fa
5b98db6
 
 
7137d0d
759ed7e
d35aece
5b98db6
 
739e22c
ac8db59
 
 
28f550e
 
759ed7e
d35aece
5b98db6
 
 
1f996fa
 
 
7137d0d
759ed7e
d35aece
1f996fa
 
739e22c
ac8db59
 
 
28f550e
 
759ed7e
d35aece
1f996fa
 
759ed7e
 
 
 
 
 
 
f98f2ce
 
00e08fc
//===-- AMDGPUTargetMachine.h - AMDGPU TargetMachine Interface --*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
/// \file
/// \brief The AMDGPU TargetMachine interface definition for hw codgen targets.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H
#define LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H

#include "AMDGPUIntrinsicInfo.h"
#include "AMDGPUSubtarget.h"

namespace llvm {

//===----------------------------------------------------------------------===//
// AMDGPU Target Machine (R600+)
//===----------------------------------------------------------------------===//

class AMDGPUTargetMachine : public LLVMTargetMachine {
protected:
  std::unique_ptr<TargetLoweringObjectFile> TLOF;
  AMDGPUIntrinsicInfo IntrinsicInfo;

  StringRef getGPUName(const Function &F) const;
  StringRef getFeatureString(const Function &F) const;

public:
  AMDGPUTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
                      StringRef FS, TargetOptions Options,
                      Optional<Reloc::Model> RM, CodeModel::Model CM,
                      CodeGenOpt::Level OL);
  ~AMDGPUTargetMachine();

  const AMDGPUSubtarget *getSubtargetImpl() const;
  const AMDGPUSubtarget *getSubtargetImpl(const Function &) const override;

  const AMDGPUIntrinsicInfo *getIntrinsicInfo() const override {
    return &IntrinsicInfo;
  }
  TargetIRAnalysis getTargetIRAnalysis() override;

  TargetLoweringObjectFile *getObjFileLowering() const override {
    return TLOF.get();
  }
};

//===----------------------------------------------------------------------===//
// R600 Target Machine (R600 -> Cayman)
//===----------------------------------------------------------------------===//

class R600TargetMachine final : public AMDGPUTargetMachine {
private:
  mutable StringMap<std::unique_ptr<R600Subtarget>> SubtargetMap;

public:
  R600TargetMachine(const Target &T, const Triple &TT, StringRef CPU,
                    StringRef FS, TargetOptions Options,
                    Optional<Reloc::Model> RM, CodeModel::Model CM,
                    CodeGenOpt::Level OL);

  TargetPassConfig *createPassConfig(PassManagerBase &PM) override;

  const R600Subtarget *getSubtargetImpl(const Function &) const override;
};

//===----------------------------------------------------------------------===//
// GCN Target Machine (SI+)
//===----------------------------------------------------------------------===//

class GCNTargetMachine final : public AMDGPUTargetMachine {
private:
  mutable StringMap<std::unique_ptr<SISubtarget>> SubtargetMap;

public:
  GCNTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
                   StringRef FS, TargetOptions Options,
                   Optional<Reloc::Model> RM, CodeModel::Model CM,
                   CodeGenOpt::Level OL);

  TargetPassConfig *createPassConfig(PassManagerBase &PM) override;

  const SISubtarget *getSubtargetImpl(const Function &) const override;
};

inline const AMDGPUSubtarget *AMDGPUTargetMachine::getSubtargetImpl(
  const Function &F) const {
  if (getTargetTriple().getArch() == Triple::amdgcn)
    return static_cast<const GCNTargetMachine *>(this)->getSubtargetImpl(F);
  return static_cast<const R600TargetMachine *>(this)->getSubtargetImpl(F);
}

} // End namespace llvm

#endif