1//===-- SparcTargetMachine.h - Define TargetMachine for Sparc ---*- 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// This file declares the Sparc specific subclass of TargetMachine.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_SPARC_SPARCTARGETMACHINE_H
15#define LLVM_LIB_TARGET_SPARC_SPARCTARGETMACHINE_H
16
17#include "SparcInstrInfo.h"
18#include "SparcSubtarget.h"
19#include "llvm/Target/TargetMachine.h"
20
21namespace llvm {
22
23class SparcTargetMachine : public LLVMTargetMachine {
24  std::unique_ptr<TargetLoweringObjectFile> TLOF;
25  SparcSubtarget Subtarget;
26  bool is64Bit;
27  mutable StringMap<std::unique_ptr<SparcSubtarget>> SubtargetMap;
28public:
29  SparcTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
30                     StringRef FS, const TargetOptions &Options,
31                     Optional<Reloc::Model> RM, CodeModel::Model CM,
32                     CodeGenOpt::Level OL, bool is64bit);
33  ~SparcTargetMachine() override;
34
35  const SparcSubtarget *getSubtargetImpl() const { return &Subtarget; }
36  const SparcSubtarget *getSubtargetImpl(const Function &) const override;
37
38  // Pass Pipeline Configuration
39  TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
40  TargetLoweringObjectFile *getObjFileLowering() const override {
41    return TLOF.get();
42  }
43};
44
45/// Sparc 32-bit target machine
46///
47class SparcV8TargetMachine : public SparcTargetMachine {
48  virtual void anchor();
49public:
50  SparcV8TargetMachine(const Target &T, const Triple &TT, StringRef CPU,
51                       StringRef FS, const TargetOptions &Options,
52                       Optional<Reloc::Model> RM, CodeModel::Model CM,
53                       CodeGenOpt::Level OL);
54};
55
56/// Sparc 64-bit target machine
57///
58class SparcV9TargetMachine : public SparcTargetMachine {
59  virtual void anchor();
60public:
61  SparcV9TargetMachine(const Target &T, const Triple &TT, StringRef CPU,
62                       StringRef FS, const TargetOptions &Options,
63                       Optional<Reloc::Model> RM, CodeModel::Model CM,
64                       CodeGenOpt::Level OL);
65};
66
67class SparcelTargetMachine : public SparcTargetMachine {
68  virtual void anchor();
69
70public:
71  SparcelTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
72                       StringRef FS, const TargetOptions &Options,
73                       Optional<Reloc::Model> RM, CodeModel::Model CM,
74                       CodeGenOpt::Level OL);
75};
76
77} // end namespace llvm
78
79#endif
80