Nikita Popov 9dc3255cb9
[Clang] Use DataLayout from TargetParser (#171135)
This switches clang to use the data layouts from TargetParser, instead
of maintaining its own copy of data layouts, which are required to match
the backend data layouts.

For now I've kept explicit calls to resetDataLayout(), just with the
argument implied by the triple and ABI. Ideally this would happen
automatically, but the way these classes are initialized currently
doesn't offer a great place to do this.

Previously resetDataLayout() also set the UserLabelPrefix. I've
separated this out, with a reasonable default so that most targets don't
need to worry about it.

I've kept the explicit data layouts for TCE and SPIR (without the V).
These seem to not correspond to real LLVM targets.

I've also fixed the XCore data layout in TargetParser, which was
incorrectly set to the same one as Xtensa. It was previously unused.
2025-12-09 07:42:02 +00:00

108 lines
3.1 KiB
C++

//===--- CSKY.h - Declare CSKY target feature support -----------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file declares CSKY TargetInfo objects.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_CSKY_H
#define LLVM_CLANG_LIB_BASIC_TARGETS_CSKY_H
#include "clang/Basic/MacroBuilder.h"
#include "clang/Basic/TargetInfo.h"
#include "llvm/TargetParser/CSKYTargetParser.h"
namespace clang {
namespace targets {
class LLVM_LIBRARY_VISIBILITY CSKYTargetInfo : public TargetInfo {
protected:
std::string ABI;
llvm::CSKY::ArchKind Arch = llvm::CSKY::ArchKind::INVALID;
std::string CPU;
bool HardFloat = false;
bool HardFloatABI = false;
bool FPUV2_SF = false;
bool FPUV2_DF = false;
bool FPUV3_SF = false;
bool FPUV3_DF = false;
bool VDSPV2 = false;
bool VDSPV1 = false;
bool DSPV2 = false;
bool is3E3R1 = false;
public:
CSKYTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
: TargetInfo(Triple) {
NoAsmVariants = true;
LongLongAlign = 32;
SuitableAlign = 32;
DoubleAlign = LongDoubleAlign = 32;
SizeType = UnsignedInt;
PtrDiffType = SignedInt;
IntPtrType = SignedInt;
WCharType = SignedInt;
WIntType = UnsignedInt;
UseZeroLengthBitfieldAlignment = true;
MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
setABI("abiv2");
resetDataLayout();
}
StringRef getABI() const override { return ABI; }
bool setABI(const std::string &Name) override {
if (Name == "abiv2" || Name == "abiv1") {
ABI = Name;
return true;
}
return false;
}
bool setCPU(const std::string &Name) override;
bool isValidCPUName(StringRef Name) const override;
unsigned getMinGlobalAlign(uint64_t, bool HasNonWeakDef) const override;
llvm::SmallVector<Builtin::InfosShard> getTargetBuiltins() const override {
return {};
}
BuiltinVaListKind getBuiltinVaListKind() const override {
return VoidPtrBuiltinVaList;
}
bool validateAsmConstraint(const char *&Name,
TargetInfo::ConstraintInfo &info) const override;
std::string_view getClobbers() const override { return ""; }
void getTargetDefines(const LangOptions &Opts,
MacroBuilder &Builder) const override;
bool hasFeature(StringRef Feature) const override;
bool handleTargetFeatures(std::vector<std::string> &Features,
DiagnosticsEngine &Diags) override;
/// Whether target allows to overalign ABI-specified preferred alignment
bool allowsLargerPreferedTypeAlignment() const override { return false; }
bool hasBitIntType() const override { return true; }
protected:
ArrayRef<const char *> getGCCRegNames() const override;
ArrayRef<GCCRegAlias> getGCCRegAliases() const override;
};
} // namespace targets
} // namespace clang
#endif // LLVM_CLANG_LIB_BASIC_TARGETS_CSKY_H