1b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//=-- HexagonTargetMachine.h - Define TargetMachine for Hexagon ---*- C++ -*-=//
2b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
3b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//                     The LLVM Compiler Infrastructure
4b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
5b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// This file is distributed under the University of Illinois Open Source
6b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// License. See LICENSE.TXT for details.
7b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
8b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//===----------------------------------------------------------------------===//
9b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
10b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// This file declares the Hexagon specific subclass of TargetMachine.
11b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
12b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//===----------------------------------------------------------------------===//
13b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
14b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#ifndef HexagonTARGETMACHINE_H
15b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#define HexagonTARGETMACHINE_H
16b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
17a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "HexagonFrameLowering.h"
18b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "HexagonISelLowering.h"
19a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "HexagonInstrInfo.h"
20b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "HexagonSelectionDAGInfo.h"
21a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "HexagonSubtarget.h"
220b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h"
23a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/Target/TargetMachine.h"
24b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
25b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumnamespace llvm {
26b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
27b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumclass Module;
28b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
29b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumclass HexagonTargetMachine : public LLVMTargetMachine {
303574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow  const DataLayout DL;       // Calculates type size & alignment.
31b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  HexagonSubtarget Subtarget;
32b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  HexagonInstrInfo InstrInfo;
33903456245bda41adc90dcab67623169ee3aaff8bBenjamin Kramer  HexagonTargetLowering TLInfo;
34b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  HexagonSelectionDAGInfo TSInfo;
35b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  HexagonFrameLowering FrameLowering;
36b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  const InstrItineraryData* InstrItins;
37b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
38b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumpublic:
39b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  HexagonTargetMachine(const Target &T, StringRef TT,StringRef CPU,
401e0c9ab0d13c32e387dde95f78cf78e301ac49a7Craig Topper                       StringRef FS, const TargetOptions &Options,
411e0c9ab0d13c32e387dde95f78cf78e301ac49a7Craig Topper                       Reloc::Model RM, CodeModel::Model CM,
421e0c9ab0d13c32e387dde95f78cf78e301ac49a7Craig Topper                       CodeGenOpt::Level OL);
43b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
44b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  virtual const HexagonInstrInfo *getInstrInfo() const {
45b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    return &InstrInfo;
46b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  }
47b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  virtual const HexagonSubtarget *getSubtargetImpl() const {
48b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    return &Subtarget;
49b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  }
50b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  virtual const HexagonRegisterInfo *getRegisterInfo() const {
51b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    return &InstrInfo.getRegisterInfo();
52b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  }
53b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
54b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  virtual const InstrItineraryData* getInstrItineraryData() const {
55b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    return InstrItins;
56b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  }
57b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
58b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
59b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  virtual const HexagonTargetLowering* getTargetLowering() const {
60b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    return &TLInfo;
61b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  }
62b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
63b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  virtual const HexagonFrameLowering* getFrameLowering() const {
64b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    return &FrameLowering;
65b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  }
66b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
67b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  virtual const HexagonSelectionDAGInfo* getSelectionDAGInfo() const {
68b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    return &TSInfo;
69b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  }
70b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
713574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow  virtual const DataLayout       *getDataLayout() const { return &DL; }
72b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  static unsigned getModuleMatchQuality(const Module &M);
73b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
74b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  // Pass Pipeline Configuration.
75b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  virtual bool addPassesForOptimizations(PassManagerBase &PM);
76061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick  virtual TargetPassConfig *createPassConfig(PassManagerBase &PM);
77b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum};
78b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
79b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumextern bool flag_aligned_memcpy;
80b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
81b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} // end namespace llvm
82b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
83b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#endif
84