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