Coverage Report

Created: 2024-01-17 10:31

/src/llvm-project/clang/lib/Basic/Targets/LoongArch.h
Line
Count
Source (jump to first uncovered line)
1
//===-- LoongArch.h - Declare LoongArch target feature support --*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
// This file declares LoongArch TargetInfo objects.
10
//
11
//===----------------------------------------------------------------------===//
12
13
#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_LOONGARCH_H
14
#define LLVM_CLANG_LIB_BASIC_TARGETS_LOONGARCH_H
15
16
#include "clang/Basic/TargetInfo.h"
17
#include "clang/Basic/TargetOptions.h"
18
#include "llvm/Support/Compiler.h"
19
#include "llvm/TargetParser/Triple.h"
20
21
namespace clang {
22
namespace targets {
23
24
class LLVM_LIBRARY_VISIBILITY LoongArchTargetInfo : public TargetInfo {
25
protected:
26
  std::string ABI;
27
  std::string CPU;
28
  bool HasFeatureD;
29
  bool HasFeatureF;
30
  bool HasFeatureLSX;
31
  bool HasFeatureLASX;
32
33
public:
34
  LoongArchTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
35
0
      : TargetInfo(Triple) {
36
0
    HasFeatureD = false;
37
0
    HasFeatureF = false;
38
0
    HasFeatureLSX = false;
39
0
    HasFeatureLASX = false;
40
0
    LongDoubleWidth = 128;
41
0
    LongDoubleAlign = 128;
42
0
    LongDoubleFormat = &llvm::APFloat::IEEEquad();
43
0
    MCountName = "_mcount";
44
0
    SuitableAlign = 128;
45
0
    WCharType = SignedInt;
46
0
    WIntType = UnsignedInt;
47
0
  }
48
49
0
  bool setCPU(const std::string &Name) override {
50
0
    if (!isValidCPUName(Name))
51
0
      return false;
52
0
    CPU = Name;
53
0
    return true;
54
0
  }
55
56
0
  StringRef getCPU() const { return CPU; }
57
58
0
  StringRef getABI() const override { return ABI; }
59
60
  void getTargetDefines(const LangOptions &Opts,
61
                        MacroBuilder &Builder) const override;
62
63
  ArrayRef<Builtin::Info> getTargetBuiltins() const override;
64
65
0
  BuiltinVaListKind getBuiltinVaListKind() const override {
66
0
    return TargetInfo::VoidPtrBuiltinVaList;
67
0
  }
68
69
0
  std::string_view getClobbers() const override { return ""; }
70
71
  ArrayRef<const char *> getGCCRegNames() const override;
72
73
0
  int getEHDataRegisterNumber(unsigned RegNo) const override {
74
0
    if (RegNo == 0)
75
0
      return 4;
76
0
    if (RegNo == 1)
77
0
      return 5;
78
0
    return -1;
79
0
  }
80
81
  ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
82
83
  bool validateAsmConstraint(const char *&Name,
84
                             TargetInfo::ConstraintInfo &Info) const override;
85
  std::string convertConstraint(const char *&Constraint) const override;
86
87
0
  bool hasBitIntType() const override { return true; }
88
89
  bool handleTargetFeatures(std::vector<std::string> &Features,
90
                            DiagnosticsEngine &Diags) override;
91
92
  bool
93
  initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
94
                 StringRef CPU,
95
                 const std::vector<std::string> &FeaturesVec) const override;
96
97
  bool hasFeature(StringRef Feature) const override;
98
99
  bool isValidCPUName(StringRef Name) const override;
100
  void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override;
101
};
102
103
class LLVM_LIBRARY_VISIBILITY LoongArch32TargetInfo
104
    : public LoongArchTargetInfo {
105
public:
106
  LoongArch32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
107
0
      : LoongArchTargetInfo(Triple, Opts) {
108
0
    IntPtrType = SignedInt;
109
0
    PtrDiffType = SignedInt;
110
0
    SizeType = UnsignedInt;
111
0
    resetDataLayout("e-m:e-p:32:32-i64:64-n32-S128");
112
    // TODO: select appropriate ABI.
113
0
    setABI("ilp32d");
114
0
  }
115
116
0
  bool setABI(const std::string &Name) override {
117
0
    if (Name == "ilp32d" || Name == "ilp32f" || Name == "ilp32s") {
118
0
      ABI = Name;
119
0
      return true;
120
0
    }
121
0
    return false;
122
0
  }
123
0
  void setMaxAtomicWidth() override {
124
0
    MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
125
0
  }
126
};
127
128
class LLVM_LIBRARY_VISIBILITY LoongArch64TargetInfo
129
    : public LoongArchTargetInfo {
130
public:
131
  LoongArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
132
0
      : LoongArchTargetInfo(Triple, Opts) {
133
0
    LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
134
0
    IntMaxType = Int64Type = SignedLong;
135
0
    resetDataLayout("e-m:e-p:64:64-i64:64-i128:128-n64-S128");
136
    // TODO: select appropriate ABI.
137
0
    setABI("lp64d");
138
0
  }
139
140
0
  bool setABI(const std::string &Name) override {
141
0
    if (Name == "lp64d" || Name == "lp64f" || Name == "lp64s") {
142
0
      ABI = Name;
143
0
      return true;
144
0
    }
145
0
    return false;
146
0
  }
147
0
  void setMaxAtomicWidth() override {
148
0
    MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
149
0
  }
150
};
151
} // end namespace targets
152
} // end namespace clang
153
154
#endif // LLVM_CLANG_LIB_BASIC_TARGETS_LOONGARCH_H