forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			145 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- TargetMachine.cpp - General Target Information ---------------------==//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| // This file describes the general parts of a Target machine.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #include "llvm/CodeGen/MachineFunction.h"
 | |
| #include "llvm/CodeGen/MachineFrameInfo.h"
 | |
| #include "llvm/MC/MCAsmInfo.h"
 | |
| #include "llvm/Target/TargetMachine.h"
 | |
| #include "llvm/Target/TargetOptions.h"
 | |
| #include "llvm/Support/CommandLine.h"
 | |
| using namespace llvm;
 | |
| 
 | |
| //---------------------------------------------------------------------------
 | |
| // Command-line options that tend to be useful on more than one back-end.
 | |
| //
 | |
| 
 | |
| namespace llvm {
 | |
|   bool StrongPHIElim;
 | |
|   bool HasDivModLibcall;
 | |
|   bool AsmVerbosityDefault(false);
 | |
| }
 | |
| 
 | |
| static cl::opt<bool>
 | |
| DataSections("fdata-sections",
 | |
|   cl::desc("Emit data into separate sections"),
 | |
|   cl::init(false));
 | |
| static cl::opt<bool>
 | |
| FunctionSections("ffunction-sections",
 | |
|   cl::desc("Emit functions into separate sections"),
 | |
|   cl::init(false));
 | |
|                          
 | |
| //---------------------------------------------------------------------------
 | |
| // TargetMachine Class
 | |
| //
 | |
| 
 | |
| TargetMachine::TargetMachine(const Target &T,
 | |
|                              StringRef TT, StringRef CPU, StringRef FS,
 | |
|                              const TargetOptions &Options)
 | |
|   : TheTarget(T), TargetTriple(TT), TargetCPU(CPU), TargetFS(FS),
 | |
|     CodeGenInfo(0), AsmInfo(0),
 | |
|     MCRelaxAll(false),
 | |
|     MCNoExecStack(false),
 | |
|     MCSaveTempLabels(false),
 | |
|     MCUseLoc(true),
 | |
|     MCUseCFI(true),
 | |
|     MCUseDwarfDirectory(false),
 | |
|     Options(Options) {
 | |
| }
 | |
| 
 | |
| TargetMachine::~TargetMachine() {
 | |
|   delete CodeGenInfo;
 | |
|   delete AsmInfo;
 | |
| }
 | |
| 
 | |
| /// getRelocationModel - Returns the code generation relocation model. The
 | |
| /// choices are static, PIC, and dynamic-no-pic, and target default.
 | |
| Reloc::Model TargetMachine::getRelocationModel() const {
 | |
|   if (!CodeGenInfo)
 | |
|     return Reloc::Default;
 | |
|   return CodeGenInfo->getRelocationModel();
 | |
| }
 | |
| 
 | |
| /// getCodeModel - Returns the code model. The choices are small, kernel,
 | |
| /// medium, large, and target default.
 | |
| CodeModel::Model TargetMachine::getCodeModel() const {
 | |
|   if (!CodeGenInfo)
 | |
|     return CodeModel::Default;
 | |
|   return CodeGenInfo->getCodeModel();
 | |
| }
 | |
| 
 | |
| /// getOptLevel - Returns the optimization level: None, Less,
 | |
| /// Default, or Aggressive.
 | |
| CodeGenOpt::Level TargetMachine::getOptLevel() const {
 | |
|   if (!CodeGenInfo)
 | |
|     return CodeGenOpt::Default;
 | |
|   return CodeGenInfo->getOptLevel();
 | |
| }
 | |
| 
 | |
| bool TargetMachine::getAsmVerbosityDefault() {
 | |
|   return AsmVerbosityDefault;
 | |
| }
 | |
| 
 | |
| void TargetMachine::setAsmVerbosityDefault(bool V) {
 | |
|   AsmVerbosityDefault = V;
 | |
| }
 | |
| 
 | |
| bool TargetMachine::getFunctionSections() {
 | |
|   return FunctionSections;
 | |
| }
 | |
| 
 | |
| bool TargetMachine::getDataSections() {
 | |
|   return DataSections;
 | |
| }
 | |
| 
 | |
| void TargetMachine::setFunctionSections(bool V) {
 | |
|   FunctionSections = V;
 | |
| }
 | |
| 
 | |
| void TargetMachine::setDataSections(bool V) {
 | |
|   DataSections = V;
 | |
| }
 | |
| 
 | |
| /// DisableFramePointerElim - This returns true if frame pointer elimination
 | |
| /// optimization should be disabled for the given machine function.
 | |
| bool TargetOptions::DisableFramePointerElim(const MachineFunction &MF) const {
 | |
|   // Check to see if we should eliminate non-leaf frame pointers and then
 | |
|   // check to see if we should eliminate all frame pointers.
 | |
|   if (NoFramePointerElimNonLeaf && !NoFramePointerElim) {
 | |
|     const MachineFrameInfo *MFI = MF.getFrameInfo();
 | |
|     return MFI->hasCalls();
 | |
|   }
 | |
| 
 | |
|   return NoFramePointerElim;
 | |
| }
 | |
| 
 | |
| /// LessPreciseFPMAD - This flag return true when -enable-fp-mad option
 | |
| /// is specified on the command line.  When this flag is off(default), the
 | |
| /// code generator is not allowed to generate mad (multiply add) if the
 | |
| /// result is "less precise" than doing those operations individually.
 | |
| bool TargetOptions::LessPreciseFPMAD() const {
 | |
|   return UnsafeFPMath || LessPreciseFPMADOption;
 | |
| }
 | |
| 
 | |
| /// HonorSignDependentRoundingFPMath - Return true if the codegen must assume
 | |
| /// that the rounding mode of the FPU can change from its default.
 | |
| bool TargetOptions::HonorSignDependentRoundingFPMath() const {
 | |
|   return !UnsafeFPMath && HonorSignDependentRoundingFPMathOption;
 | |
| }
 | |
| 
 | |
| /// getTrapFunctionName - If this returns a non-empty string, this means isel
 | |
| /// should lower Intrinsic::trap to a call to the specified function name
 | |
| /// instead of an ISD::TRAP node.
 | |
| StringRef TargetOptions::getTrapFunctionName() const {
 | |
|   return TrapFuncName;
 | |
| }
 |