TargetMachine.h revision 8844a0ba898a3a1db7f5fd91ecf6a5402e3d51a0
1282ec57c4cdd4574103922487b6f1563b5034fb4Misha Brukman//===-- llvm/Target/TargetMachine.h - General Target Information -*- C++ -*-==//
2a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve//
3a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve// This file describes the general parts of a Target machine.
4a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve//
5a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve//===----------------------------------------------------------------------===//
6a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve
7a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#ifndef LLVM_TARGET_TARGETMACHINE_H
8a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#define LLVM_TARGET_TARGETMACHINE_H
9a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve
10a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#include "llvm/Target/TargetData.h"
11cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner#include "Support/NonCopyable.h"
12a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve
132584ba5867c06e676519d5c7cccbcd59eb7641bcChris Lattnerclass TargetInstrInfo;
142584ba5867c06e676519d5c7cccbcd59eb7641bcChris Lattnerclass TargetInstrDescriptor;
15d0f166a4868c957041fa0ca0a35adde97aa10c91Chris Lattnerclass TargetSchedInfo;
16d0f166a4868c957041fa0ca0a35adde97aa10c91Chris Lattnerclass TargetRegInfo;
175b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattnerclass TargetFrameInfo;
18f27eeea54fb0176986f76731c499176345047dffChris Lattnerclass TargetCacheInfo;
19f27eeea54fb0176986f76731c499176345047dffChris Lattnerclass TargetOptInfo;
209f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattnerclass MachineCodeEmitter;
21478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattnerclass MRegisterInfo;
228844a0ba898a3a1db7f5fd91ecf6a5402e3d51a0Brian Gaekeclass FunctionPassManager;
23b6dcbfc6d1d18e9b3a5dcd0df5f00f7ac3d0100fChris Lattnerclass PassManager;
24ebc7511e8688f2ec23915570377dd4aaf167560eVikram S. Adveclass Pass;
25a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve
265b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner//===----------------------------------------------------------------------===//
275b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner///
285b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// TargetMachine - Primary interface to the complete machine description for
295b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// the target machine.  All target-specific information should be accessible
305b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner/// through this interface.
315b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner///
3217035c0edf5463fd9edb8496502f4c5a0dc1d7abChris Lattnerclass TargetMachine {
33c56406c236478f718a2257c2b660561ebc855f16Chris Lattner  const std::string Name;
3417035c0edf5463fd9edb8496502f4c5a0dc1d7abChris Lattner  const TargetData DataLayout;		 // Calculates type size & alignment
35a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve
3617035c0edf5463fd9edb8496502f4c5a0dc1d7abChris Lattner  TargetMachine(const TargetMachine&);   // DO NOT IMPLEMENT
3717035c0edf5463fd9edb8496502f4c5a0dc1d7abChris Lattner  void operator=(const TargetMachine&);  // DO NOT IMPLEMENT
38a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adveprotected:
39c56406c236478f718a2257c2b660561ebc855f16Chris Lattner  TargetMachine(const std::string &name, // Can only create subclasses...
40434c86dd3f03dff344793e9faf1a66d164bf21b6Chris Lattner		bool LittleEndian = false,
41a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve		unsigned char PtrSize = 8, unsigned char PtrAl = 8,
42a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve		unsigned char DoubleAl = 8, unsigned char FloatAl = 4,
43a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve		unsigned char LongAl = 8, unsigned char IntAl = 4,
44a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve		unsigned char ShortAl = 2, unsigned char ByteAl = 1)
4510daaa141661d96843f3d8ece0e5a4c2da4b6e87Chris Lattner    : Name(name), DataLayout(name, LittleEndian,
46434c86dd3f03dff344793e9faf1a66d164bf21b6Chris Lattner			     PtrSize, PtrAl, DoubleAl, FloatAl, LongAl,
47c56406c236478f718a2257c2b660561ebc855f16Chris Lattner                             IntAl, ShortAl, ByteAl) {}
48a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Advepublic:
49a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve  virtual ~TargetMachine() {}
506334205cb5c626d2b35e42dd4c710b857bf0a126Chris Lattner
51c56406c236478f718a2257c2b660561ebc855f16Chris Lattner  const std::string &getName() const { return Name; }
52c56406c236478f718a2257c2b660561ebc855f16Chris Lattner
53a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve  // Interfaces to the major aspects of target machine information:
54a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve  // -- Instruction opcode and operand information
55a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve  // -- Pipelines and scheduling information
56a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve  // -- Register information
57d55697cf136150b697b9bbddce9088e87a1be963Vikram S. Adve  // -- Stack frame information
58d55697cf136150b697b9bbddce9088e87a1be963Vikram S. Adve  // -- Cache hierarchy information
59d55697cf136150b697b9bbddce9088e87a1be963Vikram S. Adve  // -- Machine-level optimization information (peephole only)
60a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve  //
612584ba5867c06e676519d5c7cccbcd59eb7641bcChris Lattner  virtual const TargetInstrInfo&        getInstrInfo() const = 0;
62d0f166a4868c957041fa0ca0a35adde97aa10c91Chris Lattner  virtual const TargetSchedInfo&        getSchedInfo() const = 0;
63d0f166a4868c957041fa0ca0a35adde97aa10c91Chris Lattner  virtual const TargetRegInfo&          getRegInfo()   const = 0;
645b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner  virtual const TargetFrameInfo&        getFrameInfo() const = 0;
65f27eeea54fb0176986f76731c499176345047dffChris Lattner  virtual const TargetCacheInfo&        getCacheInfo() const = 0;
66f27eeea54fb0176986f76731c499176345047dffChris Lattner  virtual const TargetOptInfo&          getOptInfo()   const = 0;
6708053e46be0c7f2024b3df7bfad822f71ac94de3Chris Lattner  const TargetData &getTargetData() const { return DataLayout; }
68d55697cf136150b697b9bbddce9088e87a1be963Vikram S. Adve
69478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner  /// getRegisterInfo - If register information is available, return it.  If
705b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner  /// not, return null.  This is kept separate from RegInfo until RegInfo has
715b927c790ed3baa9b555057c9c0904fc34990ba8Chris Lattner  /// details of graph coloring register allocation removed from it.
72478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner  ///
73478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner  virtual const MRegisterInfo*          getRegisterInfo() const { return 0; }
74478df7a7ae3c9aaa753948712d894fade36a8195Chris Lattner
75a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve  // Data storage information
76a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve  //
77c56406c236478f718a2257c2b660561ebc855f16Chris Lattner  virtual unsigned findOptimalStorageSize(const Type* ty) const;
78a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve
799f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner  /// addPassesToJITCompile - Add passes to the specified pass manager to
809f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner  /// implement a fast dynamic compiler for this target.  Return true if this is
819f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner  /// not supported for this target.
829f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner  ///
838844a0ba898a3a1db7f5fd91ecf6a5402e3d51a0Brian Gaeke  virtual bool addPassesToJITCompile(FunctionPassManager &PM) { return true; }
849f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner
85ebb1af16bea8f163cbb74c55ae41885c396f72cbChris Lattner  /// addPassesToEmitAssembly - Add passes to the specified pass manager to get
869f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner  /// assembly langage code emitted.  Typically this will involve several steps
879f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner  /// of code generation.  This method should return true if assembly emission
889f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner  /// is not supported.
89ebb1af16bea8f163cbb74c55ae41885c396f72cbChris Lattner  ///
906334205cb5c626d2b35e42dd4c710b857bf0a126Chris Lattner  virtual bool addPassesToEmitAssembly(PassManager &PM, std::ostream &Out) {
916334205cb5c626d2b35e42dd4c710b857bf0a126Chris Lattner    return true;
926334205cb5c626d2b35e42dd4c710b857bf0a126Chris Lattner  }
93ebc7511e8688f2ec23915570377dd4aaf167560eVikram S. Adve
949f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner  /// addPassesToEmitMachineCode - Add passes to the specified pass manager to
958844a0ba898a3a1db7f5fd91ecf6a5402e3d51a0Brian Gaeke  /// get machine code emitted.  This uses a MachineCodeEmitter object to handle
969f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner  /// actually outputting the machine code and resolving things like the address
979f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner  /// of functions.  This method should returns true if machine code emission is
98b7a2d2256fede467c7f50444eb3cddadcd7d34c9Chris Lattner  /// not supported.
995c1b5244b956a28667bc2a9e7a84fa39697ba715Chris Lattner  ///
1008844a0ba898a3a1db7f5fd91ecf6a5402e3d51a0Brian Gaeke  virtual bool addPassesToEmitMachineCode(FunctionPassManager &PM,
101b7a2d2256fede467c7f50444eb3cddadcd7d34c9Chris Lattner                                          MachineCodeEmitter &MCE) {
1029f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner    return true;
1039f729a30b2e0648209f864da9da8aaa6a4be5e38Chris Lattner  }
104a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve};
105a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve
106a578a6d054e8219c730840700d8d5fd29f15a962Vikram S. Adve#endif
107