SparcTargetInfo.cpp revision d6fd377f3333922c4e928019cdfa124ff7f4dd2e
1//===-- SparcTargetInfo.cpp - Sparc Target Implementation -----------------===// 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#include "Sparc.h" 11#include "llvm/Module.h" 12#include "llvm/Target/TargetRegistry.h" 13using namespace llvm; 14 15Target llvm::TheSparcTarget; 16 17static unsigned Sparc_TripleMatchQuality(const std::string &TT) { 18 if (TT.size() >= 6 && std::string(TT.begin(), TT.begin()+6) == "sparc-") 19 return 20; 20 21 return 0; 22} 23 24static unsigned Sparc_ModuleMatchQuality(const Module &M) { 25 // Check for a triple match. 26 if (unsigned Q = Sparc_TripleMatchQuality(M.getTargetTriple())) 27 return Q; 28 29 // Otherwise if the target triple is non-empty, we don't match. 30 if (!M.getTargetTriple().empty()) return 0; 31 32 // FIXME: This is bad, the target matching algorithm shouldn't depend on the 33 // host. 34 if (M.getEndianness() == Module::BigEndian && 35 M.getPointerSize() == Module::Pointer32) 36#ifdef __sparc__ 37 return 20; // BE/32 ==> Prefer sparc on sparc 38#else 39 return 5; // BE/32 ==> Prefer ppc elsewhere 40#endif 41 else if (M.getEndianness() != Module::AnyEndianness || 42 M.getPointerSize() != Module::AnyPointerSize) 43 return 0; // Match for some other target 44 45#if defined(__sparc__) 46 return 10; 47#else 48 return 0; 49#endif 50} 51 52extern "C" void LLVMInitializeSparcTargetInfo() { 53 TargetRegistry::RegisterTarget(TheSparcTarget, "sparc", 54 "Sparc", 55 &Sparc_TripleMatchQuality, 56 &Sparc_ModuleMatchQuality); 57} 58