TargetMachine.h revision 8844a0ba898a3a1db7f5fd91ecf6a5402e3d51a0
1c3aae25116e66c177579b0b79182b09340b19753Chris Lattner//===-- llvm/Target/TargetMachine.h - General Target Information -*- C++ -*-==//
2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// This file describes the general parts of a Target machine.
46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//
56fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===//
66fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell
7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman#ifndef LLVM_TARGET_TARGETMACHINE_H
86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell#define LLVM_TARGET_TARGETMACHINE_H
9ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman
10c3aae25116e66c177579b0b79182b09340b19753Chris Lattner#include "llvm/Target/TargetData.h"
11c3aae25116e66c177579b0b79182b09340b19753Chris Lattner#include "Support/NonCopyable.h"
12ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman
13cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerclass TargetInstrInfo;
14cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerclass TargetInstrDescriptor;
15cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerclass TargetSchedInfo;
16cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerclass TargetRegInfo;
17cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerclass TargetFrameInfo;
18c3aae25116e66c177579b0b79182b09340b19753Chris Lattnerclass TargetCacheInfo;
19b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattnerclass TargetOptInfo;
20b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattnerclass MachineCodeEmitter;
21cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerclass MRegisterInfo;
22109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattnerclass FunctionPassManager;
23eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattnerclass PassManager;
24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeclass Pass;
25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
26c3aae25116e66c177579b0b79182b09340b19753Chris Lattner//===----------------------------------------------------------------------===//
27c3aae25116e66c177579b0b79182b09340b19753Chris Lattner///
28b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey/// TargetMachine - Primary interface to the complete machine description for
29c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// the target machine.  All target-specific information should be accessible
30c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/// through this interface.
31c3aae25116e66c177579b0b79182b09340b19753Chris Lattner///
32c3aae25116e66c177579b0b79182b09340b19753Chris Lattnerclass TargetMachine {
33c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  const std::string Name;
34c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  const TargetData DataLayout;		 // Calculates type size & alignment
35c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
36c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  TargetMachine(const TargetMachine&);   // DO NOT IMPLEMENT
37c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  void operator=(const TargetMachine&);  // DO NOT IMPLEMENT
38c3aae25116e66c177579b0b79182b09340b19753Chris Lattnerprotected:
39c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  TargetMachine(const std::string &name, // Can only create subclasses...
40c3aae25116e66c177579b0b79182b09340b19753Chris Lattner		bool LittleEndian = false,
41cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner		unsigned char PtrSize = 8, unsigned char PtrAl = 8,
42cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner		unsigned char DoubleAl = 8, unsigned char FloatAl = 4,
43063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner		unsigned char LongAl = 8, unsigned char IntAl = 4,
44c3aae25116e66c177579b0b79182b09340b19753Chris Lattner		unsigned char ShortAl = 2, unsigned char ByteAl = 1)
45b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey    : Name(name), DataLayout(name, LittleEndian,
46cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner			     PtrSize, PtrAl, DoubleAl, FloatAl, LongAl,
47c3aae25116e66c177579b0b79182b09340b19753Chris Lattner                             IntAl, ShortAl, ByteAl) {}
48c3aae25116e66c177579b0b79182b09340b19753Chris Lattnerpublic:
49cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  virtual ~TargetMachine() {}
50b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner
51b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  const std::string &getName() const { return Name; }
52691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth
53691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth  // Interfaces to the major aspects of target machine information:
54691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth  // -- Instruction opcode and operand information
55691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth  // -- Pipelines and scheduling information
56cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  // -- Register information
57b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey  // -- Stack frame information
58b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey  // -- Cache hierarchy information
59c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  // -- Machine-level optimization information (peephole only)
60c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  //
61cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  virtual const TargetInstrInfo&        getInstrInfo() const = 0;
62cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  virtual const TargetSchedInfo&        getSchedInfo() const = 0;
63c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  virtual const TargetRegInfo&          getRegInfo()   const = 0;
64063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  virtual const TargetFrameInfo&        getFrameInfo() const = 0;
65063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner  virtual const TargetCacheInfo&        getCacheInfo() const = 0;
66b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey  virtual const TargetOptInfo&          getOptInfo()   const = 0;
67cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  const TargetData &getTargetData() const { return DataLayout; }
681080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
691080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  /// getRegisterInfo - If register information is available, return it.  If
701080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  /// not, return null.  This is kept separate from RegInfo until RegInfo has
711080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  /// details of graph coloring register allocation removed from it.
721080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner  ///
73b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  virtual const MRegisterInfo*          getRegisterInfo() const { return 0; }
74b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner
75b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  // Data storage information
76b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  //
77b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  virtual unsigned findOptimalStorageSize(const Type* ty) const;
78b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner
79b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner  /// addPassesToJITCompile - Add passes to the specified pass manager to
80c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// implement a fast dynamic compiler for this target.  Return true if this is
81cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  /// not supported for this target.
82c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  ///
83cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  virtual bool addPassesToJITCompile(FunctionPassManager &PM) { return true; }
84c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
85c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// addPassesToEmitAssembly - Add passes to the specified pass manager to get
86c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// assembly langage code emitted.  Typically this will involve several steps
87cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  /// of code generation.  This method should return true if assembly emission
88c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// is not supported.
89cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner  ///
90c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  virtual bool addPassesToEmitAssembly(PassManager &PM, std::ostream &Out) {
91cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner    return true;
921d4d41411190dd9e62764e56713753d4155764ddNate Begeman  }
931d4d41411190dd9e62764e56713753d4155764ddNate Begeman
941d4d41411190dd9e62764e56713753d4155764ddNate Begeman  /// addPassesToEmitMachineCode - Add passes to the specified pass manager to
951d4d41411190dd9e62764e56713753d4155764ddNate Begeman  /// get machine code emitted.  This uses a MachineCodeEmitter object to handle
961d4d41411190dd9e62764e56713753d4155764ddNate Begeman  /// actually outputting the machine code and resolving things like the address
971d4d41411190dd9e62764e56713753d4155764ddNate Begeman  /// of functions.  This method should returns true if machine code emission is
98c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  /// not supported.
99c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  ///
100c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  virtual bool addPassesToEmitMachineCode(FunctionPassManager &PM,
101cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner                                          MachineCodeEmitter &MCE) {
102c3aae25116e66c177579b0b79182b09340b19753Chris Lattner    return true;
103c3aae25116e66c177579b0b79182b09340b19753Chris Lattner  }
104063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner};
105c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
106d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner#endif
107d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner