diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2021-07-29 20:15:26 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2021-07-29 20:15:26 +0000 |
| commit | 344a3780b2e33f6ca763666c380202b18aab72a3 (patch) | |
| tree | f0b203ee6eb71d7fdd792373e3c81eb18d6934dd /clang/lib/Basic | |
| parent | b60736ec1405bb0a8dd40989f67ef4c93da068ab (diff) | |
vendor/llvm-project/llvmorg-13-init-16847-g88e66fa60ae5vendor/llvm-project/llvmorg-12.0.1-rc2-0-ge7dac564cd0evendor/llvm-project/llvmorg-12.0.1-0-gfed41342a82f
Diffstat (limited to 'clang/lib/Basic')
53 files changed, 1606 insertions, 323 deletions
diff --git a/clang/lib/Basic/Attributes.cpp b/clang/lib/Basic/Attributes.cpp index ff6dbf870fcf..62eea9c59082 100644 --- a/clang/lib/Basic/Attributes.cpp +++ b/clang/lib/Basic/Attributes.cpp @@ -20,6 +20,14 @@ int clang::hasAttribute(AttrSyntax Syntax, const IdentifierInfo *Scope, else if (ScopeName == "_Clang") ScopeName = "clang"; + // As a special case, look for the omp::sequence and omp::directive + // attributes. We support those, but not through the typical attribute + // machinery that goes through TableGen. We support this in all OpenMP modes + // so long as double square brackets are enabled. + if (LangOpts.OpenMP && LangOpts.DoubleSquareBracketAttributes && + ScopeName == "omp") + return (Name == "directive" || Name == "sequence") ? 1 : 0; + #include "clang/Basic/AttrHasAttributeImpl.inc" return 0; diff --git a/clang/lib/Basic/Builtins.cpp b/clang/lib/Basic/Builtins.cpp index 0cd89df41b67..7118aa9dc210 100644 --- a/clang/lib/Basic/Builtins.cpp +++ b/clang/lib/Basic/Builtins.cpp @@ -60,6 +60,8 @@ bool Builtin::Context::builtinIsSupported(const Builtin::Info &BuiltinInfo, bool BuiltinsUnsupported = (LangOpts.NoBuiltin || LangOpts.isNoBuiltinFunc(BuiltinInfo.Name)) && strchr(BuiltinInfo.Attributes, 'f'); + bool CorBuiltinsUnsupported = + !LangOpts.Coroutines && (BuiltinInfo.Langs & COR_LANG); bool MathBuiltinsUnsupported = LangOpts.NoMathBuiltin && BuiltinInfo.HeaderName && llvm::StringRef(BuiltinInfo.HeaderName).equals("math.h"); @@ -75,12 +77,14 @@ bool Builtin::Context::builtinIsSupported(const Builtin::Info &BuiltinInfo, bool OclCUnsupported = !LangOpts.OpenCL && (BuiltinInfo.Langs & ALL_OCLC_LANGUAGES); bool OpenMPUnsupported = !LangOpts.OpenMP && BuiltinInfo.Langs == OMP_LANG; + bool CUDAUnsupported = !LangOpts.CUDA && BuiltinInfo.Langs == CUDA_LANG; bool CPlusPlusUnsupported = !LangOpts.CPlusPlus && BuiltinInfo.Langs == CXX_LANG; - return !BuiltinsUnsupported && !MathBuiltinsUnsupported && !OclCUnsupported && - !OclC1Unsupported && !OclC2Unsupported && !OpenMPUnsupported && - !GnuModeUnsupported && !MSModeUnsupported && !ObjCUnsupported && - !CPlusPlusUnsupported; + return !BuiltinsUnsupported && !CorBuiltinsUnsupported && + !MathBuiltinsUnsupported && !OclCUnsupported && !OclC1Unsupported && + !OclC2Unsupported && !OpenMPUnsupported && !GnuModeUnsupported && + !MSModeUnsupported && !ObjCUnsupported && !CPlusPlusUnsupported && + !CUDAUnsupported; } /// initializeBuiltins - Mark the identifiers for all the builtins with their @@ -105,10 +109,6 @@ void Builtin::Context::initializeBuiltins(IdentifierTable &Table, .setBuiltinID(i + Builtin::FirstTSBuiltin + TSRecords.size()); } -void Builtin::Context::forgetBuiltin(unsigned ID, IdentifierTable &Table) { - Table.get(getRecord(ID).Name).setBuiltinID(0); -} - unsigned Builtin::Context::getRequiredVectorWidth(unsigned ID) const { const char *WidthPos = ::strchr(getRecord(ID).Attributes, 'V'); if (!WidthPos) diff --git a/clang/lib/Basic/CodeGenOptions.cpp b/clang/lib/Basic/CodeGenOptions.cpp index 4fc7a535c9eb..0c609cfa61de 100644 --- a/clang/lib/Basic/CodeGenOptions.cpp +++ b/clang/lib/Basic/CodeGenOptions.cpp @@ -20,12 +20,4 @@ CodeGenOptions::CodeGenOptions() { memcpy(CoverageVersion, "408*", 4); } -bool CodeGenOptions::isNoBuiltinFunc(const char *Name) const { - StringRef FuncName(Name); - for (unsigned i = 0, e = NoBuiltinFuncs.size(); i != e; ++i) - if (FuncName.equals(NoBuiltinFuncs[i])) - return true; - return false; -} - } // end namespace clang diff --git a/clang/lib/Basic/Cuda.cpp b/clang/lib/Basic/Cuda.cpp index 144113f2d2e7..766135bcb376 100644 --- a/clang/lib/Basic/Cuda.cpp +++ b/clang/lib/Basic/Cuda.cpp @@ -32,6 +32,10 @@ const char *CudaVersionToString(CudaVersion V) { return "10.2"; case CudaVersion::CUDA_110: return "11.0"; + case CudaVersion::CUDA_111: + return "11.1"; + case CudaVersion::CUDA_112: + return "11.2"; } llvm_unreachable("invalid enum"); } @@ -48,21 +52,25 @@ CudaVersion CudaStringToVersion(const llvm::Twine &S) { .Case("10.1", CudaVersion::CUDA_101) .Case("10.2", CudaVersion::CUDA_102) .Case("11.0", CudaVersion::CUDA_110) + .Case("11.1", CudaVersion::CUDA_111) + .Case("11.2", CudaVersion::CUDA_112) .Default(CudaVersion::UNKNOWN); } +namespace { struct CudaArchToStringMap { CudaArch arch; const char *arch_name; const char *virtual_arch_name; }; +} // namespace #define SM2(sm, ca) \ { CudaArch::SM_##sm, "sm_" #sm, ca } #define SM(sm) SM2(sm, "compute_" #sm) #define GFX(gpu) \ { CudaArch::GFX##gpu, "gfx" #gpu, "compute_amdgcn" } -CudaArchToStringMap arch_names[] = { +static const CudaArchToStringMap arch_names[] = { // clang-format off {CudaArch::UNUSED, "", ""}, SM2(20, "compute_20"), SM2(21, "compute_20"), // Fermi @@ -71,7 +79,7 @@ CudaArchToStringMap arch_names[] = { SM(60), SM(61), SM(62), // Pascal SM(70), SM(72), // Volta SM(75), // Turing - SM(80), // Ampere + SM(80), SM(86), // Ampere GFX(600), // gfx600 GFX(601), // gfx601 GFX(602), // gfx602 @@ -92,14 +100,18 @@ CudaArchToStringMap arch_names[] = { GFX(906), // gfx906 GFX(908), // gfx908 GFX(909), // gfx909 + GFX(90a), // gfx90a GFX(90c), // gfx90c GFX(1010), // gfx1010 GFX(1011), // gfx1011 GFX(1012), // gfx1012 + GFX(1013), // gfx1013 GFX(1030), // gfx1030 GFX(1031), // gfx1031 GFX(1032), // gfx1032 GFX(1033), // gfx1033 + GFX(1034), // gfx1034 + GFX(1035), // gfx1035 // clang-format on }; #undef SM @@ -164,6 +176,8 @@ CudaVersion MinVersionForCudaArch(CudaArch A) { return CudaVersion::CUDA_100; case CudaArch::SM_80: return CudaVersion::CUDA_110; + case CudaArch::SM_86: + return CudaVersion::CUDA_111; default: llvm_unreachable("invalid enum"); } @@ -209,6 +223,10 @@ CudaVersion ToCudaVersion(llvm::VersionTuple Version) { return CudaVersion::CUDA_102; case 110: return CudaVersion::CUDA_110; + case 111: + return CudaVersion::CUDA_111; + case 112: + return CudaVersion::CUDA_112; default: return CudaVersion::UNKNOWN; } diff --git a/clang/lib/Basic/DarwinSDKInfo.cpp b/clang/lib/Basic/DarwinSDKInfo.cpp new file mode 100644 index 000000000000..fe35f77782c9 --- /dev/null +++ b/clang/lib/Basic/DarwinSDKInfo.cpp @@ -0,0 +1,131 @@ +//===--- DarwinSDKInfo.cpp - SDK Information parser for darwin - ----------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "clang/Basic/DarwinSDKInfo.h" +#include "llvm/Support/ErrorOr.h" +#include "llvm/Support/JSON.h" +#include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/Path.h" + +using namespace clang; + +Optional<VersionTuple> DarwinSDKInfo::RelatedTargetVersionMapping::map( + const VersionTuple &Key, const VersionTuple &MinimumValue, + Optional<VersionTuple> MaximumValue) const { + if (Key < MinimumKeyVersion) + return MinimumValue; + if (Key > MaximumKeyVersion) + return MaximumValue; + auto KV = Mapping.find(Key.normalize()); + if (KV != Mapping.end()) + return KV->getSecond(); + // If no exact entry found, try just the major key version. Only do so when + // a minor version number is present, to avoid recursing indefinitely into + // the major-only check. + if (Key.getMinor()) + return map(VersionTuple(Key.getMajor()), MinimumValue, MaximumValue); + // If this a major only key, return None for a missing entry. + return None; +} + +Optional<DarwinSDKInfo::RelatedTargetVersionMapping> +DarwinSDKInfo::RelatedTargetVersionMapping::parseJSON( + const llvm::json::Object &Obj, VersionTuple MaximumDeploymentTarget) { + VersionTuple Min = VersionTuple(std::numeric_limits<unsigned>::max()); + VersionTuple Max = VersionTuple(0); + VersionTuple MinValue = Min; + llvm::DenseMap<VersionTuple, VersionTuple> Mapping; + for (const auto &KV : Obj) { + if (auto Val = KV.getSecond().getAsString()) { + llvm::VersionTuple KeyVersion; + llvm::VersionTuple ValueVersion; + if (KeyVersion.tryParse(KV.getFirst()) || ValueVersion.tryParse(*Val)) + return None; + Mapping[KeyVersion.normalize()] = ValueVersion; + if (KeyVersion < Min) + Min = KeyVersion; + if (KeyVersion > Max) + Max = KeyVersion; + if (ValueVersion < MinValue) + MinValue = ValueVersion; + } + } + if (Mapping.empty()) + return None; + return RelatedTargetVersionMapping( + Min, Max, MinValue, MaximumDeploymentTarget, std::move(Mapping)); +} + +static Optional<VersionTuple> getVersionKey(const llvm::json::Object &Obj, + StringRef Key) { + auto Value = Obj.getString(Key); + if (!Value) + return None; + VersionTuple Version; + if (Version.tryParse(*Value)) + return None; + return Version; +} + +Optional<DarwinSDKInfo> +DarwinSDKInfo::parseDarwinSDKSettingsJSON(const llvm::json::Object *Obj) { + auto Version = getVersionKey(*Obj, "Version"); + if (!Version) + return None; + auto MaximumDeploymentVersion = + getVersionKey(*Obj, "MaximumDeploymentTarget"); + if (!MaximumDeploymentVersion) + return None; + llvm::DenseMap<OSEnvPair::StorageType, Optional<RelatedTargetVersionMapping>> + VersionMappings; + if (const auto *VM = Obj->getObject("VersionMap")) { + if (const auto *Mapping = VM->getObject("macOS_iOSMac")) { + auto VersionMap = RelatedTargetVersionMapping::parseJSON( + *Mapping, *MaximumDeploymentVersion); + if (!VersionMap) + return None; + VersionMappings[OSEnvPair::macOStoMacCatalystPair().Value] = + std::move(VersionMap); + } + if (const auto *Mapping = VM->getObject("iOSMac_macOS")) { + auto VersionMap = RelatedTargetVersionMapping::parseJSON( + *Mapping, *MaximumDeploymentVersion); + if (!VersionMap) + return None; + VersionMappings[OSEnvPair::macCatalystToMacOSPair().Value] = + std::move(VersionMap); + } + } + + return DarwinSDKInfo(std::move(*Version), + std::move(*MaximumDeploymentVersion), + std::move(VersionMappings)); +} + +Expected<Optional<DarwinSDKInfo>> +clang::parseDarwinSDKInfo(llvm::vfs::FileSystem &VFS, StringRef SDKRootPath) { + llvm::SmallString<256> Filepath = SDKRootPath; + llvm::sys::path::append(Filepath, "SDKSettings.json"); + llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File = + VFS.getBufferForFile(Filepath); + if (!File) { + // If the file couldn't be read, assume it just doesn't exist. + return None; + } + Expected<llvm::json::Value> Result = + llvm::json::parse(File.get()->getBuffer()); + if (!Result) + return Result.takeError(); + + if (const auto *Obj = Result->getAsObject()) { + if (auto SDKInfo = DarwinSDKInfo::parseDarwinSDKSettingsJSON(Obj)) + return std::move(SDKInfo); + } + return llvm::make_error<llvm::StringError>("invalid SDKSettings.json", + llvm::inconvertibleErrorCode()); +} diff --git a/clang/lib/Basic/DiagnosticIDs.cpp b/clang/lib/Basic/DiagnosticIDs.cpp index 06a8e2ed5ebd..c333076d2efc 100644 --- a/clang/lib/Basic/DiagnosticIDs.cpp +++ b/clang/lib/Basic/DiagnosticIDs.cpp @@ -109,15 +109,15 @@ enum { struct StaticDiagInfoRec { uint16_t DiagID; - unsigned DefaultSeverity : 3; - unsigned Class : 3; - unsigned SFINAE : 2; - unsigned WarnNoWerror : 1; - unsigned WarnShowInSystemHeader : 1; - unsigned Deferrable : 1; - unsigned Category : 6; + uint8_t DefaultSeverity : 3; + uint8_t Class : 3; + uint8_t SFINAE : 2; + uint8_t Category : 6; + uint8_t WarnNoWerror : 1; + uint8_t WarnShowInSystemHeader : 1; - uint16_t OptionGroupIndex; + uint16_t OptionGroupIndex : 15; + uint16_t Deferrable : 1; uint16_t DescriptionLen; @@ -168,20 +168,20 @@ VALIDATE_DIAG_SIZE(REFACTORING) #undef STRINGIFY_NAME const StaticDiagInfoRec StaticDiagInfo[] = { +// clang-format off #define DIAG(ENUM, CLASS, DEFAULT_SEVERITY, DESC, GROUP, SFINAE, NOWERROR, \ - SHOWINSYSHEADER, DEFERRABLE, CATEGORY) \ + SHOWINSYSHEADER, DEFERRABLE, CATEGORY) \ { \ diag::ENUM, \ DEFAULT_SEVERITY, \ CLASS, \ DiagnosticIDs::SFINAE, \ + CATEGORY, \ NOWERROR, \ SHOWINSYSHEADER, \ - DEFERRABLE, \ - CATEGORY, \ GROUP, \ + DEFERRABLE, \ STR_SIZE(DESC, uint16_t)}, -// clang-format off #include "clang/Basic/DiagnosticCommonKinds.inc" #include "clang/Basic/DiagnosticDriverKinds.inc" #include "clang/Basic/DiagnosticFrontendKinds.inc" @@ -194,7 +194,7 @@ const StaticDiagInfoRec StaticDiagInfo[] = { #include "clang/Basic/DiagnosticSemaKinds.inc" #include "clang/Basic/DiagnosticAnalysisKinds.inc" #include "clang/Basic/DiagnosticRefactoringKinds.inc" - // clang-format on +// clang-format on #undef DIAG }; diff --git a/clang/lib/Basic/FileManager.cpp b/clang/lib/Basic/FileManager.cpp index 6e9d5d7fb422..74cd2f295be6 100644 --- a/clang/lib/Basic/FileManager.cpp +++ b/clang/lib/Basic/FileManager.cpp @@ -128,7 +128,7 @@ FileManager::getDirectoryRef(StringRef DirName, bool CacheFailure) { // Stat("C:") does not recognize "C:" as a valid directory std::string DirNameStr; if (DirName.size() > 1 && DirName.back() == ':' && - DirName.equals_lower(llvm::sys::path::root_name(DirName))) { + DirName.equals_insensitive(llvm::sys::path::root_name(DirName))) { DirNameStr = DirName.str() + '.'; DirName = DirNameStr; } @@ -384,9 +384,12 @@ FileEntryRef FileManager::getVirtualFileRef(StringRef Filename, off_t Size, // Now that all ancestors of Filename are in the cache, the // following call is guaranteed to find the DirectoryEntry from the - // cache. - auto DirInfo = expectedToOptional( - getDirectoryFromFile(*this, Filename, /*CacheFailure=*/true)); + // cache. A virtual file can also have an empty filename, that could come + // from a source location preprocessor directive with an empty filename as + // an example, so we need to pretend it has a name to ensure a valid directory + // entry can be returned. + auto DirInfo = expectedToOptional(getDirectoryFromFile( + *this, Filename.empty() ? "." : Filename, /*CacheFailure=*/true)); assert(DirInfo && "The directory of a virtual file should already be in the cache."); @@ -608,7 +611,7 @@ StringRef FileManager::getCanonicalName(const DirectoryEntry *Dir) { SmallString<4096> CanonicalNameBuf; if (!FS->getRealPath(Dir->getName(), CanonicalNameBuf)) - CanonicalName = StringRef(CanonicalNameBuf).copy(CanonicalNameStorage); + CanonicalName = CanonicalNameBuf.str().copy(CanonicalNameStorage); CanonicalNames.insert({Dir, CanonicalName}); return CanonicalName; @@ -624,7 +627,7 @@ StringRef FileManager::getCanonicalName(const FileEntry *File) { SmallString<4096> CanonicalNameBuf; if (!FS->getRealPath(File->getName(), CanonicalNameBuf)) - CanonicalName = StringRef(CanonicalNameBuf).copy(CanonicalNameStorage); + CanonicalName = CanonicalNameBuf.str().copy(CanonicalNameStorage); CanonicalNames.insert({File, CanonicalName}); return CanonicalName; diff --git a/clang/lib/Basic/IdentifierTable.cpp b/clang/lib/Basic/IdentifierTable.cpp index 51c6e02e2e2e..d811aeec84a0 100644 --- a/clang/lib/Basic/IdentifierTable.cpp +++ b/clang/lib/Basic/IdentifierTable.cpp @@ -107,8 +107,9 @@ namespace { KEYCXX20 = 0x200000, KEYOPENCLCXX = 0x400000, KEYMSCOMPAT = 0x800000, + KEYSYCL = 0x1000000, KEYALLCXX = KEYCXX | KEYCXX11 | KEYCXX20, - KEYALL = (0xffffff & ~KEYNOMS18 & + KEYALL = (0x1ffffff & ~KEYNOMS18 & ~KEYNOOPENCL) // KEYNOMS18 and KEYNOOPENCL are used to exclude. }; @@ -155,6 +156,8 @@ static KeywordStatus getKeywordStatus(const LangOptions &LangOpts, if (LangOpts.CPlusPlus && (Flags & KEYALLCXX)) return KS_Future; if (LangOpts.CPlusPlus && !LangOpts.CPlusPlus20 && (Flags & CHAR8SUPPORT)) return KS_Future; + if (LangOpts.isSYCL() && (Flags & KEYSYCL)) + return KS_Enabled; return KS_Disabled; } @@ -227,6 +230,9 @@ void IdentifierTable::AddKeywords(const LangOptions &LangOpts) { if (LangOpts.DeclSpecKeyword) AddKeyword("__declspec", tok::kw___declspec, KEYALL, LangOpts, *this); + if (LangOpts.IEEE128) + AddKeyword("__ieee128", tok::kw___float128, KEYALL, LangOpts, *this); + // Add the 'import' contextual keyword. get("import").setModulesImport(true); } @@ -270,6 +276,39 @@ bool IdentifierInfo::isCPlusPlusKeyword(const LangOptions &LangOpts) const { return !isKeyword(LangOptsNoCPP); } +ReservedIdentifierStatus +IdentifierInfo::isReserved(const LangOptions &LangOpts) const { + StringRef Name = getName(); + + // '_' is a reserved identifier, but its use is so common (e.g. to store + // ignored values) that we don't warn on it. + if (Name.size() <= 1) + return ReservedIdentifierStatus::NotReserved; + + // [lex.name] p3 + if (Name[0] == '_') { + + // Each name that begins with an underscore followed by an uppercase letter + // or another underscore is reserved. + if (Name[1] == '_') + return ReservedIdentifierStatus::StartsWithDoubleUnderscore; + + if ('A' <= Name[1] && Name[1] <= 'Z') + return ReservedIdentifierStatus:: + StartsWithUnderscoreFollowedByCapitalLetter; + + // This is a bit misleading: it actually means it's only reserved if we're + // at global scope because it starts with an underscore. + return ReservedIdentifierStatus::StartsWithUnderscoreAtGlobalScope; + } + + // Each name that contains a double underscore (__) is reserved. + if (LangOpts.CPlusPlus && Name.contains("__")) + return ReservedIdentifierStatus::ContainsDoubleUnderscore; + + return ReservedIdentifierStatus::NotReserved; +} + tok::PPKeywordKind IdentifierInfo::getPPKeywordID() const { // We use a perfect hash function here involving the length of the keyword, // the first and third character. For preprocessor ID's there are no @@ -305,9 +344,11 @@ tok::PPKeywordKind IdentifierInfo::getPPKeywordID() const { CASE( 6, 'p', 'a', pragma); CASE( 7, 'd', 'f', defined); + CASE( 7, 'e', 'i', elifdef); CASE( 7, 'i', 'c', include); CASE( 7, 'w', 'r', warning); + CASE( 8, 'e', 'i', elifndef); CASE( 8, 'u', 'a', unassert); CASE(12, 'i', 'c', include_next); diff --git a/clang/lib/Basic/LangOptions.cpp b/clang/lib/Basic/LangOptions.cpp index ed275ade4001..dc392d5352aa 100644 --- a/clang/lib/Basic/LangOptions.cpp +++ b/clang/lib/Basic/LangOptions.cpp @@ -28,7 +28,7 @@ void LangOptions::resetNonModularOptions() { #include "clang/Basic/LangOptions.def" // These options do not affect AST generation. - SanitizerBlacklistFiles.clear(); + NoSanitizeFiles.clear(); XRayAlwaysInstrumentFiles.clear(); XRayNeverInstrumentFiles.clear(); diff --git a/clang/lib/Basic/Module.cpp b/clang/lib/Basic/Module.cpp index 2dd53b05d442..b6cf1624ef01 100644 --- a/clang/lib/Basic/Module.cpp +++ b/clang/lib/Basic/Module.cpp @@ -245,12 +245,10 @@ bool Module::fullModuleNameIs(ArrayRef<StringRef> nameParts) const { Module::DirectoryName Module::getUmbrellaDir() const { if (Header U = getUmbrellaHeader()) - return {"", U.Entry->getDir()}; + return {"", "", U.Entry->getDir()}; - if (auto *ME = Umbrella.dyn_cast<const DirectoryEntryRef::MapEntry *>()) - return {UmbrellaAsWritten, DirectoryEntryRef(*ME)}; - - return {"", None}; + return {UmbrellaAsWritten, UmbrellaRelativeToRootModuleDirectory, + Umbrella.dyn_cast<const DirectoryEntry *>()}; } void Module::addTopHeader(const FileEntry *File) { @@ -432,7 +430,7 @@ void Module::buildVisibleModulesCache() const { } } -void Module::print(raw_ostream &OS, unsigned Indent) const { +void Module::print(raw_ostream &OS, unsigned Indent, bool Dump) const { OS.indent(Indent); if (IsFramework) OS << "framework "; @@ -538,7 +536,7 @@ void Module::print(raw_ostream &OS, unsigned Indent) const { // the module. Regular inferred submodules are OK, as we need to look at all // those header files anyway. if (!(*MI)->IsInferred || (*MI)->IsFramework) - (*MI)->print(OS, Indent + 2); + (*MI)->print(OS, Indent + 2, Dump); for (unsigned I = 0, N = Exports.size(); I != N; ++I) { OS.indent(Indent + 2); @@ -562,6 +560,13 @@ void Module::print(raw_ostream &OS, unsigned Indent) const { OS << "\n"; } + if (Dump) { + for (Module *M : Imports) { + OS.indent(Indent + 2); + llvm::errs() << "import " << M->getFullModuleName() << "\n"; + } + } + for (unsigned I = 0, N = DirectUses.size(); I != N; ++I) { OS.indent(Indent + 2); OS << "use "; @@ -622,7 +627,7 @@ void Module::print(raw_ostream &OS, unsigned Indent) const { } LLVM_DUMP_METHOD void Module::dump() const { - print(llvm::errs()); + print(llvm::errs(), 0, true); } void VisibleModuleSet::setVisible(Module *M, SourceLocation Loc, diff --git a/clang/lib/Basic/NoSanitizeList.cpp b/clang/lib/Basic/NoSanitizeList.cpp new file mode 100644 index 000000000000..3efd613b0d33 --- /dev/null +++ b/clang/lib/Basic/NoSanitizeList.cpp @@ -0,0 +1,54 @@ +//===--- NoSanitizeList.cpp - Ignored list for sanitizers ----------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// +// +// User-provided ignore-list used to disable/alter instrumentation done in +// sanitizers. +// +//===----------------------------------------------------------------------===// + +#include "clang/Basic/NoSanitizeList.h" +#include "clang/Basic/FileManager.h" +#include "clang/Basic/SanitizerSpecialCaseList.h" +#include "clang/Basic/Sanitizers.h" +#include "clang/Basic/SourceManager.h" + +using namespace clang; + +NoSanitizeList::NoSanitizeList(const std::vector<std::string> &NoSanitizePaths, + SourceManager &SM) + : SSCL(SanitizerSpecialCaseList::createOrDie( + NoSanitizePaths, SM.getFileManager().getVirtualFileSystem())), + SM(SM) {} + +NoSanitizeList::~NoSanitizeList() = default; + +bool NoSanitizeList::containsGlobal(SanitizerMask Mask, StringRef GlobalName, + StringRef Category) const { + return SSCL->inSection(Mask, "global", GlobalName, Category); +} + +bool NoSanitizeList::containsType(SanitizerMask Mask, StringRef MangledTypeName, + StringRef Category) const { + return SSCL->inSection(Mask, "type", MangledTypeName, Category); +} + +bool NoSanitizeList::containsFunction(SanitizerMask Mask, + StringRef FunctionName) const { + return SSCL->inSection(Mask, "fun", FunctionName); +} + +bool NoSanitizeList::containsFile(SanitizerMask Mask, StringRef FileName, + StringRef Category) const { + return SSCL->inSection(Mask, "src", FileName, Category); +} + +bool NoSanitizeList::containsLocation(SanitizerMask Mask, SourceLocation Loc, + StringRef Category) const { + return Loc.isValid() && + containsFile(Mask, SM.getFilename(SM.getFileLoc(Loc)), Category); +} diff --git a/clang/lib/Basic/OpenCLOptions.cpp b/clang/lib/Basic/OpenCLOptions.cpp index 266acc5fe477..2e215b185f66 100644 --- a/clang/lib/Basic/OpenCLOptions.cpp +++ b/clang/lib/Basic/OpenCLOptions.cpp @@ -7,6 +7,8 @@ //===----------------------------------------------------------------------===// #include "clang/Basic/OpenCLOptions.h" +#include "clang/Basic/Diagnostic.h" +#include "clang/Basic/TargetInfo.h" namespace clang { @@ -14,39 +16,47 @@ bool OpenCLOptions::isKnown(llvm::StringRef Ext) const { return OptMap.find(Ext) != OptMap.end(); } +bool OpenCLOptions::isAvailableOption(llvm::StringRef Ext, + const LangOptions &LO) const { + if (!isKnown(Ext)) + return false; + + auto &OptInfo = OptMap.find(Ext)->getValue(); + if (OptInfo.isCoreIn(LO) || OptInfo.isOptionalCoreIn(LO)) + return isSupported(Ext, LO); + + return isEnabled(Ext); +} + bool OpenCLOptions::isEnabled(llvm::StringRef Ext) const { + auto I = OptMap.find(Ext); + return I != OptMap.end() && I->getValue().Enabled; +} + +bool OpenCLOptions::isWithPragma(llvm::StringRef Ext) const { auto E = OptMap.find(Ext); - return E != OptMap.end() && E->second.Enabled; + return E != OptMap.end() && E->second.WithPragma; } bool OpenCLOptions::isSupported(llvm::StringRef Ext, const LangOptions &LO) const { - auto E = OptMap.find(Ext); - if (E == OptMap.end()) { - return false; - } - auto I = OptMap.find(Ext)->getValue(); - return I.Supported && I.isAvailableIn(LO); + auto I = OptMap.find(Ext); + return I != OptMap.end() && I->getValue().Supported && + I->getValue().isAvailableIn(LO); } bool OpenCLOptions::isSupportedCore(llvm::StringRef Ext, const LangOptions &LO) const { - auto E = OptMap.find(Ext); - if (E == OptMap.end()) { - return false; - } - auto I = OptMap.find(Ext)->getValue(); - return I.Supported && I.isCoreIn(LO); + auto I = OptMap.find(Ext); + return I != OptMap.end() && I->getValue().Supported && + I->getValue().isCoreIn(LO); } bool OpenCLOptions::isSupportedOptionalCore(llvm::StringRef Ext, const LangOptions &LO) const { - auto E = OptMap.find(Ext); - if (E == OptMap.end()) { - return false; - } - auto I = OptMap.find(Ext)->getValue(); - return I.Supported && I.isOptionalCoreIn(LO); + auto I = OptMap.find(Ext); + return I != OptMap.end() && I->getValue().Supported && + I->getValue().isOptionalCoreIn(LO); } bool OpenCLOptions::isSupportedCoreOrOptionalCore(llvm::StringRef Ext, @@ -56,12 +66,9 @@ bool OpenCLOptions::isSupportedCoreOrOptionalCore(llvm::StringRef Ext, bool OpenCLOptions::isSupportedExtension(llvm::StringRef Ext, const LangOptions &LO) const { - auto E = OptMap.find(Ext); - if (E == OptMap.end()) { - return false; - } - auto I = OptMap.find(Ext)->getValue(); - return I.Supported && I.isAvailableIn(LO) && + auto I = OptMap.find(Ext); + return I != OptMap.end() && I->getValue().Supported && + I->getValue().isAvailableIn(LO) && !isSupportedCoreOrOptionalCore(Ext, LO); } @@ -69,6 +76,10 @@ void OpenCLOptions::enable(llvm::StringRef Ext, bool V) { OptMap[Ext].Enabled = V; } +void OpenCLOptions::acceptsPragma(llvm::StringRef Ext, bool V) { + OptMap[Ext].WithPragma = V; +} + void OpenCLOptions::support(llvm::StringRef Ext, bool V) { assert(!Ext.empty() && "Extension is empty."); assert(Ext[0] != '+' && Ext[0] != '-'); @@ -76,10 +87,8 @@ void OpenCLOptions::support(llvm::StringRef Ext, bool V) { } OpenCLOptions::OpenCLOptions() { -#define OPENCL_GENERIC_EXTENSION(Ext, AvailVer, CoreVer, OptVer) \ - OptMap[#Ext].Avail = AvailVer; \ - OptMap[#Ext].Core = CoreVer; \ - OptMap[#Ext].Opt = OptVer; +#define OPENCL_GENERIC_EXTENSION(Ext, ...) \ + OptMap.insert_or_assign(#Ext, OpenCLOptionInfo{__VA_ARGS__}); #include "clang/Basic/OpenCLExtensions.def" } @@ -97,10 +106,43 @@ void OpenCLOptions::disableAll() { Opt.getValue().Enabled = false; } -void OpenCLOptions::enableSupportedCore(const LangOptions &LO) { - for (auto &Opt : OptMap) - if (isSupportedCoreOrOptionalCore(Opt.getKey(), LO)) - Opt.getValue().Enabled = true; +bool OpenCLOptions::diagnoseUnsupportedFeatureDependencies( + const TargetInfo &TI, DiagnosticsEngine &Diags) { + // Feature pairs. First feature in a pair requires the second one to be + // supported. + static const llvm::StringMap<llvm::StringRef> DependentFeaturesMap = { + {"__opencl_c_read_write_images", "__opencl_c_images"}}; + + auto OpenCLFeaturesMap = TI.getSupportedOpenCLOpts(); + + bool IsValid = true; + for (auto &FeaturePair : DependentFeaturesMap) + if (TI.hasFeatureEnabled(OpenCLFeaturesMap, FeaturePair.getKey()) && + !TI.hasFeatureEnabled(OpenCLFeaturesMap, FeaturePair.getValue())) { + IsValid = false; + Diags.Report(diag::err_opencl_feature_requires) + << FeaturePair.getKey() << FeaturePair.getValue(); + } + return IsValid; +} + +bool OpenCLOptions::diagnoseFeatureExtensionDifferences( + const TargetInfo &TI, DiagnosticsEngine &Diags) { + // Extensions and equivalent feature pairs. + static const llvm::StringMap<llvm::StringRef> FeatureExtensionMap = { + {"cl_khr_fp64", "__opencl_c_fp64"}}; + + auto OpenCLFeaturesMap = TI.getSupportedOpenCLOpts(); + + bool IsValid = true; + for (auto &ExtAndFeat : FeatureExtensionMap) + if (TI.hasFeatureEnabled(OpenCLFeaturesMap, ExtAndFeat.getKey()) != + TI.hasFeatureEnabled(OpenCLFeaturesMap, ExtAndFeat.getValue())) { + IsValid = false; + Diags.Report(diag::err_opencl_extension_and_feature_differs) + << ExtAndFeat.getKey() << ExtAndFeat.getValue(); + } + return IsValid; } } // end namespace clang diff --git a/clang/lib/Basic/OpenMPKinds.cpp b/clang/lib/Basic/OpenMPKinds.cpp index 5c19d60cbd6e..cfdba09eb1ec 100644 --- a/clang/lib/Basic/OpenMPKinds.cpp +++ b/clang/lib/Basic/OpenMPKinds.cpp @@ -130,6 +130,7 @@ unsigned clang::getOpenMPSimpleClauseType(OpenMPClauseKind Kind, StringRef Str, case OMPC_num_threads: case OMPC_safelen: case OMPC_simdlen: + case OMPC_sizes: case OMPC_allocator: case OMPC_allocate: case OMPC_collapse: @@ -175,6 +176,8 @@ unsigned clang::getOpenMPSimpleClauseType(OpenMPClauseKind Kind, StringRef Str, case OMPC_match: case OMPC_nontemporal: case OMPC_destroy: + case OMPC_novariants: + case OMPC_nocontext: case OMPC_detach: case OMPC_inclusive: case OMPC_exclusive: @@ -370,6 +373,7 @@ const char *clang::getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind, case OMPC_num_threads: case OMPC_safelen: case OMPC_simdlen: + case OMPC_sizes: case OMPC_allocator: case OMPC_allocate: case OMPC_collapse: @@ -416,6 +420,8 @@ const char *clang::getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind, case OMPC_nontemporal: case OMPC_destroy: case OMPC_detach: + case OMPC_novariants: + case OMPC_nocontext: case OMPC_inclusive: case OMPC_exclusive: case OMPC_uses_allocators: @@ -446,7 +452,8 @@ bool clang::isOpenMPLoopDirective(OpenMPDirectiveKind DKind) { DKind == OMPD_target_teams_distribute || DKind == OMPD_target_teams_distribute_parallel_for || DKind == OMPD_target_teams_distribute_parallel_for_simd || - DKind == OMPD_target_teams_distribute_simd; + DKind == OMPD_target_teams_distribute_simd || DKind == OMPD_tile || + DKind == OMPD_unroll; } bool clang::isOpenMPWorksharingDirective(OpenMPDirectiveKind DKind) { @@ -573,6 +580,10 @@ bool clang::isOpenMPLoopBoundSharingDirective(OpenMPDirectiveKind Kind) { Kind == OMPD_target_teams_distribute_parallel_for_simd; } +bool clang::isOpenMPLoopTransformationDirective(OpenMPDirectiveKind DKind) { + return DKind == OMPD_tile || DKind == OMPD_unroll; +} + void clang::getOpenMPCaptureRegions( SmallVectorImpl<OpenMPDirectiveKind> &CaptureRegions, OpenMPDirectiveKind DKind) { @@ -654,8 +665,13 @@ void clang::getOpenMPCaptureRegions( case OMPD_atomic: case OMPD_target_data: case OMPD_distribute_simd: + case OMPD_dispatch: CaptureRegions.push_back(OMPD_unknown); break; + case OMPD_tile: + case OMPD_unroll: + // loop transformations do not introduce captures. + break; case OMPD_threadprivate: case OMPD_allocate: case OMPD_taskyield: diff --git a/clang/lib/Basic/ProfileList.cpp b/clang/lib/Basic/ProfileList.cpp index 56bc37a79301..2cb05c1c3c07 100644 --- a/clang/lib/Basic/ProfileList.cpp +++ b/clang/lib/Basic/ProfileList.cpp @@ -82,6 +82,7 @@ static StringRef getSectionName(CodeGenOptions::ProfileInstrKind Kind) { case CodeGenOptions::ProfileCSIRInstr: return "csllvm"; } + llvm_unreachable("Unhandled CodeGenOptions::ProfileInstrKind enum"); } llvm::Optional<bool> diff --git a/clang/lib/Basic/SanitizerBlacklist.cpp b/clang/lib/Basic/SanitizerBlacklist.cpp deleted file mode 100644 index feb7cbda39b7..000000000000 --- a/clang/lib/Basic/SanitizerBlacklist.cpp +++ /dev/null @@ -1,59 +0,0 @@ -//===--- SanitizerBlacklist.cpp - Blacklist for sanitizers ----------------===// -// -// 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 -// -//===----------------------------------------------------------------------===// -// -// User-provided blacklist used to disable/alter instrumentation done in -// sanitizers. -// -//===----------------------------------------------------------------------===// - -#include "clang/Basic/SanitizerBlacklist.h" -#include "clang/Basic/FileManager.h" -#include "clang/Basic/SanitizerSpecialCaseList.h" -#include "clang/Basic/Sanitizers.h" -#include "clang/Basic/SourceManager.h" - -using namespace clang; - -SanitizerBlacklist::SanitizerBlacklist( - const std::vector<std::string> &BlacklistPaths, SourceManager &SM) - : SSCL(SanitizerSpecialCaseList::createOrDie( - BlacklistPaths, SM.getFileManager().getVirtualFileSystem())), - SM(SM) {} - -SanitizerBlacklist::~SanitizerBlacklist() = default; - -bool SanitizerBlacklist::isBlacklistedGlobal(SanitizerMask Mask, - StringRef GlobalName, - StringRef Category) const { - return SSCL->inSection(Mask, "global", GlobalName, Category); -} - -bool SanitizerBlacklist::isBlacklistedType(SanitizerMask Mask, - StringRef MangledTypeName, - StringRef Category) const { - return SSCL->inSection(Mask, "type", MangledTypeName, Category); -} - -bool SanitizerBlacklist::isBlacklistedFunction(SanitizerMask Mask, - StringRef FunctionName) const { - return SSCL->inSection(Mask, "fun", FunctionName); -} - -bool SanitizerBlacklist::isBlacklistedFile(SanitizerMask Mask, - StringRef FileName, - StringRef Category) const { - return SSCL->inSection(Mask, "src", FileName, Category); -} - -bool SanitizerBlacklist::isBlacklistedLocation(SanitizerMask Mask, - SourceLocation Loc, - StringRef Category) const { - return Loc.isValid() && - isBlacklistedFile(Mask, SM.getFilename(SM.getFileLoc(Loc)), Category); -} - diff --git a/clang/lib/Basic/Sanitizers.cpp b/clang/lib/Basic/Sanitizers.cpp index f5f81b5fb3e5..7d903c8fdf5e 100644 --- a/clang/lib/Basic/Sanitizers.cpp +++ b/clang/lib/Basic/Sanitizers.cpp @@ -12,7 +12,9 @@ #include "clang/Basic/Sanitizers.h" #include "llvm/ADT/Hashing.h" +#include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringSwitch.h" +#include "llvm/Support/MathExtras.h" using namespace clang; @@ -34,6 +36,14 @@ SanitizerMask clang::parseSanitizerValue(StringRef Value, bool AllowGroups) { return ParsedKind; } +void clang::serializeSanitizerSet(SanitizerSet Set, + SmallVectorImpl<StringRef> &Values) { +#define SANITIZER(NAME, ID) \ + if (Set.has(SanitizerKind::ID)) \ + Values.push_back(NAME); +#include "clang/Basic/Sanitizers.def" +} + SanitizerMask clang::expandSanitizerGroups(SanitizerMask Kinds) { #define SANITIZER(NAME, ID) #define SANITIZER_GROUP(NAME, ID, ALIAS) \ @@ -48,7 +58,58 @@ llvm::hash_code SanitizerMask::hash_value() const { } namespace clang { +unsigned SanitizerMask::countPopulation() const { + unsigned total = 0; + for (const auto &Val : maskLoToHigh) + total += llvm::countPopulation(Val); + return total; +} + llvm::hash_code hash_value(const clang::SanitizerMask &Arg) { return Arg.hash_value(); } + +StringRef AsanDtorKindToString(llvm::AsanDtorKind kind) { + switch (kind) { + case llvm::AsanDtorKind::None: + return "none"; + case llvm::AsanDtorKind::Global: + return "global"; + case llvm::AsanDtorKind::Invalid: + return "invalid"; + } + return "invalid"; +} + +llvm::AsanDtorKind AsanDtorKindFromString(StringRef kindStr) { + return llvm::StringSwitch<llvm::AsanDtorKind>(kindStr) + .Case("none", llvm::AsanDtorKind::None) + .Case("global", llvm::AsanDtorKind::Global) + .Default(llvm::AsanDtorKind::Invalid); +} + +StringRef AsanDetectStackUseAfterReturnModeToString( + llvm::AsanDetectStackUseAfterReturnMode mode) { + switch (mode) { + case llvm::AsanDetectStackUseAfterReturnMode::Always: + return "always"; + case llvm::AsanDetectStackUseAfterReturnMode::Runtime: + return "runtime"; + case llvm::AsanDetectStackUseAfterReturnMode::Never: + return "never"; + case llvm::AsanDetectStackUseAfterReturnMode::Invalid: + return "invalid"; + } + return "invalid"; +} + +llvm::AsanDetectStackUseAfterReturnMode +AsanDetectStackUseAfterReturnModeFromString(StringRef modeStr) { + return llvm::StringSwitch<llvm::AsanDetectStackUseAfterReturnMode>(modeStr) + .Case("always", llvm::AsanDetectStackUseAfterReturnMode::Always) + .Case("runtime", llvm::AsanDetectStackUseAfterReturnMode::Runtime) + .Case("never", llvm::AsanDetectStackUseAfterReturnMode::Never) + .Default(llvm::AsanDetectStackUseAfterReturnMode::Invalid); +} + } // namespace clang diff --git a/clang/lib/Basic/SourceLocation.cpp b/clang/lib/Basic/SourceLocation.cpp index 6f6412028d77..6986fcd322f2 100644 --- a/clang/lib/Basic/SourceLocation.cpp +++ b/clang/lib/Basic/SourceLocation.cpp @@ -51,7 +51,7 @@ static_assert(std::is_trivially_destructible<SourceRange>::value, "used in unions"); unsigned SourceLocation::getHashValue() const { - return llvm::DenseMapInfo<unsigned>::getHashValue(ID); + return llvm::DenseMapInfo<UIntTy>::getHashValue(ID); } void llvm::FoldingSetTrait<SourceLocation>::Profile( diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp index c0b22837693b..8cba379aa0f8 100644 --- a/clang/lib/Basic/SourceManager.cpp +++ b/clang/lib/Basic/SourceManager.cpp @@ -26,6 +26,7 @@ #include "llvm/Support/Allocator.h" #include "llvm/Support/Capacity.h" #include "llvm/Support/Compiler.h" +#include "llvm/Support/Endian.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/MathExtras.h" @@ -449,9 +450,9 @@ const SrcMgr::SLocEntry &SourceManager::loadSLocEntry(unsigned Index, return LoadedSLocEntryTable[Index]; } -std::pair<int, unsigned> +std::pair<int, SourceLocation::UIntTy> SourceManager::AllocateLoadedSLocEntries(unsigned NumSLocEntries, - unsigned TotalSize) { + SourceLocation::UIntTy TotalSize) { assert(ExternalSLocEntries && "Don't have an external sloc source"); // Make sure we're not about to run out of source locations. if (CurrentLoadedOffset - TotalSize < NextLocalOffset) @@ -531,7 +532,8 @@ FileID SourceManager::getNextFileID(FileID FID) const { FileID SourceManager::createFileID(const FileEntry *SourceFile, SourceLocation IncludePos, SrcMgr::CharacteristicKind FileCharacter, - int LoadedID, unsigned LoadedOffset) { + int LoadedID, + SourceLocation::UIntTy LoadedOffset) { return createFileID(SourceFile->getLastRef(), IncludePos, FileCharacter, LoadedID, LoadedOffset); } @@ -539,7 +541,8 @@ FileID SourceManager::createFileID(const FileEntry *SourceFile, FileID SourceManager::createFileID(FileEntryRef SourceFile, SourceLocation IncludePos, SrcMgr::CharacteristicKind FileCharacter, - int LoadedID, unsigned LoadedOffset) { + int LoadedID, + SourceLocation::UIntTy LoadedOffset) { SrcMgr::ContentCache &IR = getOrCreateContentCache(SourceFile, isSystem(FileCharacter)); @@ -558,7 +561,8 @@ FileID SourceManager::createFileID(FileEntryRef SourceFile, /// MemoryBuffer, so only pass a MemoryBuffer to this once. FileID SourceManager::createFileID(std::unique_ptr<llvm::MemoryBuffer> Buffer, SrcMgr::CharacteristicKind FileCharacter, - int LoadedID, unsigned LoadedOffset, + int LoadedID, + SourceLocation::UIntTy LoadedOffset, SourceLocation IncludeLoc) { StringRef Name = Buffer->getBufferIdentifier(); return createFileIDImpl(createMemBufferContentCache(std::move(Buffer)), Name, @@ -571,7 +575,8 @@ FileID SourceManager::createFileID(std::unique_ptr<llvm::MemoryBuffer> Buffer, /// outlive the SourceManager. FileID SourceManager::createFileID(const llvm::MemoryBufferRef &Buffer, SrcMgr::CharacteristicKind FileCharacter, - int LoadedID, unsigned LoadedOffset, + int LoadedID, + SourceLocation::UIntTy LoadedOffset, SourceLocation IncludeLoc) { return createFileID(llvm::MemoryBuffer::getMemBuffer(Buffer), FileCharacter, LoadedID, LoadedOffset, IncludeLoc); @@ -593,7 +598,8 @@ SourceManager::getOrCreateFileID(const FileEntry *SourceFile, FileID SourceManager::createFileIDImpl(ContentCache &File, StringRef Filename, SourceLocation IncludePos, SrcMgr::CharacteristicKind FileCharacter, - int LoadedID, unsigned LoadedOffset) { + int LoadedID, + SourceLocation::UIntTy LoadedOffset) { if (LoadedID < 0) { assert(LoadedID != -1 && "Loading sentinel FileID"); unsigned Index = unsigned(-LoadedID) - 2; @@ -632,14 +638,11 @@ SourceManager::createMacroArgExpansionLoc(SourceLocation SpellingLoc, return createExpansionLocImpl(Info, TokLength); } -SourceLocation -SourceManager::createExpansionLoc(SourceLocation SpellingLoc, - SourceLocation ExpansionLocStart, - SourceLocation ExpansionLocEnd, - unsigned TokLength, - bool ExpansionIsTokenRange, - int LoadedID, - unsigned LoadedOffset) { +SourceLocation SourceManager::createExpansionLoc( + SourceLocation SpellingLoc, SourceLocation ExpansionLocStart, + SourceLocation ExpansionLocEnd, unsigned TokLength, + bool ExpansionIsTokenRange, int LoadedID, + SourceLocation::UIntTy LoadedOffset) { ExpansionInfo Info = ExpansionInfo::create( SpellingLoc, ExpansionLocStart, ExpansionLocEnd, ExpansionIsTokenRange); return createExpansionLocImpl(Info, TokLength, LoadedID, LoadedOffset); @@ -657,9 +660,8 @@ SourceLocation SourceManager::createTokenSplitLoc(SourceLocation Spelling, SourceLocation SourceManager::createExpansionLocImpl(const ExpansionInfo &Info, - unsigned TokLength, - int LoadedID, - unsigned LoadedOffset) { + unsigned TokLength, int LoadedID, + SourceLocation::UIntTy LoadedOffset) { if (LoadedID < 0) { assert(LoadedID != -1 && "Loading sentinel FileID"); unsigned Index = unsigned(-LoadedID) - 2; @@ -761,7 +763,7 @@ llvm::Optional<StringRef> SourceManager::getBufferDataOrNone(FileID FID) const { /// This is the cache-miss path of getFileID. Not as hot as that function, but /// still very important. It is responsible for finding the entry in the /// SLocEntry tables that contains the specified location. -FileID SourceManager::getFileIDSlow(unsigned SLocOffset) const { +FileID SourceManager::getFileIDSlow(SourceLocation::UIntTy SLocOffset) const { if (!SLocOffset) return FileID::get(0); @@ -776,7 +778,7 @@ FileID SourceManager::getFileIDSlow(unsigned SLocOffset) const { /// /// This function knows that the SourceLocation is in a local buffer, not a /// loaded one. -FileID SourceManager::getFileIDLocal(unsigned SLocOffset) const { +FileID SourceManager::getFileIDLocal(SourceLocation::UIntTy SLocOffset) const { assert(SLocOffset < NextLocalOffset && "Bad function choice"); // After the first and second level caches, I see two common sorts of @@ -827,7 +829,8 @@ FileID SourceManager::getFileIDLocal(unsigned SLocOffset) const { NumProbes = 0; while (true) { unsigned MiddleIndex = (GreaterIndex-LessIndex)/2+LessIndex; - unsigned MidOffset = getLocalSLocEntry(MiddleIndex).getOffset(); + SourceLocation::UIntTy MidOffset = + getLocalSLocEntry(MiddleIndex).getOffset(); ++NumProbes; @@ -858,7 +861,7 @@ FileID SourceManager::getFileIDLocal(unsigned SLocOffset) const { /// /// This function knows that the SourceLocation is in a loaded buffer, not a /// local one. -FileID SourceManager::getFileIDLoaded(unsigned SLocOffset) const { +FileID SourceManager::getFileIDLoaded(SourceLocation::UIntTy SLocOffset) const { // Sanity checking, otherwise a bug may lead to hanging in release build. if (SLocOffset < CurrentLoadedOffset) { assert(0 && "Invalid SLocOffset or bad function choice"); @@ -1252,12 +1255,22 @@ unsigned SourceManager::getPresumedColumnNumber(SourceLocation Loc, return PLoc.getColumn(); } -#ifdef __SSE2__ -#include <emmintrin.h> -#endif +// Check if mutli-byte word x has bytes between m and n, included. This may also +// catch bytes equal to n + 1. +// The returned value holds a 0x80 at each byte position that holds a match. +// see http://graphics.stanford.edu/~seander/bithacks.html#HasBetweenInWord +template <class T> +static constexpr inline T likelyhasbetween(T x, unsigned char m, + unsigned char n) { + return ((x - ~static_cast<T>(0) / 255 * (n + 1)) & ~x & + ((x & ~static_cast<T>(0) / 255 * 127) + + (~static_cast<T>(0) / 255 * (127 - (m - 1))))) & + ~static_cast<T>(0) / 255 * 128; +} LineOffsetMapping LineOffsetMapping::get(llvm::MemoryBufferRef Buffer, llvm::BumpPtrAllocator &Alloc) { + // Find the file offsets of all of the *physical* source lines. This does // not look at trigraphs, escaped newlines, or anything else tricky. SmallVector<unsigned, 256> LineOffsets; @@ -1268,7 +1281,43 @@ LineOffsetMapping LineOffsetMapping::get(llvm::MemoryBufferRef Buffer, const unsigned char *Buf = (const unsigned char *)Buffer.getBufferStart(); const unsigned char *End = (const unsigned char *)Buffer.getBufferEnd(); const std::size_t BufLen = End - Buf; + unsigned I = 0; + uint64_t Word; + + // scan sizeof(Word) bytes at a time for new lines. + // This is much faster than scanning each byte independently. + if (BufLen > sizeof(Word)) { + do { + Word = llvm::support::endian::read64(Buf + I, llvm::support::little); + // no new line => jump over sizeof(Word) bytes. + auto Mask = likelyhasbetween(Word, '\n', '\r'); + if (!Mask) { + I += sizeof(Word); + continue; + } + + // At that point, Mask contains 0x80 set at each byte that holds a value + // in [\n, \r + 1 [ + + // Scan for the next newline - it's very likely there's one. + unsigned N = + llvm::countTrailingZeros(Mask) - 7; // -7 because 0x80 is the marker + Word >>= N; + I += N / 8 + 1; + unsigned char Byte = Word; + if (Byte == '\n') { + LineOffsets.push_back(I); + } else if (Byte == '\r') { + // If this is \r\n, skip both characters. + if (Buf[I] == '\n') + ++I; + LineOffsets.push_back(I); + } + } while (I < BufLen - sizeof(Word) - 1); + } + + // Handle tail using a regular check. while (I < BufLen) { if (Buf[I] == '\n') { LineOffsets.push_back(I + 1); @@ -1572,7 +1621,7 @@ unsigned SourceManager::getFileIDSize(FileID FID) const { return 0; int ID = FID.ID; - unsigned NextOffset; + SourceLocation::UIntTy NextOffset; if ((ID > 0 && unsigned(ID+1) == local_sloc_entry_size())) NextOffset = getNextLocalOffset(); else if (ID+1 == -1) @@ -1780,8 +1829,8 @@ void SourceManager::associateFileChunkWithMacroArgExp( SourceLocation ExpansionLoc, unsigned ExpansionLength) const { if (!SpellLoc.isFileID()) { - unsigned SpellBeginOffs = SpellLoc.getOffset(); - unsigned SpellEndOffs = SpellBeginOffs + ExpansionLength; + SourceLocation::UIntTy SpellBeginOffs = SpellLoc.getOffset(); + SourceLocation::UIntTy SpellEndOffs = SpellBeginOffs + ExpansionLength; // The spelling range for this macro argument expansion can span multiple // consecutive FileID entries. Go through each entry contained in the @@ -1793,9 +1842,9 @@ void SourceManager::associateFileChunkWithMacroArgExp( std::tie(SpellFID, SpellRelativeOffs) = getDecomposedLoc(SpellLoc); while (true) { const SLocEntry &Entry = getSLocEntry(SpellFID); - unsigned SpellFIDBeginOffs = Entry.getOffset(); + SourceLocation::UIntTy SpellFIDBeginOffs = Entry.getOffset(); unsigned SpellFIDSize = getFileIDSize(SpellFID); - unsigned SpellFIDEndOffs = SpellFIDBeginOffs + SpellFIDSize; + SourceLocation::UIntTy SpellFIDEndOffs = SpellFIDBeginOffs + SpellFIDSize; const ExpansionInfo &Info = Entry.getExpansion(); if (Info.isMacroArgExpansion()) { unsigned CurrSpellLength; @@ -1887,7 +1936,7 @@ SourceManager::getMacroArgExpandedLocation(SourceLocation Loc) const { --I; - unsigned MacroArgBeginOffs = I->first; + SourceLocation::UIntTy MacroArgBeginOffs = I->first; SourceLocation MacroArgExpandedLoc = I->second; if (MacroArgExpandedLoc.isValid()) return MacroArgExpandedLoc.getLocWithOffset(Offset - MacroArgBeginOffs); @@ -2107,7 +2156,7 @@ LLVM_DUMP_METHOD void SourceManager::dump() const { llvm::raw_ostream &out = llvm::errs(); auto DumpSLocEntry = [&](int ID, const SrcMgr::SLocEntry &Entry, - llvm::Optional<unsigned> NextStart) { + llvm::Optional<SourceLocation::UIntTy> NextStart) { out << "SLocEntry <FileID " << ID << "> " << (Entry.isFile() ? "file" : "expansion") << " <SourceLocation " << Entry.getOffset() << ":"; if (NextStart) @@ -2147,7 +2196,7 @@ LLVM_DUMP_METHOD void SourceManager::dump() const { : LocalSLocEntryTable[ID + 1].getOffset()); } // Dump loaded SLocEntries. - llvm::Optional<unsigned> NextStart; + llvm::Optional<SourceLocation::UIntTy> NextStart; for (unsigned Index = 0; Index != LoadedSLocEntryTable.size(); ++Index) { int ID = -(int)Index - 2; if (SLocEntryLoaded[Index]) { diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp index 642ee753d224..b647a2fb8a67 100644 --- a/clang/lib/Basic/TargetInfo.cpp +++ b/clang/lib/Basic/TargetInfo.cpp @@ -17,7 +17,6 @@ #include "clang/Basic/LangOptions.h" #include "llvm/ADT/APFloat.h" #include "llvm/ADT/STLExtras.h" -#include "llvm/IR/DataLayout.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/TargetParser.h" #include <cstdlib> @@ -67,9 +66,12 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : TargetOpts(), Triple(T) { // From the glibc documentation, on GNU systems, malloc guarantees 16-byte // alignment on 64-bit systems and 8-byte alignment on 32-bit systems. See // https://www.gnu.org/software/libc/manual/html_node/Malloc-Examples.html. - // This alignment guarantee also applies to Windows and Android. + // This alignment guarantee also applies to Windows and Android. On Darwin, + // the alignment is 16 bytes on both 64-bit and 32-bit systems. if (T.isGNUEnvironment() || T.isWindowsMSVCEnvironment() || T.isAndroid()) NewAlign = Triple.isArch64Bit() ? 128 : Triple.isArch32Bit() ? 64 : 0; + else if (T.isOSDarwin()) + NewAlign = 128; else NewAlign = 0; // Infer from basic type alignment. HalfWidth = 16; @@ -96,25 +98,30 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : TargetOpts(), Triple(T) { Char16Type = UnsignedShort; Char32Type = UnsignedInt; Int64Type = SignedLongLong; + Int16Type = SignedShort; SigAtomicType = SignedInt; ProcessIDType = SignedInt; UseSignedCharForObjCBool = true; UseBitFieldTypeAlignment = true; UseZeroLengthBitfieldAlignment = false; + UseLeadingZeroLengthBitfield = true; UseExplicitBitFieldAlignment = true; ZeroLengthBitfieldBoundary = 0; + MaxAlignedAttribute = 0; HalfFormat = &llvm::APFloat::IEEEhalf(); FloatFormat = &llvm::APFloat::IEEEsingle(); DoubleFormat = &llvm::APFloat::IEEEdouble(); LongDoubleFormat = &llvm::APFloat::IEEEdouble(); Float128Format = &llvm::APFloat::IEEEquad(); MCountName = "mcount"; + UserLabelPrefix = "_"; RegParmMax = 0; SSERegParmMax = 0; HasAlignMac68kSupport = false; HasBuiltinMSVaList = false; IsRenderScriptTarget = false; HasAArch64SVETypes = false; + HasRISCVVTypes = false; AllowAMDGPUUnsafeFPAtomics = false; ARMCDECoprocMask = 0; @@ -143,8 +150,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : TargetOpts(), Triple(T) { // Out of line virtual dtor for TargetInfo. TargetInfo::~TargetInfo() {} -void TargetInfo::resetDataLayout(StringRef DL) { - DataLayout.reset(new llvm::DataLayout(DL)); +void TargetInfo::resetDataLayout(StringRef DL, const char *ULP) { + DataLayoutString = DL.str(); + UserLabelPrefix = ULP; } bool @@ -338,7 +346,7 @@ bool TargetInfo::isTypeSigned(IntType T) { /// Apply changes to the target information with respect to certain /// language options which change the target configuration and adjust /// the language based on the target options where applicable. -void TargetInfo::adjust(LangOptions &Opts) { +void TargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts) { if (Opts.NoBitFieldTypeAlign) UseBitFieldTypeAlignment = false; @@ -388,6 +396,19 @@ void TargetInfo::adjust(LangOptions &Opts) { HalfFormat = &llvm::APFloat::IEEEhalf(); FloatFormat = &llvm::APFloat::IEEEsingle(); LongDoubleFormat = &llvm::APFloat::IEEEquad(); + + // OpenCL C v3.0 s6.7.5 - The generic address space requires support for + // OpenCL C 2.0 or OpenCL C 3.0 with the __opencl_c_generic_address_space + // feature + // FIXME: OpenCLGenericAddressSpace is also defined in setLangDefaults() + // for OpenCL C 2.0 but with no access to target capabilities. Target + // should be immutable once created and thus this language option needs + // to be defined only once. + if (Opts.OpenCLVersion >= 300) { + const auto &OpenCLFeaturesMap = getSupportedOpenCLOpts(); + Opts.OpenCLGenericAddressSpace = hasFeatureEnabled( + OpenCLFeaturesMap, "__opencl_c_generic_address_space"); + } } if (Opts.DoubleSize) { @@ -422,6 +443,11 @@ void TargetInfo::adjust(LangOptions &Opts) { // its corresponding signed type. PaddingOnUnsignedFixedPoint |= Opts.PaddingOnUnsignedFixedPoint; CheckFixedPointBits(); + + if (Opts.ProtectParens && !checkArithmeticFenceSupported()) { + Diags.Report(diag::err_opt_not_valid_on_target) << "-fprotect-parens"; + Opts.ProtectParens = false; + } } bool TargetInfo::initFeatureMap( @@ -472,8 +498,8 @@ static StringRef removeGCCRegisterPrefix(StringRef Name) { /// a valid clobber in an inline asm statement. This is used by /// Sema. bool TargetInfo::isValidClobber(StringRef Name) const { - return (isValidGCCRegisterName(Name) || - Name == "memory" || Name == "cc"); + return (isValidGCCRegisterName(Name) || Name == "memory" || Name == "cc" || + Name == "unwind"); } /// isValidGCCRegisterName - Returns whether the passed in string diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 90a67d03b7b2..ba91d0439968 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -22,6 +22,7 @@ #include "Targets/Hexagon.h" #include "Targets/Lanai.h" #include "Targets/Le64.h" +#include "Targets/M68k.h" #include "Targets/MSP430.h" #include "Targets/Mips.h" #include "Targets/NVPTX.h" @@ -303,6 +304,16 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, return new MipsTargetInfo(Triple, Opts); } + case llvm::Triple::m68k: + switch (os) { + case llvm::Triple::Linux: + return new LinuxTargetInfo<M68kTargetInfo>(Triple, Opts); + case llvm::Triple::NetBSD: + return new NetBSDTargetInfo<M68kTargetInfo>(Triple, Opts); + default: + return new M68kTargetInfo(Triple, Opts); + } + case llvm::Triple::le32: switch (os) { case llvm::Triple::NaCl: @@ -584,13 +595,13 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, } case llvm::Triple::spir: { - if (Triple.getOS() != llvm::Triple::UnknownOS || + if (os != llvm::Triple::UnknownOS || Triple.getEnvironment() != llvm::Triple::UnknownEnvironment) return nullptr; return new SPIR32TargetInfo(Triple, Opts); } case llvm::Triple::spir64: { - if (Triple.getOS() != llvm::Triple::UnknownOS || + if (os != llvm::Triple::UnknownOS || Triple.getEnvironment() != llvm::Triple::UnknownEnvironment) return nullptr; return new SPIR64TargetInfo(Triple, Opts); @@ -600,7 +611,7 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, Triple.getVendor() != llvm::Triple::UnknownVendor || !Triple.isOSBinFormatWasm()) return nullptr; - switch (Triple.getOS()) { + switch (os) { case llvm::Triple::WASI: return new WASITargetInfo<WebAssembly32TargetInfo>(Triple, Opts); case llvm::Triple::Emscripten: @@ -615,7 +626,7 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, Triple.getVendor() != llvm::Triple::UnknownVendor || !Triple.isOSBinFormatWasm()) return nullptr; - switch (Triple.getOS()) { + switch (os) { case llvm::Triple::WASI: return new WASITargetInfo<WebAssembly64TargetInfo>(Triple, Opts); case llvm::Triple::Emscripten: @@ -715,29 +726,28 @@ TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, return Target.release(); } +/// validateOpenCLTarget - Check that OpenCL target has valid +/// options setting based on OpenCL version. +bool TargetInfo::validateOpenCLTarget(const LangOptions &Opts, + DiagnosticsEngine &Diags) const { + const llvm::StringMap<bool> &OpenCLFeaturesMap = getSupportedOpenCLOpts(); -/// getOpenCLFeatureDefines - Define OpenCL macros based on target settings -/// and language version -void TargetInfo::getOpenCLFeatureDefines(const LangOptions &Opts, - MacroBuilder &Builder) const { - - auto defineOpenCLExtMacro = [&](llvm::StringRef Name, unsigned AvailVer, - unsigned CoreVersions, - unsigned OptionalVersions) { - // Check if extension is supported by target and is available in this - // OpenCL version - auto It = getTargetOpts().OpenCLFeaturesMap.find(Name); - if ((It != getTargetOpts().OpenCLFeaturesMap.end()) && It->getValue() && - OpenCLOptions::OpenCLOptionInfo(AvailVer, CoreVersions, - OptionalVersions) - .isAvailableIn(Opts)) - Builder.defineMacro(Name); + auto diagnoseNotSupportedCore = [&](llvm::StringRef Name, auto... OptArgs) { + if (OpenCLOptions::isOpenCLOptionCoreIn(Opts, OptArgs...) && + !hasFeatureEnabled(OpenCLFeaturesMap, Name)) + Diags.Report(diag::warn_opencl_unsupported_core_feature) + << Name << Opts.OpenCLCPlusPlus + << Opts.getOpenCLVersionTuple().getAsString(); }; -#define OPENCL_GENERIC_EXTENSION(Ext, Avail, Core, Opt) \ - defineOpenCLExtMacro(#Ext, Avail, Core, Opt); +#define OPENCL_GENERIC_EXTENSION(Ext, ...) \ + diagnoseNotSupportedCore(#Ext, __VA_ARGS__); #include "clang/Basic/OpenCLExtensions.def" - // FIXME: OpenCL options which affect language semantics/syntax - // should be moved into LangOptions, thus macro definitions of - // such options is better to be done in clang::InitializePreprocessor + // Validate that feature macros are set properly for OpenCL C 3.0. + // In other cases assume that target is always valid. + if (Opts.OpenCLCPlusPlus || Opts.OpenCLVersion < 300) + return true; + + return OpenCLOptions::diagnoseUnsupportedFeatureDependencies(*this, Diags) && + OpenCLOptions::diagnoseFeatureExtensionDifferences(*this, Diags); } diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index f17134623b8b..4070ac727d16 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -182,6 +182,7 @@ void AArch64TargetInfo::getTargetDefinesARMV84A(const LangOptions &Opts, void AArch64TargetInfo::getTargetDefinesARMV85A(const LangOptions &Opts, MacroBuilder &Builder) const { + Builder.defineMacro("__ARM_FEATURE_FRINT", "1"); // Also include the Armv8.4 defines getTargetDefinesARMV84A(Opts, Builder); } @@ -286,9 +287,27 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts, if (HasCRC) Builder.defineMacro("__ARM_FEATURE_CRC32", "1"); - if (HasCrypto) + // The __ARM_FEATURE_CRYPTO is deprecated in favor of finer grained feature + // macros for AES, SHA2, SHA3 and SM4 + if (HasAES && HasSHA2) Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1"); + if (HasAES) + Builder.defineMacro("__ARM_FEATURE_AES", "1"); + + if (HasSHA2) + Builder.defineMacro("__ARM_FEATURE_SHA2", "1"); + + if (HasSHA3) { + Builder.defineMacro("__ARM_FEATURE_SHA3", "1"); + Builder.defineMacro("__ARM_FEATURE_SHA512", "1"); + } + + if (HasSM4) { + Builder.defineMacro("__ARM_FEATURE_SM3", "1"); + Builder.defineMacro("__ARM_FEATURE_SM4", "1"); + } + if (HasUnaligned) Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1"); @@ -333,7 +352,7 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts, Builder.defineMacro("__ARM_FEATURE_SVE_MATMUL_INT8", "1"); if ((FPU & NeonMode) && HasFP16FML) - Builder.defineMacro("__ARM_FEATURE_FP16FML", "1"); + Builder.defineMacro("__ARM_FEATURE_FP16_FML", "1"); if (Opts.hasSignReturnAddress()) { // Bitmask: @@ -359,6 +378,9 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts, if (HasLS64) Builder.defineMacro("__ARM_FEATURE_LS64", "1"); + if (HasRandGen) + Builder.defineMacro("__ARM_FEATURE_RNG", "1"); + switch (ArchKind) { default: break; @@ -417,6 +439,10 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features, FPU = FPUMode; HasCRC = false; HasCrypto = false; + HasAES = false; + HasSHA2 = false; + HasSHA3 = false; + HasSM4 = false; HasUnaligned = true; HasFullFP16 = false; HasDotProd = false; @@ -424,6 +450,7 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features, HasMTE = false; HasTME = false; HasLS64 = false; + HasRandGen = false; HasMatMul = false; HasBFloat16 = false; HasSVE2 = false; @@ -485,6 +512,16 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features, HasCRC = true; if (Feature == "+crypto") HasCrypto = true; + if (Feature == "+aes") + HasAES = true; + if (Feature == "+sha2") + HasSHA2 = true; + if (Feature == "+sha3") { + HasSHA2 = true; + HasSHA3 = true; + } + if (Feature == "+sm4") + HasSM4 = true; if (Feature == "+strict-align") HasUnaligned = false; if (Feature == "+v8.1a") @@ -523,6 +560,8 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features, HasLSE = true; if (Feature == "+ls64") HasLS64 = true; + if (Feature == "+rand") + HasRandGen = true; if (Feature == "+flagm") HasFlagM = true; } @@ -537,6 +576,7 @@ AArch64TargetInfo::checkCallingConvention(CallingConv CC) const { switch (CC) { case CC_C: case CC_Swift: + case CC_SwiftAsync: case CC_PreserveMost: case CC_PreserveAll: case CC_OpenCLKernel: @@ -738,9 +778,9 @@ AArch64leTargetInfo::AArch64leTargetInfo(const llvm::Triple &Triple, void AArch64leTargetInfo::setDataLayout() { if (getTriple().isOSBinFormatMachO()) { if(getTriple().isArch32Bit()) - resetDataLayout("e-m:o-p:32:32-i64:64-i128:128-n32:64-S128"); + resetDataLayout("e-m:o-p:32:32-i64:64-i128:128-n32:64-S128", "_"); else - resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128"); + resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128", "_"); } else resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"); } @@ -789,7 +829,8 @@ WindowsARM64TargetInfo::WindowsARM64TargetInfo(const llvm::Triple &Triple, void WindowsARM64TargetInfo::setDataLayout() { resetDataLayout(Triple.isOSBinFormatMachO() ? "e-m:o-i64:64-i128:128-n32:64-S128" - : "e-m:w-p:64:64-i32:32-i64:64-i128:128-n32:64-S128"); + : "e-m:w-p:64:64-i32:32-i64:64-i128:128-n32:64-S128", + Triple.isOSBinFormatMachO() ? "_" : ""); } TargetInfo::BuiltinVaListKind @@ -810,6 +851,7 @@ WindowsARM64TargetInfo::checkCallingConvention(CallingConv CC) const { case CC_PreserveMost: case CC_PreserveAll: case CC_Swift: + case CC_SwiftAsync: case CC_Win64: return CCCR_OK; default: diff --git a/clang/lib/Basic/Targets/AArch64.h b/clang/lib/Basic/Targets/AArch64.h index 2809fbce9c88..46882a808336 100644 --- a/clang/lib/Basic/Targets/AArch64.h +++ b/clang/lib/Basic/Targets/AArch64.h @@ -30,6 +30,10 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo { unsigned FPU; bool HasCRC; bool HasCrypto; + bool HasAES; + bool HasSHA2; + bool HasSHA3; + bool HasSM4; bool HasUnaligned; bool HasFullFP16; bool HasDotProd; @@ -38,6 +42,7 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo { bool HasTME; bool HasPAuth; bool HasLS64; + bool HasRandGen; bool HasMatMul; bool HasSVE2; bool HasSVE2AES; diff --git a/clang/lib/Basic/Targets/AMDGPU.cpp b/clang/lib/Basic/Targets/AMDGPU.cpp index 91c1e83f61cb..fac786dbcf9e 100644 --- a/clang/lib/Basic/Targets/AMDGPU.cpp +++ b/clang/lib/Basic/Targets/AMDGPU.cpp @@ -18,7 +18,6 @@ #include "clang/Basic/TargetBuiltins.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Frontend/OpenMP/OMPGridValues.h" -#include "llvm/IR/DataLayout.h" using namespace clang; using namespace clang::targets; @@ -51,6 +50,11 @@ const LangASMap AMDGPUTargetInfo::AMDGPUDefIsGenMap = { Global, // cuda_device Constant, // cuda_constant Local, // cuda_shared + Global, // sycl_global + Global, // sycl_global_device + Global, // sycl_global_host + Local, // sycl_local + Private, // sycl_private Generic, // ptr32_sptr Generic, // ptr32_uptr Generic // ptr64 @@ -68,6 +72,12 @@ const LangASMap AMDGPUTargetInfo::AMDGPUDefIsPrivMap = { Global, // cuda_device Constant, // cuda_constant Local, // cuda_shared + // SYCL address space values for this map are dummy + Generic, // sycl_global + Generic, // sycl_global_device + Generic, // sycl_global_host + Generic, // sycl_local + Generic, // sycl_private Generic, // ptr32_sptr Generic, // ptr32_uptr Generic // ptr64 @@ -174,6 +184,8 @@ bool AMDGPUTargetInfo::initFeatureMap( // XXX - What does the member GPU mean if device name string passed here? if (isAMDGCN(getTriple())) { switch (llvm::AMDGPU::parseArchAMDGCN(CPU)) { + case GK_GFX1035: + case GK_GFX1034: case GK_GFX1033: case GK_GFX1032: case GK_GFX1031: @@ -183,6 +195,7 @@ bool AMDGPUTargetInfo::initFeatureMap( Features["dot2-insts"] = true; Features["dot5-insts"] = true; Features["dot6-insts"] = true; + Features["dot7-insts"] = true; Features["dl-insts"] = true; Features["flat-address-space"] = true; Features["16-bit-insts"] = true; @@ -192,6 +205,7 @@ bool AMDGPUTargetInfo::initFeatureMap( Features["gfx10-insts"] = true; Features["gfx10-3-insts"] = true; Features["s-memrealtime"] = true; + Features["s-memtime-inst"] = true; break; case GK_GFX1012: case GK_GFX1011: @@ -199,7 +213,9 @@ bool AMDGPUTargetInfo::initFeatureMap( Features["dot2-insts"] = true; Features["dot5-insts"] = true; Features["dot6-insts"] = true; + Features["dot7-insts"] = true; LLVM_FALLTHROUGH; + case GK_GFX1013: case GK_GFX1010: Features["dl-insts"] = true; Features["ci-insts"] = true; @@ -210,7 +226,11 @@ bool AMDGPUTargetInfo::initFeatureMap( Features["gfx9-insts"] = true; Features["gfx10-insts"] = true; Features["s-memrealtime"] = true; + Features["s-memtime-inst"] = true; break; + case GK_GFX90A: + Features["gfx90a-insts"] = true; + LLVM_FALLTHROUGH; case GK_GFX908: Features["dot3-insts"] = true; Features["dot4-insts"] = true; @@ -222,6 +242,7 @@ bool AMDGPUTargetInfo::initFeatureMap( Features["dl-insts"] = true; Features["dot1-insts"] = true; Features["dot2-insts"] = true; + Features["dot7-insts"] = true; LLVM_FALLTHROUGH; case GK_GFX90C: case GK_GFX909: @@ -252,6 +273,7 @@ bool AMDGPUTargetInfo::initFeatureMap( case GK_GFX602: case GK_GFX601: case GK_GFX600: + Features["s-memtime-inst"] = true; break; case GK_NONE: break; @@ -313,7 +335,6 @@ AMDGPUTargetInfo::AMDGPUTargetInfo(const llvm::Triple &Triple, llvm::AMDGPU::getArchAttrR600(GPUKind)) { resetDataLayout(isAMDGCN(getTriple()) ? DataLayoutStringAMDGCN : DataLayoutStringR600); - assert(DataLayout->getAllocaAddrSpace() == Private); GridValues = llvm::omp::AMDGPUGpuGridValues; setAddressSpaceMap(Triple.getOS() == llvm::Triple::Mesa3D || @@ -326,7 +347,7 @@ AMDGPUTargetInfo::AMDGPUTargetInfo(const llvm::Triple &Triple, AllowAMDGPUUnsafeFPAtomics = Opts.AllowAMDGPUUnsafeFPAtomics; // Set pointer width and alignment for target address space 0. - PointerWidth = PointerAlign = DataLayout->getPointerSizeInBits(); + PointerWidth = PointerAlign = getPointerWidthV(Generic); if (getMaxPointerWidth() == 64) { LongWidth = LongAlign = 64; SizeType = UnsignedLong; @@ -337,8 +358,8 @@ AMDGPUTargetInfo::AMDGPUTargetInfo(const llvm::Triple &Triple, MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; } -void AMDGPUTargetInfo::adjust(LangOptions &Opts) { - TargetInfo::adjust(Opts); +void AMDGPUTargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts) { + TargetInfo::adjust(Diags, Opts); // ToDo: There are still a few places using default address space as private // address space in OpenCL, which needs to be cleaned up, then Opts.OpenCL // can be removed from the following line. diff --git a/clang/lib/Basic/Targets/AMDGPU.h b/clang/lib/Basic/Targets/AMDGPU.h index 8ee0ca30d305..244a6e044690 100644 --- a/clang/lib/Basic/Targets/AMDGPU.h +++ b/clang/lib/Basic/Targets/AMDGPU.h @@ -93,7 +93,7 @@ public: void setAddressSpaceMap(bool DefaultIsPrivate); - void adjust(LangOptions &Opts) override; + void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override; uint64_t getPointerWidthV(unsigned AddrSpace) const override { if (isR600(getTriple())) @@ -287,10 +287,13 @@ public: Opts["cl_clang_storage_class_specifiers"] = true; Opts["__cl_clang_variadic_functions"] = true; Opts["__cl_clang_function_pointers"] = true; + Opts["__cl_clang_non_portable_kernel_param_types"] = true; + Opts["__cl_clang_bitfields"] = true; bool IsAMDGCN = isAMDGCN(getTriple()); Opts["cl_khr_fp64"] = hasFP64(); + Opts["__opencl_c_fp64"] = hasFP64(); if (IsAMDGCN || GPUKind >= llvm::AMDGPU::GK_CEDAR) { Opts["cl_khr_byte_addressable_store"] = true; diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp index a2c96ad12a76..0e4048f8d5ff 100644 --- a/clang/lib/Basic/Targets/ARM.cpp +++ b/clang/lib/Basic/Targets/ARM.cpp @@ -44,7 +44,8 @@ void ARMTargetInfo::setABIAAPCS() { if (T.isOSBinFormatMachO()) { resetDataLayout(BigEndian ? "E-m:o-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64" - : "e-m:o-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"); + : "e-m:o-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64", + "_"); } else if (T.isOSWindows()) { assert(!BigEndian && "Windows on ARM does not support big endian"); resetDataLayout("e" @@ -93,12 +94,13 @@ void ARMTargetInfo::setABIAPCS(bool IsAAPCS16) { if (T.isOSBinFormatMachO() && IsAAPCS16) { assert(!BigEndian && "AAPCS16 does not support big-endian"); - resetDataLayout("e-m:o-p:32:32-Fi8-i64:64-a:0:32-n32-S128"); + resetDataLayout("e-m:o-p:32:32-Fi8-i64:64-a:0:32-n32-S128", "_"); } else if (T.isOSBinFormatMachO()) resetDataLayout( BigEndian ? "E-m:o-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" - : "e-m:o-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"); + : "e-m:o-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32", + "_"); else resetDataLayout( BigEndian @@ -426,6 +428,8 @@ bool ARMTargetInfo::handleTargetFeatures(std::vector<std::string> &Features, MVE = 0; CRC = 0; Crypto = 0; + SHA2 = 0; + AES = 0; DSP = 0; Unaligned = 1; SoftFloat = false; @@ -476,6 +480,10 @@ bool ARMTargetInfo::handleTargetFeatures(std::vector<std::string> &Features, CRC = 1; } else if (Feature == "+crypto") { Crypto = 1; + } else if (Feature == "+sha2") { + SHA2 = 1; + } else if (Feature == "+aes") { + AES = 1; } else if (Feature == "+dsp") { DSP = 1; } else if (Feature == "+fp64") { @@ -639,8 +647,14 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts, if (ArchVersion >= 8) { // ACLE 6.5.7 Crypto Extension - if (Crypto) + // The __ARM_FEATURE_CRYPTO is deprecated in favor of finer grained + // feature macros for AES and SHA2 + if (SHA2 && AES) Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1"); + if (SHA2) + Builder.defineMacro("__ARM_FEATURE_SHA2", "1"); + if (AES) + Builder.defineMacro("__ARM_FEATURE_AES", "1"); // ACLE 6.5.8 CRC32 Extension if (CRC) Builder.defineMacro("__ARM_FEATURE_CRC32", "1"); @@ -755,8 +769,12 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts, // Note, this is always on in gcc, even though it doesn't make sense. Builder.defineMacro("__APCS_32__"); + // __VFP_FP__ means that the floating-point format is VFP, not that a hardware + // FPU is present. Moreover, the VFP format is the only one supported by + // clang. For these reasons, this macro is always defined. + Builder.defineMacro("__VFP_FP__"); + if (FPUModeIsVFP((FPUMode)FPU)) { - Builder.defineMacro("__VFP_FP__"); if (FPU & VFP2FPU) Builder.defineMacro("__ARM_VFPV2__"); if (FPU & VFP3FPU) @@ -1120,6 +1138,7 @@ ARMTargetInfo::checkCallingConvention(CallingConv CC) const { case CC_AAPCS: case CC_AAPCS_VFP: case CC_Swift: + case CC_SwiftAsync: case CC_OpenCLKernel: return CCCR_OK; default: @@ -1199,6 +1218,7 @@ WindowsARMTargetInfo::checkCallingConvention(CallingConv CC) const { case CC_PreserveMost: case CC_PreserveAll: case CC_Swift: + case CC_SwiftAsync: return CCCR_OK; default: return CCCR_Warning; diff --git a/clang/lib/Basic/Targets/ARM.h b/clang/lib/Basic/Targets/ARM.h index 1e80f74d0766..0910064a033b 100644 --- a/clang/lib/Basic/Targets/ARM.h +++ b/clang/lib/Basic/Targets/ARM.h @@ -72,6 +72,8 @@ class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public TargetInfo { unsigned CRC : 1; unsigned Crypto : 1; + unsigned SHA2 : 1; + unsigned AES : 1; unsigned DSP : 1; unsigned Unaligned : 1; unsigned DotProd : 1; diff --git a/clang/lib/Basic/Targets/AVR.cpp b/clang/lib/Basic/Targets/AVR.cpp index 664eea0de841..e87b7338c4d6 100644 --- a/clang/lib/Basic/Targets/AVR.cpp +++ b/clang/lib/Basic/Targets/AVR.cpp @@ -308,6 +308,7 @@ void AVRTargetInfo::getTargetDefines(const LangOptions &Opts, Builder.defineMacro("__AVR"); Builder.defineMacro("__AVR__"); Builder.defineMacro("__ELF__"); + Builder.defineMacro("__flash", "__attribute__((address_space(1)))"); if (!this->CPU.empty()) { auto It = llvm::find_if( diff --git a/clang/lib/Basic/Targets/AVR.h b/clang/lib/Basic/Targets/AVR.h index 94f006ee1b8a..89a80ca6a39a 100644 --- a/clang/lib/Basic/Targets/AVR.h +++ b/clang/lib/Basic/Targets/AVR.h @@ -52,6 +52,7 @@ public: IntPtrType = SignedInt; Char16Type = UnsignedInt; WIntType = SignedInt; + Int16Type = SignedInt; Char32Type = UnsignedLong; SigAtomicType = SignedChar; resetDataLayout("e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8"); diff --git a/clang/lib/Basic/Targets/BPF.cpp b/clang/lib/Basic/Targets/BPF.cpp index 2fe2450b9a65..0b0298df30a5 100644 --- a/clang/lib/Basic/Targets/BPF.cpp +++ b/clang/lib/Basic/Targets/BPF.cpp @@ -46,3 +46,14 @@ ArrayRef<Builtin::Info> BPFTargetInfo::getTargetBuiltins() const { return llvm::makeArrayRef(BuiltinInfo, clang::BPF::LastTSBuiltin - Builtin::FirstTSBuiltin); } + +bool BPFTargetInfo::handleTargetFeatures(std::vector<std::string> &Features, + DiagnosticsEngine &Diags) { + for (const auto &Feature : Features) { + if (Feature == "+alu32") { + HasAlu32 = true; + } + } + + return true; +} diff --git a/clang/lib/Basic/Targets/BPF.h b/clang/lib/Basic/Targets/BPF.h index 43e55dfbfb2b..393a91ff53a5 100644 --- a/clang/lib/Basic/Targets/BPF.h +++ b/clang/lib/Basic/Targets/BPF.h @@ -23,6 +23,7 @@ namespace targets { class LLVM_LIBRARY_VISIBILITY BPFTargetInfo : public TargetInfo { static const Builtin::Info BuiltinInfo[]; + bool HasAlu32 = false; public: BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &) @@ -55,6 +56,8 @@ public: bool Enabled) const override { Features[Name] = Enabled; } + bool handleTargetFeatures(std::vector<std::string> &Features, + DiagnosticsEngine &Diags) override; ArrayRef<Builtin::Info> getTargetBuiltins() const override; @@ -68,7 +71,16 @@ public: ArrayRef<const char *> getGCCRegNames() const override { return None; } bool validateAsmConstraint(const char *&Name, - TargetInfo::ConstraintInfo &info) const override { + TargetInfo::ConstraintInfo &Info) const override { + switch (*Name) { + default: + break; + case 'w': + if (HasAlu32) { + Info.setAllowsRegister(); + } + break; + } return true; } @@ -76,7 +88,7 @@ public: return None; } - bool allowDebugInfoForExternalVar() const override { return true; } + bool allowDebugInfoForExternalRef() const override { return true; } CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { switch (CC) { @@ -93,6 +105,10 @@ public: void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override; bool setCPU(const std::string &Name) override { + if (Name == "v3") { + HasAlu32 = true; + } + StringRef CPUName(Name); return isValidCPUName(CPUName); } diff --git a/clang/lib/Basic/Targets/Hexagon.cpp b/clang/lib/Basic/Targets/Hexagon.cpp index a8b4380b6a87..9c37dee7e89a 100644 --- a/clang/lib/Basic/Targets/Hexagon.cpp +++ b/clang/lib/Basic/Targets/Hexagon.cpp @@ -65,6 +65,9 @@ void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts, } else if (CPU == "hexagonv67t") { Builder.defineMacro("__HEXAGON_V67T__"); Builder.defineMacro("__HEXAGON_ARCH__", "67"); + } else if (CPU == "hexagonv68") { + Builder.defineMacro("__HEXAGON_V68__"); + Builder.defineMacro("__HEXAGON_ARCH__", "68"); } if (hasFeature("hvx-length64b")) { @@ -129,14 +132,37 @@ bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features, } const char *const HexagonTargetInfo::GCCRegNames[] = { - "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", - "r9", "r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17", - "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26", - "r27", "r28", "r29", "r30", "r31", "p0", "p1", "p2", "p3", - "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp", + // Scalar registers: + "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", + "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21", + "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", "r1:0", "r3:2", "r5:4", "r7:6", "r9:8", "r11:10", "r13:12", "r15:14", "r17:16", "r19:18", "r21:20", "r23:22", "r25:24", "r27:26", "r29:28", - "r31:30" + "r31:30", + // Predicate registers: + "p0", "p1", "p2", "p3", + // Control registers: + "c0", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10", "c11", + "c12", "c13", "c14", "c15", "c16", "c17", "c18", "c19", "c20", "c21", + "c22", "c23", "c24", "c25", "c26", "c27", "c28", "c29", "c30", "c31", + "c1:0", "c3:2", "c5:4", "c7:6", "c9:8", "c11:10", "c13:12", "c15:14", + "c17:16", "c19:18", "c21:20", "c23:22", "c25:24", "c27:26", "c29:28", + "c31:30", + // Control register aliases: + "sa0", "lc0", "sa1", "lc1", "p3:0", "m0", "m1", "usr", "pc", "ugp", + "gp", "cs0", "cs1", "upcyclelo", "upcyclehi", "framelimit", "framekey", + "pktcountlo", "pktcounthi", "utimerlo", "utimerhi", + "upcycle", "pktcount", "utimer", + // HVX vector registers: + "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21", + "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", + "v1:0", "v3:2", "v5:4", "v7:6", "v9:8", "v11:10", "v13:12", "v15:14", + "v17:16", "v19:18", "v21:20", "v23:22", "v25:24", "v27:26", "v29:28", + "v31:30", + "v3:0", "v7:4", "v11:8", "v15:12", "v19:16", "v23:20", "v27:24", "v31:28", + // HVX vector predicates: + "q0", "q1", "q2", "q3", }; ArrayRef<const char *> HexagonTargetInfo::getGCCRegNames() const { @@ -188,6 +214,7 @@ static constexpr CPUSuffix Suffixes[] = { {{"hexagonv60"}, {"60"}}, {{"hexagonv62"}, {"62"}}, {{"hexagonv65"}, {"65"}}, {{"hexagonv66"}, {"66"}}, {{"hexagonv67"}, {"67"}}, {{"hexagonv67t"}, {"67t"}}, + {{"hexagonv68"}, {"68"}}, }; const char *HexagonTargetInfo::getHexagonCPUSuffix(StringRef Name) { diff --git a/clang/lib/Basic/Targets/Le64.cpp b/clang/lib/Basic/Targets/Le64.cpp index cacd10dc8936..5c961ff81e05 100644 --- a/clang/lib/Basic/Targets/Le64.cpp +++ b/clang/lib/Basic/Targets/Le64.cpp @@ -19,15 +19,8 @@ using namespace clang; using namespace clang::targets; -const Builtin::Info Le64TargetInfo::BuiltinInfo[] = { -#define BUILTIN(ID, TYPE, ATTRS) \ - {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr}, -#include "clang/Basic/BuiltinsLe64.def" -}; - ArrayRef<Builtin::Info> Le64TargetInfo::getTargetBuiltins() const { - return llvm::makeArrayRef(BuiltinInfo, clang::Le64::LastTSBuiltin - - Builtin::FirstTSBuiltin); + return {}; } void Le64TargetInfo::getTargetDefines(const LangOptions &Opts, diff --git a/clang/lib/Basic/Targets/Le64.h b/clang/lib/Basic/Targets/Le64.h index 253d5681abc2..13a0b04d9f09 100644 --- a/clang/lib/Basic/Targets/Le64.h +++ b/clang/lib/Basic/Targets/Le64.h @@ -22,7 +22,6 @@ namespace clang { namespace targets { class LLVM_LIBRARY_VISIBILITY Le64TargetInfo : public TargetInfo { - static const Builtin::Info BuiltinInfo[]; public: Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &) diff --git a/clang/lib/Basic/Targets/M68k.cpp b/clang/lib/Basic/Targets/M68k.cpp new file mode 100644 index 000000000000..31cb36d37636 --- /dev/null +++ b/clang/lib/Basic/Targets/M68k.cpp @@ -0,0 +1,236 @@ +//===--- M68k.cpp - Implement M68k targets feature support-------------===// +// +// 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 implements M68k TargetInfo objects. +// +//===----------------------------------------------------------------------===// + +#include "M68k.h" +#include "clang/Basic/Builtins.h" +#include "clang/Basic/Diagnostic.h" +#include "clang/Basic/TargetBuiltins.h" +#include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/ADT/StringSwitch.h" +#include "llvm/Support/TargetParser.h" +#include <cstdint> +#include <cstring> +#include <limits> + +namespace clang { +namespace targets { + +M68kTargetInfo::M68kTargetInfo(const llvm::Triple &Triple, + const TargetOptions &) + : TargetInfo(Triple) { + + std::string Layout = ""; + + // M68k is Big Endian + Layout += "E"; + + // FIXME how to wire it with the used object format? + Layout += "-m:e"; + + // M68k pointers are always 32 bit wide even for 16 bit cpus + Layout += "-p:32:32"; + + // M68k integer data types + Layout += "-i8:8:8-i16:16:16-i32:16:32"; + + // FIXME no floats at the moment + + // The registers can hold 8, 16, 32 bits + Layout += "-n8:16:32"; + + // 16 bit alignment for both stack and aggregate + // in order to conform to ABI used by GCC + Layout += "-a:0:16-S16"; + + resetDataLayout(Layout); + + SizeType = UnsignedInt; + PtrDiffType = SignedInt; + IntPtrType = SignedInt; +} + +bool M68kTargetInfo::setCPU(const std::string &Name) { + StringRef N = Name; + CPU = llvm::StringSwitch<CPUKind>(N) + .Case("generic", CK_68000) + .Case("M68000", CK_68000) + .Case("M68010", CK_68010) + .Case("M68020", CK_68020) + .Case("M68030", CK_68030) + .Case("M68040", CK_68040) + .Case("M68060", CK_68060) + .Default(CK_Unknown); + return CPU != CK_Unknown; +} + +void M68kTargetInfo::getTargetDefines(const LangOptions &Opts, + MacroBuilder &Builder) const { + using llvm::Twine; + + Builder.defineMacro("__m68k__"); + + Builder.defineMacro("mc68000"); + Builder.defineMacro("__mc68000"); + Builder.defineMacro("__mc68000__"); + + // For sub-architecture + switch (CPU) { + case CK_68010: + Builder.defineMacro("mc68010"); + Builder.defineMacro("__mc68010"); + Builder.defineMacro("__mc68010__"); + break; + case CK_68020: + Builder.defineMacro("mc68020"); + Builder.defineMacro("__mc68020"); + Builder.defineMacro("__mc68020__"); + break; + case CK_68030: + Builder.defineMacro("mc68030"); + Builder.defineMacro("__mc68030"); + Builder.defineMacro("__mc68030__"); + break; + case CK_68040: + Builder.defineMacro("mc68040"); + Builder.defineMacro("__mc68040"); + Builder.defineMacro("__mc68040__"); + break; + case CK_68060: + Builder.defineMacro("mc68060"); + Builder.defineMacro("__mc68060"); + Builder.defineMacro("__mc68060__"); + break; + default: + break; + } +} + +ArrayRef<Builtin::Info> M68kTargetInfo::getTargetBuiltins() const { + // FIXME: Implement. + return None; +} + +bool M68kTargetInfo::hasFeature(StringRef Feature) const { + // FIXME elaborate moar + return Feature == "M68000"; +} + +const char *const M68kTargetInfo::GCCRegNames[] = { + "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", + "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", + "pc"}; + +ArrayRef<const char *> M68kTargetInfo::getGCCRegNames() const { + return llvm::makeArrayRef(GCCRegNames); +} + +ArrayRef<TargetInfo::GCCRegAlias> M68kTargetInfo::getGCCRegAliases() const { + // No aliases. + return None; +} + +bool M68kTargetInfo::validateAsmConstraint( + const char *&Name, TargetInfo::ConstraintInfo &info) const { + switch (*Name) { + case 'a': // address register + case 'd': // data register + info.setAllowsRegister(); + return true; + case 'I': // constant integer in the range [1,8] + info.setRequiresImmediate(1, 8); + return true; + case 'J': // constant signed 16-bit integer + info.setRequiresImmediate(std::numeric_limits<int16_t>::min(), + std::numeric_limits<int16_t>::max()); + return true; + case 'K': // constant that is NOT in the range of [-0x80, 0x80) + info.setRequiresImmediate(); + return true; + case 'L': // constant integer in the range [-8,-1] + info.setRequiresImmediate(-8, -1); + return true; + case 'M': // constant that is NOT in the range of [-0x100, 0x100] + info.setRequiresImmediate(); + return true; + case 'N': // constant integer in the range [24,31] + info.setRequiresImmediate(24, 31); + return true; + case 'O': // constant integer 16 + info.setRequiresImmediate(16); + return true; + case 'P': // constant integer in the range [8,15] + info.setRequiresImmediate(8, 15); + return true; + case 'C': + ++Name; + switch (*Name) { + case '0': // constant integer 0 + info.setRequiresImmediate(0); + return true; + case 'i': // constant integer + case 'j': // integer constant that doesn't fit in 16 bits + info.setRequiresImmediate(); + return true; + default: + break; + } + break; + default: + break; + } + return false; +} + +llvm::Optional<std::string> +M68kTargetInfo::handleAsmEscapedChar(char EscChar) const { + char C; + switch (EscChar) { + case '.': + case '#': + C = EscChar; + break; + case '/': + C = '%'; + break; + case '$': + C = 's'; + break; + case '&': + C = 'd'; + break; + default: + return llvm::None; + } + + return std::string(1, C); +} + +std::string M68kTargetInfo::convertConstraint(const char *&Constraint) const { + if (*Constraint == 'C') + // Two-character constraint; add "^" hint for later parsing + return std::string("^") + std::string(Constraint++, 2); + + return std::string(1, *Constraint); +} + +const char *M68kTargetInfo::getClobbers() const { + // FIXME: Is this really right? + return ""; +} + +TargetInfo::BuiltinVaListKind M68kTargetInfo::getBuiltinVaListKind() const { + return TargetInfo::VoidPtrBuiltinVaList; +} + +} // namespace targets +} // namespace clang diff --git a/clang/lib/Basic/Targets/M68k.h b/clang/lib/Basic/Targets/M68k.h new file mode 100644 index 000000000000..a42ca674ef9c --- /dev/null +++ b/clang/lib/Basic/Targets/M68k.h @@ -0,0 +1,59 @@ +//===--- M68k.h - Declare M68k 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 M68k TargetInfo objects. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_M68K_H +#define LLVM_CLANG_LIB_BASIC_TARGETS_M68K_H + +#include "OSTargets.h" +#include "clang/Basic/TargetInfo.h" +#include "clang/Basic/TargetOptions.h" +#include "llvm/ADT/Triple.h" +#include "llvm/Support/Compiler.h" + +namespace clang { +namespace targets { + +class LLVM_LIBRARY_VISIBILITY M68kTargetInfo : public TargetInfo { + static const char *const GCCRegNames[]; + + enum CPUKind { + CK_Unknown, + CK_68000, + CK_68010, + CK_68020, + CK_68030, + CK_68040, + CK_68060 + } CPU = CK_Unknown; + +public: + M68kTargetInfo(const llvm::Triple &Triple, const TargetOptions &); + + void getTargetDefines(const LangOptions &Opts, + MacroBuilder &Builder) const override; + ArrayRef<Builtin::Info> getTargetBuiltins() const override; + bool hasFeature(StringRef Feature) const override; + ArrayRef<const char *> getGCCRegNames() const override; + ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override; + std::string convertConstraint(const char *&Constraint) const override; + bool validateAsmConstraint(const char *&Name, + TargetInfo::ConstraintInfo &info) const override; + llvm::Optional<std::string> handleAsmEscapedChar(char EscChar) const override; + const char *getClobbers() const override; + BuiltinVaListKind getBuiltinVaListKind() const override; + bool setCPU(const std::string &Name) override; +}; + +} // namespace targets +} // namespace clang + +#endif diff --git a/clang/lib/Basic/Targets/NVPTX.cpp b/clang/lib/Basic/Targets/NVPTX.cpp index b7f0dce33d2b..56f8a179db3c 100644 --- a/clang/lib/Basic/Targets/NVPTX.cpp +++ b/clang/lib/Basic/Targets/NVPTX.cpp @@ -45,6 +45,8 @@ NVPTXTargetInfo::NVPTXTargetInfo(const llvm::Triple &Triple, if (!Feature.startswith("+ptx")) continue; PTXVersion = llvm::StringSwitch<unsigned>(Feature) + .Case("+ptx72", 72) + .Case("+ptx71", 71) .Case("+ptx70", 70) .Case("+ptx65", 65) .Case("+ptx64", 64) @@ -200,14 +202,18 @@ void NVPTXTargetInfo::getTargetDefines(const LangOptions &Opts, case CudaArch::GFX906: case CudaArch::GFX908: case CudaArch::GFX909: + case CudaArch::GFX90a: case CudaArch::GFX90c: case CudaArch::GFX1010: case CudaArch::GFX1011: case CudaArch::GFX1012: + case CudaArch::GFX1013: case CudaArch::GFX1030: case CudaArch::GFX1031: case CudaArch::GFX1032: case CudaArch::GFX1033: + case CudaArch::GFX1034: + case CudaArch::GFX1035: case CudaArch::LAST: break; case CudaArch::UNUSED: @@ -246,6 +252,8 @@ void NVPTXTargetInfo::getTargetDefines(const LangOptions &Opts, return "750"; case CudaArch::SM_80: return "800"; + case CudaArch::SM_86: + return "860"; } llvm_unreachable("unhandled CudaArch"); }(); diff --git a/clang/lib/Basic/Targets/NVPTX.h b/clang/lib/Basic/Targets/NVPTX.h index 038dec4a28bd..c7db3cdaaf10 100644 --- a/clang/lib/Basic/Targets/NVPTX.h +++ b/clang/lib/Basic/Targets/NVPTX.h @@ -35,6 +35,11 @@ static const unsigned NVPTXAddrSpaceMap[] = { 1, // cuda_device 4, // cuda_constant 3, // cuda_shared + 1, // sycl_global + 1, // sycl_global_device + 1, // sycl_global_host + 3, // sycl_local + 0, // sycl_private 0, // ptr32_sptr 0, // ptr32_uptr 0 // ptr64 @@ -130,8 +135,11 @@ public: Opts["cl_clang_storage_class_specifiers"] = true; Opts["__cl_clang_function_pointers"] = true; Opts["__cl_clang_variadic_functions"] = true; + Opts["__cl_clang_non_portable_kernel_param_types"] = true; + Opts["__cl_clang_bitfields"] = true; Opts["cl_khr_fp64"] = true; + Opts["__opencl_c_fp64"] = true; Opts["cl_khr_byte_addressable_store"] = true; Opts["cl_khr_global_int32_base_atomics"] = true; Opts["cl_khr_global_int32_extended_atomics"] = true; diff --git a/clang/lib/Basic/Targets/OSTargets.cpp b/clang/lib/Basic/Targets/OSTargets.cpp index 15e475a31d64..7cd4a5190120 100644 --- a/clang/lib/Basic/Targets/OSTargets.cpp +++ b/clang/lib/Basic/Targets/OSTargets.cpp @@ -55,6 +55,8 @@ void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts, } else { Triple.getOSVersion(Maj, Min, Rev); PlatformName = llvm::Triple::getOSTypeName(Triple.getOS()); + if (PlatformName == "ios" && Triple.isMacCatalystEnvironment()) + PlatformName = "maccatalyst"; } // If -target arch-pc-win32-macho option specified, we're diff --git a/clang/lib/Basic/Targets/OSTargets.h b/clang/lib/Basic/Targets/OSTargets.h index 67fa1a537fea..e24fb5cf082d 100644 --- a/clang/lib/Basic/Targets/OSTargets.h +++ b/clang/lib/Basic/Targets/OSTargets.h @@ -13,7 +13,6 @@ #define LLVM_CLANG_LIB_BASIC_TARGETS_OSTARGETS_H #include "Targets.h" -#include "llvm/MC/MCSectionMachO.h" namespace clang { namespace targets { @@ -114,15 +113,6 @@ public: this->MCountName = "\01mcount"; } - std::string isValidSectionSpecifier(StringRef SR) const override { - // Let MCSectionMachO validate this. - StringRef Segment, Section; - unsigned TAA, StubSize; - bool HasTAA; - return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section, - TAA, HasTAA, StubSize); - } - const char *getStaticInitSectionSpecifier() const override { // FIXME: We should return 0 when building kexts. return "__TEXT,__StaticInit,regular,pure_instructions"; @@ -261,6 +251,9 @@ public: case llvm::Triple::arm: this->MCountName = "__mcount"; break; + case llvm::Triple::riscv32: + case llvm::Triple::riscv64: + break; } } }; @@ -491,6 +484,9 @@ public: case llvm::Triple::sparcv9: this->MCountName = "_mcount"; break; + case llvm::Triple::riscv32: + case llvm::Triple::riscv64: + break; } } }; @@ -679,6 +675,12 @@ protected: Builder.defineMacro("_POWER"); Builder.defineMacro("_AIX"); + Builder.defineMacro("__TOS_AIX__"); + + if (Opts.C11) { + Builder.defineMacro("__STDC_NO_ATOMICS__"); + Builder.defineMacro("__STDC_NO_THREADS__"); + } if (Opts.EnableAIXExtendedAltivecABI) Builder.defineMacro("__EXTABI__"); @@ -699,6 +701,7 @@ protected: if (OsVersion >= std::make_pair(6, 1)) Builder.defineMacro("_AIX61"); if (OsVersion >= std::make_pair(7, 1)) Builder.defineMacro("_AIX71"); if (OsVersion >= std::make_pair(7, 2)) Builder.defineMacro("_AIX72"); + if (OsVersion >= std::make_pair(7, 3)) Builder.defineMacro("_AIX73"); // FIXME: Do not define _LONG_LONG when -fno-long-long is specified. Builder.defineMacro("_LONG_LONG"); @@ -788,10 +791,11 @@ public: ZOSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : OSTargetInfo<Target>(Triple, Opts) { this->WCharType = TargetInfo::UnsignedInt; + this->MaxAlignedAttribute = 128; this->UseBitFieldTypeAlignment = false; this->UseZeroLengthBitfieldAlignment = true; + this->UseLeadingZeroLengthBitfield = false; this->ZeroLengthBitfieldBoundary = 32; - this->MinGlobalAlign = 0; this->DefaultAlignForAttributeAligned = 128; } }; @@ -940,11 +944,21 @@ class LLVM_LIBRARY_VISIBILITY EmscriptenTargetInfo MacroBuilder &Builder) const final { WebAssemblyOSTargetInfo<Target>::getOSDefines(Opts, Triple, Builder); Builder.defineMacro("__EMSCRIPTEN__"); + if (Opts.POSIXThreads) + Builder.defineMacro("__EMSCRIPTEN_PTHREADS__"); } public: - explicit EmscriptenTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) - : WebAssemblyOSTargetInfo<Target>(Triple, Opts) {} + explicit EmscriptenTargetInfo(const llvm::Triple &Triple, + const TargetOptions &Opts) + : WebAssemblyOSTargetInfo<Target>(Triple, Opts) { + // Keeping the alignment of long double to 8 bytes even though its size is + // 16 bytes allows emscripten to have an 8-byte-aligned max_align_t which + // in turn gives is a 8-byte aligned malloc. + // Emscripten's ABI is unstable and we may change this back to 128 to match + // the WebAssembly default in the future. + this->LongDoubleAlign = 64; + } }; } // namespace targets diff --git a/clang/lib/Basic/Targets/PPC.cpp b/clang/lib/Basic/Targets/PPC.cpp index cfede6e6e756..59656888e25f 100644 --- a/clang/lib/Basic/Targets/PPC.cpp +++ b/clang/lib/Basic/Targets/PPC.cpp @@ -56,7 +56,10 @@ bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features, HasP10Vector = true; } else if (Feature == "+pcrelative-memops") { HasPCRelativeMemops = true; + } else if (Feature == "+prefix-instrs") { + HasPrefixInstrs = true; } else if (Feature == "+spe" || Feature == "+efpu2") { + HasStrictFP = false; HasSPE = true; LongDoubleWidth = LongDoubleAlign = 64; LongDoubleFormat = &llvm::APFloat::IEEEdouble(); @@ -66,6 +69,16 @@ bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features, PairedVectorMemops = true; } else if (Feature == "+mma") { HasMMA = true; + } else if (Feature == "+rop-protect") { + HasROPProtect = true; + } else if (Feature == "+privileged") { + HasPrivileged = true; + } else if (Feature == "+isa-v207-instructions") { + IsISA2_07 = true; + } else if (Feature == "+isa-v30-instructions") { + IsISA3_0 = true; + } else if (Feature == "+isa-v31-instructions") { + IsISA3_1 = true; } // TODO: Finish this list and add an assert that we've handled them // all. @@ -74,10 +87,164 @@ bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features, return true; } +static void defineXLCompatMacros(MacroBuilder &Builder) { + Builder.defineMacro("__popcntb", "__builtin_ppc_popcntb"); + Builder.defineMacro("__poppar4", "__builtin_ppc_poppar4"); + Builder.defineMacro("__poppar8", "__builtin_ppc_poppar8"); + Builder.defineMacro("__eieio", "__builtin_ppc_eieio"); + Builder.defineMacro("__iospace_eieio", "__builtin_ppc_iospace_eieio"); + Builder.defineMacro("__isync", "__builtin_ppc_isync"); + Builder.defineMacro("__lwsync", "__builtin_ppc_lwsync"); + Builder.defineMacro("__iospace_lwsync", "__builtin_ppc_iospace_lwsync"); + Builder.defineMacro("__sync", "__builtin_ppc_sync"); + Builder.defineMacro("__iospace_sync", "__builtin_ppc_iospace_sync"); + Builder.defineMacro("__dcbfl", "__builtin_ppc_dcbfl"); + Builder.defineMacro("__dcbflp", "__builtin_ppc_dcbflp"); + Builder.defineMacro("__dcbst", "__builtin_ppc_dcbst"); + Builder.defineMacro("__dcbt", "__builtin_ppc_dcbt"); + Builder.defineMacro("__dcbtst", "__builtin_ppc_dcbtst"); + Builder.defineMacro("__dcbz", "__builtin_ppc_dcbz"); + Builder.defineMacro("__icbt", "__builtin_ppc_icbt"); + Builder.defineMacro("__compare_and_swap", "__builtin_ppc_compare_and_swap"); + Builder.defineMacro("__compare_and_swaplp", + "__builtin_ppc_compare_and_swaplp"); + Builder.defineMacro("__fetch_and_add", "__builtin_ppc_fetch_and_add"); + Builder.defineMacro("__fetch_and_addlp", "__builtin_ppc_fetch_and_addlp"); + Builder.defineMacro("__fetch_and_and", "__builtin_ppc_fetch_and_and"); + Builder.defineMacro("__fetch_and_andlp", "__builtin_ppc_fetch_and_andlp"); + Builder.defineMacro("__fetch_and_or", "__builtin_ppc_fetch_and_or"); + Builder.defineMacro("__fetch_and_orlp", "__builtin_ppc_fetch_and_orlp"); + Builder.defineMacro("__fetch_and_swap", "__builtin_ppc_fetch_and_swap"); + Builder.defineMacro("__fetch_and_swaplp", "__builtin_ppc_fetch_and_swaplp"); + Builder.defineMacro("__ldarx", "__builtin_ppc_ldarx"); + Builder.defineMacro("__lwarx", "__builtin_ppc_lwarx"); + Builder.defineMacro("__lharx", "__builtin_ppc_lharx"); + Builder.defineMacro("__lbarx", "__builtin_ppc_lbarx"); + Builder.defineMacro("__stfiw", "__builtin_ppc_stfiw"); + Builder.defineMacro("__stdcx", "__builtin_ppc_stdcx"); + Builder.defineMacro("__stwcx", "__builtin_ppc_stwcx"); + Builder.defineMacro("__sthcx", "__builtin_ppc_sthcx"); + Builder.defineMacro("__stbcx", "__builtin_ppc_stbcx"); + Builder.defineMacro("__tdw", "__builtin_ppc_tdw"); + Builder.defineMacro("__tw", "__builtin_ppc_tw"); + Builder.defineMacro("__trap", "__builtin_ppc_trap"); + Builder.defineMacro("__trapd", "__builtin_ppc_trapd"); + Builder.defineMacro("__fcfid", "__builtin_ppc_fcfid"); + Builder.defineMacro("__fcfud", "__builtin_ppc_fcfud"); + Builder.defineMacro("__fctid", "__builtin_ppc_fctid"); + Builder.defineMacro("__fctidz", "__builtin_ppc_fctidz"); + Builder.defineMacro("__fctiw", "__builtin_ppc_fctiw"); + Builder.defineMacro("__fctiwz", "__builtin_ppc_fctiwz"); + Builder.defineMacro("__fctudz", "__builtin_ppc_fctudz"); + Builder.defineMacro("__fctuwz", "__builtin_ppc_fctuwz"); + Builder.defineMacro("__cmpeqb", "__builtin_ppc_cmpeqb"); + Builder.defineMacro("__cmprb", "__builtin_ppc_cmprb"); + Builder.defineMacro("__setb", "__builtin_ppc_setb"); + Builder.defineMacro("__cmpb", "__builtin_ppc_cmpb"); + Builder.defineMacro("__mulhd", "__builtin_ppc_mulhd"); + Builder.defineMacro("__mulhdu", "__builtin_ppc_mulhdu"); + Builder.defineMacro("__mulhw", "__builtin_ppc_mulhw"); + Builder.defineMacro("__mulhwu", "__builtin_ppc_mulhwu"); + Builder.defineMacro("__maddhd", "__builtin_ppc_maddhd"); + Builder.defineMacro("__maddhdu", "__builtin_ppc_maddhdu"); + Builder.defineMacro("__maddld", "__builtin_ppc_maddld"); + Builder.defineMacro("__rlwnm", "__builtin_ppc_rlwnm"); + Builder.defineMacro("__rlwimi", "__builtin_ppc_rlwimi"); + Builder.defineMacro("__rldimi", "__builtin_ppc_rldimi"); + Builder.defineMacro("__load2r", "__builtin_ppc_load2r"); + Builder.defineMacro("__load4r", "__builtin_ppc_load4r"); + Builder.defineMacro("__load8r", "__builtin_ppc_load8r"); + Builder.defineMacro("__store2r", "__builtin_ppc_store2r"); + Builder.defineMacro("__store4r", "__builtin_ppc_store4r"); + Builder.defineMacro("__store8r", "__builtin_ppc_store8r"); + Builder.defineMacro("__extract_exp", "__builtin_ppc_extract_exp"); + Builder.defineMacro("__extract_sig", "__builtin_ppc_extract_sig"); + Builder.defineMacro("__mtfsb0", "__builtin_ppc_mtfsb0"); + Builder.defineMacro("__mtfsb1", "__builtin_ppc_mtfsb1"); + Builder.defineMacro("__mtfsf", "__builtin_ppc_mtfsf"); + Builder.defineMacro("__mtfsfi", "__builtin_ppc_mtfsfi"); + Builder.defineMacro("__insert_exp", "__builtin_ppc_insert_exp"); + Builder.defineMacro("__fmsub", "__builtin_ppc_fmsub"); + Builder.defineMacro("__fmsubs", "__builtin_ppc_fmsubs"); + Builder.defineMacro("__fnmadd", "__builtin_ppc_fnmadd"); + Builder.defineMacro("__fnmadds", "__builtin_ppc_fnmadds"); + Builder.defineMacro("__fnmsub", "__builtin_ppc_fnmsub"); + Builder.defineMacro("__fnmsubs", "__builtin_ppc_fnmsubs"); + Builder.defineMacro("__fre", "__builtin_ppc_fre"); + Builder.defineMacro("__fres", "__builtin_ppc_fres"); + Builder.defineMacro("__swdiv_nochk", "__builtin_ppc_swdiv_nochk"); + Builder.defineMacro("__swdivs_nochk", "__builtin_ppc_swdivs_nochk"); + Builder.defineMacro("__alloca", "__builtin_alloca"); + Builder.defineMacro("__vcipher", "__builtin_altivec_crypto_vcipher"); + Builder.defineMacro("__vcipherlast", "__builtin_altivec_crypto_vcipherlast"); + Builder.defineMacro("__vncipher", "__builtin_altivec_crypto_vncipher"); + Builder.defineMacro("__vncipherlast", + "__builtin_altivec_crypto_vncipherlast"); + Builder.defineMacro("__vpermxor", "__builtin_altivec_crypto_vpermxor"); + Builder.defineMacro("__vpmsumb", "__builtin_altivec_crypto_vpmsumb"); + Builder.defineMacro("__vpmsumd", "__builtin_altivec_crypto_vpmsumd"); + Builder.defineMacro("__vpmsumh", "__builtin_altivec_crypto_vpmsumh"); + Builder.defineMacro("__vpmsumw", "__builtin_altivec_crypto_vpmsumw"); + Builder.defineMacro("__divde", "__builtin_divde"); + Builder.defineMacro("__divwe", "__builtin_divwe"); + Builder.defineMacro("__divdeu", "__builtin_divdeu"); + Builder.defineMacro("__divweu", "__builtin_divweu"); + Builder.defineMacro("__alignx", "__builtin_ppc_alignx"); + Builder.defineMacro("__bcopy", "bcopy"); + Builder.defineMacro("__bpermd", "__builtin_bpermd"); + Builder.defineMacro("__cntlz4", "__builtin_clz"); + Builder.defineMacro("__cntlz8", "__builtin_clzll"); + Builder.defineMacro("__cmplx", "__builtin_complex"); + Builder.defineMacro("__cmplxf", "__builtin_complex"); + Builder.defineMacro("__cnttz4", "__builtin_ctz"); + Builder.defineMacro("__cnttz8", "__builtin_ctzll"); + Builder.defineMacro("__darn", "__builtin_darn"); + Builder.defineMacro("__darn_32", "__builtin_darn_32"); + Builder.defineMacro("__darn_raw", "__builtin_darn_raw"); + Builder.defineMacro("__dcbf", "__builtin_dcbf"); + Builder.defineMacro("__fmadd", "__builtin_fma"); + Builder.defineMacro("__fmadds", "__builtin_fmaf"); + Builder.defineMacro("__labs", "__builtin_labs"); + Builder.defineMacro("__llabs", "__builtin_llabs"); + Builder.defineMacro("__popcnt4", "__builtin_popcount"); + Builder.defineMacro("__popcnt8", "__builtin_popcountll"); + Builder.defineMacro("__readflm", "__builtin_readflm"); + Builder.defineMacro("__rotatel4", "__builtin_rotateleft32"); + Builder.defineMacro("__rotatel8", "__builtin_rotateleft64"); + Builder.defineMacro("__rdlam", "__builtin_ppc_rdlam"); + Builder.defineMacro("__setflm", "__builtin_setflm"); + Builder.defineMacro("__setrnd", "__builtin_setrnd"); + Builder.defineMacro("__dcbtstt", "__builtin_ppc_dcbtstt"); + Builder.defineMacro("__dcbtt", "__builtin_ppc_dcbtt"); + Builder.defineMacro("__mftbu", "__builtin_ppc_mftbu"); + Builder.defineMacro("__mfmsr", "__builtin_ppc_mfmsr"); + Builder.defineMacro("__mtmsr", "__builtin_ppc_mtmsr"); + Builder.defineMacro("__mfspr", "__builtin_ppc_mfspr"); + Builder.defineMacro("__mtspr", "__builtin_ppc_mtspr"); + Builder.defineMacro("__fric", "__builtin_ppc_fric"); + Builder.defineMacro("__frim", "__builtin_ppc_frim"); + Builder.defineMacro("__frims", "__builtin_ppc_frims"); + Builder.defineMacro("__frin", "__builtin_ppc_frin"); + Builder.defineMacro("__frins", "__builtin_ppc_frins"); + Builder.defineMacro("__frip", "__builtin_ppc_frip"); + Builder.defineMacro("__frips", "__builtin_ppc_frips"); + Builder.defineMacro("__friz", "__builtin_ppc_friz"); + Builder.defineMacro("__frizs", "__builtin_ppc_frizs"); + Builder.defineMacro("__fsel", "__builtin_ppc_fsel"); + Builder.defineMacro("__fsels", "__builtin_ppc_fsels"); + Builder.defineMacro("__frsqrte", "__builtin_ppc_frsqrte"); + Builder.defineMacro("__frsqrtes", "__builtin_ppc_frsqrtes"); + Builder.defineMacro("__fsqrt", "__builtin_ppc_fsqrt"); + Builder.defineMacro("__fsqrts", "__builtin_ppc_fsqrts"); +} + /// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific /// #defines that are not tied to a specific subtarget. void PPCTargetInfo::getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const { + + defineXLCompatMacros(Builder); + // Target identification. Builder.defineMacro("__ppc__"); Builder.defineMacro("__PPC__"); @@ -129,6 +296,11 @@ void PPCTargetInfo::getTargetDefines(const LangOptions &Opts, Builder.defineMacro("__LONG_DOUBLE_IBM128__"); } + if (getTriple().isOSAIX() && Opts.LongDoubleSize == 64) { + assert(LongDoubleWidth == 64); + Builder.defineMacro("__LONGDOUBLE64"); + } + // Define this for elfv2 (64-bit only) or 64-bit darwin. if (ABI == "elfv2" || (getTriple().getOS() == llvm::Triple::Darwin && PointerWidth == 64)) @@ -193,8 +365,14 @@ void PPCTargetInfo::getTargetDefines(const LangOptions &Opts, Builder.defineMacro("__POWER9_VECTOR__"); if (HasMMA) Builder.defineMacro("__MMA__"); + if (HasROPProtect) + Builder.defineMacro("__ROP_PROTECT__"); + if (HasPrivileged) + Builder.defineMacro("__PRIVILEGED__"); if (HasP10Vector) Builder.defineMacro("__POWER10_VECTOR__"); + if (HasPCRelativeMemops) + Builder.defineMacro("__PCREL__"); Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1"); Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2"); @@ -318,15 +496,26 @@ bool PPCTargetInfo::initFeatureMap( .Case("pwr9", true) .Case("pwr8", true) .Default(false); - Features["float128"] = llvm::StringSwitch<bool>(CPU) - .Case("pwr9", true) - .Default(false); + + // ROP Protect is off by default. + Features["rop-protect"] = false; + // Privileged instructions are off by default. + Features["privileged"] = false; Features["spe"] = llvm::StringSwitch<bool>(CPU) .Case("8548", true) .Case("e500", true) .Default(false); + Features["isa-v207-instructions"] = llvm::StringSwitch<bool>(CPU) + .Case("ppc64le", true) + .Case("pwr9", true) + .Case("pwr8", true) + .Default(false); + + Features["isa-v30-instructions"] = + llvm::StringSwitch<bool>(CPU).Case("pwr9", true).Default(false); + // Power10 includes all the same features as Power9 plus any features specific // to the Power10 core. if (CPU == "pwr10" || CPU == "power10") { @@ -358,6 +547,19 @@ bool PPCTargetInfo::initFeatureMap( return false; } + if (!(ArchDefs & ArchDefinePwr8) && + llvm::find(FeaturesVec, "+rop-protect") != FeaturesVec.end()) { + // We can turn on ROP Protect on Power 8 and above. + Diags.Report(diag::err_opt_not_valid_with_opt) << "-mrop-protect" << CPU; + return false; + } + + if (!(ArchDefs & ArchDefinePwr8) && + llvm::find(FeaturesVec, "+privileged") != FeaturesVec.end()) { + Diags.Report(diag::err_opt_not_valid_with_opt) << "-mprivileged" << CPU; + return false; + } + return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec); } @@ -369,6 +571,8 @@ void PPCTargetInfo::addP10SpecificFeatures( Features["mma"] = true; Features["power10-vector"] = true; Features["pcrelative-memops"] = true; + Features["prefix-instrs"] = true; + Features["isa-v31-instructions"] = true; return; } @@ -394,8 +598,14 @@ bool PPCTargetInfo::hasFeature(StringRef Feature) const { .Case("paired-vector-memops", PairedVectorMemops) .Case("power10-vector", HasP10Vector) .Case("pcrelative-memops", HasPCRelativeMemops) + .Case("prefix-instrs", HasPrefixInstrs) .Case("spe", HasSPE) .Case("mma", HasMMA) + .Case("rop-protect", HasROPProtect) + .Case("privileged", HasPrivileged) + .Case("isa-v207-instructions", IsISA2_07) + .Case("isa-v30-instructions", IsISA3_0) + .Case("isa-v31-instructions", IsISA3_1) .Default(false); } @@ -424,6 +634,8 @@ void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features, Features["power8-vector"] = Features["power9-vector"] = true; if (Name == "pcrel") Features["pcrelative-memops"] = true; + else if (Name == "prefixed") + Features["prefix-instrs"] = true; else Features[Name] = true; } else { @@ -444,6 +656,8 @@ void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features, Features["power10-vector"] = false; if (Name == "pcrel") Features["pcrelative-memops"] = false; + else if (Name == "prefixed") + Features["prefix-instrs"] = false; else Features[Name] = false; } @@ -526,17 +740,17 @@ ArrayRef<TargetInfo::AddlRegName> PPCTargetInfo::getGCCAddlRegNames() const { } static constexpr llvm::StringLiteral ValidCPUNames[] = { - {"generic"}, {"440"}, {"450"}, {"601"}, {"602"}, - {"603"}, {"603e"}, {"603ev"}, {"604"}, {"604e"}, - {"620"}, {"630"}, {"g3"}, {"7400"}, {"g4"}, - {"7450"}, {"g4+"}, {"750"}, {"8548"}, {"970"}, - {"g5"}, {"a2"}, {"e500"}, {"e500mc"}, {"e5500"}, - {"power3"}, {"pwr3"}, {"power4"}, {"pwr4"}, {"power5"}, - {"pwr5"}, {"power5x"}, {"pwr5x"}, {"power6"}, {"pwr6"}, - {"power6x"}, {"pwr6x"}, {"power7"}, {"pwr7"}, {"power8"}, - {"pwr8"}, {"power9"}, {"pwr9"}, {"power10"}, {"pwr10"}, - {"powerpc"}, {"ppc"}, {"powerpc64"}, {"ppc64"}, {"powerpc64le"}, - {"ppc64le"}, {"future"}}; + {"generic"}, {"440"}, {"450"}, {"601"}, {"602"}, + {"603"}, {"603e"}, {"603ev"}, {"604"}, {"604e"}, + {"620"}, {"630"}, {"g3"}, {"7400"}, {"g4"}, + {"7450"}, {"g4+"}, {"750"}, {"8548"}, {"970"}, + {"g5"}, {"a2"}, {"e500"}, {"e500mc"}, {"e5500"}, + {"power3"}, {"pwr3"}, {"power4"}, {"pwr4"}, {"power5"}, + {"pwr5"}, {"power5x"}, {"pwr5x"}, {"power6"}, {"pwr6"}, + {"power6x"}, {"pwr6x"}, {"power7"}, {"pwr7"}, {"power8"}, + {"pwr8"}, {"power9"}, {"pwr9"}, {"power10"}, {"pwr10"}, + {"powerpc"}, {"ppc"}, {"ppc32"}, {"powerpc64"}, {"ppc64"}, + {"powerpc64le"}, {"ppc64le"}, {"future"}}; bool PPCTargetInfo::isValidCPUName(StringRef Name) const { return llvm::find(ValidCPUNames, Name) != std::end(ValidCPUNames); @@ -546,14 +760,15 @@ void PPCTargetInfo::fillValidCPUList(SmallVectorImpl<StringRef> &Values) const { Values.append(std::begin(ValidCPUNames), std::end(ValidCPUNames)); } -void PPCTargetInfo::adjust(LangOptions &Opts) { +void PPCTargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts) { if (HasAltivec) Opts.AltiVec = 1; - TargetInfo::adjust(Opts); + TargetInfo::adjust(Diags, Opts); if (LongDoubleFormat != &llvm::APFloat::IEEEdouble()) LongDoubleFormat = Opts.PPCIEEELongDouble ? &llvm::APFloat::IEEEquad() : &llvm::APFloat::PPCDoubleDouble(); + Opts.IEEE128 = 1; } ArrayRef<Builtin::Info> PPCTargetInfo::getTargetBuiltins() const { diff --git a/clang/lib/Basic/Targets/PPC.h b/clang/lib/Basic/Targets/PPC.h index 56c8f33ef221..7c14a4eb9410 100644 --- a/clang/lib/Basic/Targets/PPC.h +++ b/clang/lib/Basic/Targets/PPC.h @@ -59,6 +59,8 @@ class LLVM_LIBRARY_VISIBILITY PPCTargetInfo : public TargetInfo { // Target cpu features. bool HasAltivec = false; bool HasMMA = false; + bool HasROPProtect = false; + bool HasPrivileged = false; bool HasVSX = false; bool HasP8Vector = false; bool HasP8Crypto = false; @@ -71,6 +73,10 @@ class LLVM_LIBRARY_VISIBILITY PPCTargetInfo : public TargetInfo { bool PairedVectorMemops = false; bool HasP10Vector = false; bool HasPCRelativeMemops = false; + bool HasPrefixInstrs = false; + bool IsISA2_07 = false; + bool IsISA3_0 = false; + bool IsISA3_1 = false; protected: std::string ABI; @@ -86,7 +92,7 @@ public: } // Set the language option for altivec based on our value. - void adjust(LangOptions &Opts) override; + void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override; // Note: GCC recognizes the following additional cpus: // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801, @@ -427,7 +433,7 @@ public: } if (Triple.isOSAIX() || Triple.isOSLinux()) - DataLayout += "-v256:256:256-v512:512:512"; + DataLayout += "-S128-v256:256:256-v512:512:512"; resetDataLayout(DataLayout); // PPC64 supports atomics up to 8 bytes. @@ -451,6 +457,8 @@ public: switch (CC) { case CC_Swift: return CCCR_OK; + case CC_SwiftAsync: + return CCCR_Error; default: return CCCR_Warning; } @@ -466,7 +474,7 @@ public: BoolWidth = BoolAlign = 32; // XXX support -mone-byte-bool? PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726 LongLongAlign = 32; - resetDataLayout("E-m:o-p:32:32-f64:32:64-n32"); + resetDataLayout("E-m:o-p:32:32-f64:32:64-n32", "_"); } BuiltinVaListKind getBuiltinVaListKind() const override { @@ -480,7 +488,7 @@ public: DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) { HasAlignMac68kSupport = true; - resetDataLayout("E-m:o-i64:64-n32:64"); + resetDataLayout("E-m:o-i64:64-n32:64", "_"); } }; diff --git a/clang/lib/Basic/Targets/RISCV.cpp b/clang/lib/Basic/Targets/RISCV.cpp index 0bf02e605740..9705129b39d8 100644 --- a/clang/lib/Basic/Targets/RISCV.cpp +++ b/clang/lib/Basic/Targets/RISCV.cpp @@ -12,6 +12,7 @@ #include "RISCV.h" #include "clang/Basic/MacroBuilder.h" +#include "clang/Basic/TargetBuiltins.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Support/TargetParser.h" @@ -30,7 +31,13 @@ ArrayRef<const char *> RISCVTargetInfo::getGCCRegNames() const { "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", - "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31"}; + "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", + + // Vector registers + "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", + "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", + "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", + "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"}; return llvm::makeArrayRef(GCCRegNames); } @@ -80,7 +87,32 @@ bool RISCVTargetInfo::validateAsmConstraint( // An address that is held in a general-purpose register. Info.setAllowsMemory(); return true; + case 'S': // A symbolic address + Info.setAllowsRegister(); + return true; + case 'v': + // A vector register. + if (Name[1] == 'r' || Name[1] == 'm') { + Info.setAllowsRegister(); + Name += 1; + return true; + } + return false; + } +} + +std::string RISCVTargetInfo::convertConstraint(const char *&Constraint) const { + std::string R; + switch (*Constraint) { + case 'v': + R = std::string("v"); + Constraint += 1; + break; + default: + R = TargetInfo::convertConstraint(Constraint); + break; } + return R; } void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts, @@ -150,7 +182,7 @@ void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts, } if (HasV) { - Builder.defineMacro("__riscv_v", "1000000"); + Builder.defineMacro("__riscv_v", "10000"); Builder.defineMacro("__riscv_vector"); } @@ -191,10 +223,33 @@ void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts, Builder.defineMacro("__riscv_zfh", "1000"); if (HasZvamo) - Builder.defineMacro("__riscv_zvamo", "1000000"); + Builder.defineMacro("__riscv_zvamo", "10000"); if (HasZvlsseg) - Builder.defineMacro("__riscv_zvlsseg", "1000000"); + Builder.defineMacro("__riscv_zvlsseg", "10000"); +} + +const Builtin::Info RISCVTargetInfo::BuiltinInfo[] = { +#define BUILTIN(ID, TYPE, ATTRS) \ + {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr}, +#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \ + {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE}, +#include "clang/Basic/BuiltinsRISCV.def" +}; + +ArrayRef<Builtin::Info> RISCVTargetInfo::getTargetBuiltins() const { + return llvm::makeArrayRef(BuiltinInfo, clang::RISCV::LastTSBuiltin - + Builtin::FirstTSBuiltin); +} + +bool RISCVTargetInfo::initFeatureMap( + llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU, + const std::vector<std::string> &FeaturesVec) const { + + if (getTriple().getArch() == llvm::Triple::riscv64) + Features["64bit"] = true; + + return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec); } /// Return true if has this feature, need to sync with handleTargetFeatures. @@ -204,6 +259,7 @@ bool RISCVTargetInfo::hasFeature(StringRef Feature) const { .Case("riscv", true) .Case("riscv32", !Is64Bit) .Case("riscv64", Is64Bit) + .Case("64bit", Is64Bit) .Case("m", HasM) .Case("a", HasA) .Case("f", HasF) diff --git a/clang/lib/Basic/Targets/RISCV.h b/clang/lib/Basic/Targets/RISCV.h index f1e9215b2d17..7e0846581ca1 100644 --- a/clang/lib/Basic/Targets/RISCV.h +++ b/clang/lib/Basic/Targets/RISCV.h @@ -47,6 +47,8 @@ protected: bool HasZvamo = false; bool HasZvlsseg = false; + static const Builtin::Info BuiltinInfo[]; + public: RISCVTargetInfo(const llvm::Triple &Triple, const TargetOptions &) : TargetInfo(Triple) { @@ -56,6 +58,9 @@ public: SuitableAlign = 128; WCharType = SignedInt; WIntType = UnsignedInt; + HasRISCVVTypes = true; + MCountName = "_mcount"; + HasFloat16 = true; } bool setCPU(const std::string &Name) override { @@ -69,7 +74,7 @@ public: void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override; - ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; } + ArrayRef<Builtin::Info> getTargetBuiltins() const override; BuiltinVaListKind getBuiltinVaListKind() const override { return TargetInfo::VoidPtrBuiltinVaList; @@ -93,6 +98,13 @@ public: bool validateAsmConstraint(const char *&Name, TargetInfo::ConstraintInfo &Info) const override; + std::string convertConstraint(const char *&Constraint) const override; + + bool + initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, + StringRef CPU, + const std::vector<std::string> &FeaturesVec) const override; + bool hasFeature(StringRef Feature) const override; bool handleTargetFeatures(std::vector<std::string> &Features, diff --git a/clang/lib/Basic/Targets/SPIR.h b/clang/lib/Basic/Targets/SPIR.h index a2e812624d37..50f34abd6630 100644 --- a/clang/lib/Basic/Targets/SPIR.h +++ b/clang/lib/Basic/Targets/SPIR.h @@ -21,7 +21,7 @@ namespace clang { namespace targets { -static const unsigned SPIRAddrSpaceMap[] = { +static const unsigned SPIRDefIsPrivMap[] = { 0, // Default 1, // opencl_global 3, // opencl_local @@ -33,6 +33,35 @@ static const unsigned SPIRAddrSpaceMap[] = { 0, // cuda_device 0, // cuda_constant 0, // cuda_shared + // SYCL address space values for this map are dummy + 0, // sycl_global + 0, // sycl_global_device + 0, // sycl_global_host + 0, // sycl_local + 0, // sycl_private + 0, // ptr32_sptr + 0, // ptr32_uptr + 0 // ptr64 +}; + +static const unsigned SPIRDefIsGenMap[] = { + 4, // Default + // OpenCL address space values for this map are dummy and they can't be used + 0, // opencl_global + 0, // opencl_local + 0, // opencl_constant + 0, // opencl_private + 0, // opencl_generic + 0, // opencl_global_device + 0, // opencl_global_host + 0, // cuda_device + 0, // cuda_constant + 0, // cuda_shared + 1, // sycl_global + 5, // sycl_global_device + 6, // sycl_global_host + 3, // sycl_local + 0, // sycl_private 0, // ptr32_sptr 0, // ptr32_uptr 0 // ptr64 @@ -49,7 +78,7 @@ public: TLSSupported = false; VLASupported = false; LongWidth = LongAlign = 64; - AddrSpaceMap = &SPIRAddrSpaceMap; + AddrSpaceMap = &SPIRDefIsPrivMap; UseAddrSpaceMapMangling = true; HasLegalHalfType = true; HasFloat16 = true; @@ -88,6 +117,11 @@ public: return TargetInfo::VoidPtrBuiltinVaList; } + Optional<unsigned> + getDWARFAddressSpace(unsigned AddressSpace) const override { + return AddressSpace; + } + CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK : CCCR_Warning; @@ -97,6 +131,22 @@ public: return CC_SpirFunction; } + void setAddressSpaceMap(bool DefaultIsGeneric) { + AddrSpaceMap = DefaultIsGeneric ? &SPIRDefIsGenMap : &SPIRDefIsPrivMap; + } + + void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override { + TargetInfo::adjust(Diags, Opts); + // FIXME: SYCL specification considers unannotated pointers and references + // to be pointing to the generic address space. See section 5.9.3 of + // SYCL 2020 specification. + // Currently, there is no way of representing SYCL's default address space + // language semantic along with the semantics of embedded C's default + // address space in the same address space map. Hence the map needs to be + // reset to allow mapping to the desired value of 'Default' entry for SYCL. + setAddressSpaceMap(/*DefaultIsGeneric=*/Opts.SYCLIsDevice); + } + void setSupportedOpenCLOpts() override { // Assume all OpenCL extensions and optional core features are supported // for SPIR since it is a generic target. @@ -107,6 +157,7 @@ public: bool hasInt128Type() const override { return false; } }; + class LLVM_LIBRARY_VISIBILITY SPIR32TargetInfo : public SPIRTargetInfo { public: SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) diff --git a/clang/lib/Basic/Targets/SystemZ.cpp b/clang/lib/Basic/Targets/SystemZ.cpp index ad3915e4d5dd..e3e0da21f8d5 100644 --- a/clang/lib/Basic/Targets/SystemZ.cpp +++ b/clang/lib/Basic/Targets/SystemZ.cpp @@ -92,7 +92,8 @@ static constexpr ISANameRevision ISARevisions[] = { {{"arch10"}, 10}, {{"zEC12"}, 10}, {{"arch11"}, 11}, {{"z13"}, 11}, {{"arch12"}, 12}, {{"z14"}, 12}, - {{"arch13"}, 13}, {{"z15"}, 13} + {{"arch13"}, 13}, {{"z15"}, 13}, + {{"arch14"}, 14} }; int SystemZTargetInfo::getISARevision(StringRef Name) const { @@ -120,6 +121,7 @@ bool SystemZTargetInfo::hasFeature(StringRef Feature) const { .Case("arch11", ISARevision >= 11) .Case("arch12", ISARevision >= 12) .Case("arch13", ISARevision >= 13) + .Case("arch14", ISARevision >= 14) .Case("htm", HasTransactionalExecution) .Case("vx", HasVector) .Default(false); @@ -144,7 +146,7 @@ void SystemZTargetInfo::getTargetDefines(const LangOptions &Opts, if (HasVector) Builder.defineMacro("__VX__"); if (Opts.ZVector) - Builder.defineMacro("__VEC__", "10303"); + Builder.defineMacro("__VEC__", "10304"); } ArrayRef<Builtin::Info> SystemZTargetInfo::getTargetBuiltins() const { diff --git a/clang/lib/Basic/Targets/SystemZ.h b/clang/lib/Basic/Targets/SystemZ.h index 39fdcf90d0c8..b749c3f75d18 100644 --- a/clang/lib/Basic/Targets/SystemZ.h +++ b/clang/lib/Basic/Targets/SystemZ.h @@ -108,6 +108,8 @@ public: Features["vector-enhancements-1"] = true; if (ISARevision >= 13) Features["vector-enhancements-2"] = true; + if (ISARevision >= 14) + Features["nnp-assist"] = true; return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec); } @@ -143,6 +145,8 @@ public: case CC_Swift: case CC_OpenCLKernel: return CCCR_OK; + case CC_SwiftAsync: + return CCCR_Error; default: return CCCR_Warning; } diff --git a/clang/lib/Basic/Targets/TCE.h b/clang/lib/Basic/Targets/TCE.h index 445fe4fe7293..251b4d4b56f7 100644 --- a/clang/lib/Basic/Targets/TCE.h +++ b/clang/lib/Basic/Targets/TCE.h @@ -42,6 +42,11 @@ static const unsigned TCEOpenCLAddrSpaceMap[] = { 0, // cuda_device 0, // cuda_constant 0, // cuda_shared + 0, // sycl_global + 0, // sycl_global_device + 0, // sycl_global_host + 0, // sycl_local + 0, // sycl_private 0, // ptr32_sptr 0, // ptr32_uptr 0, // ptr64 diff --git a/clang/lib/Basic/Targets/WebAssembly.cpp b/clang/lib/Basic/Targets/WebAssembly.cpp index dcb3d8fd7790..7ef79849cb75 100644 --- a/clang/lib/Basic/Targets/WebAssembly.cpp +++ b/clang/lib/Basic/Targets/WebAssembly.cpp @@ -46,7 +46,6 @@ bool WebAssemblyTargetInfo::setABI(const std::string &Name) { bool WebAssemblyTargetInfo::hasFeature(StringRef Feature) const { return llvm::StringSwitch<bool>(Feature) .Case("simd128", SIMDLevel >= SIMD128) - .Case("unimplemented-simd128", SIMDLevel >= UnimplementedSIMD128) .Case("nontrapping-fptoint", HasNontrappingFPToInt) .Case("sign-ext", HasSignExt) .Case("exception-handling", HasExceptionHandling) @@ -73,8 +72,6 @@ void WebAssemblyTargetInfo::getTargetDefines(const LangOptions &Opts, defineCPUMacros(Builder, "wasm", /*Tuning=*/false); if (SIMDLevel >= SIMD128) Builder.defineMacro("__wasm_simd128__"); - if (SIMDLevel >= UnimplementedSIMD128) - Builder.defineMacro("__wasm_unimplemented_simd128__"); if (HasNontrappingFPToInt) Builder.defineMacro("__wasm_nontrapping_fptoint__"); if (HasSignExt) @@ -99,9 +96,6 @@ void WebAssemblyTargetInfo::setSIMDLevel(llvm::StringMap<bool> &Features, SIMDEnum Level, bool Enabled) { if (Enabled) { switch (Level) { - case UnimplementedSIMD128: - Features["unimplemented-simd128"] = true; - LLVM_FALLTHROUGH; case SIMD128: Features["simd128"] = true; LLVM_FALLTHROUGH; @@ -115,9 +109,6 @@ void WebAssemblyTargetInfo::setSIMDLevel(llvm::StringMap<bool> &Features, case NoSIMD: case SIMD128: Features["simd128"] = false; - LLVM_FALLTHROUGH; - case UnimplementedSIMD128: - Features["unimplemented-simd128"] = false; break; } } @@ -127,8 +118,6 @@ void WebAssemblyTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features, bool Enabled) const { if (Name == "simd128") setSIMDLevel(Features, SIMD128, Enabled); - else if (Name == "unimplemented-simd128") - setSIMDLevel(Features, UnimplementedSIMD128, Enabled); else Features[Name] = Enabled; } @@ -160,14 +149,6 @@ bool WebAssemblyTargetInfo::handleTargetFeatures( SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1)); continue; } - if (Feature == "+unimplemented-simd128") { - SIMDLevel = std::max(SIMDLevel, SIMDEnum(UnimplementedSIMD128)); - continue; - } - if (Feature == "-unimplemented-simd128") { - SIMDLevel = std::min(SIMDLevel, SIMDEnum(UnimplementedSIMD128 - 1)); - continue; - } if (Feature == "+nontrapping-fptoint") { HasNontrappingFPToInt = true; continue; @@ -253,6 +234,16 @@ ArrayRef<Builtin::Info> WebAssemblyTargetInfo::getTargetBuiltins() const { Builtin::FirstTSBuiltin); } +void WebAssemblyTargetInfo::adjust(DiagnosticsEngine &Diags, + LangOptions &Opts) { + // If the Atomics feature isn't available, turn off POSIXThreads and + // ThreadModel, so that we don't predefine _REENTRANT or __STDCPP_THREADS__. + if (!HasAtomics) { + Opts.POSIXThreads = false; + Opts.setThreadModel(LangOptions::ThreadModelKind::Single); + } +} + void WebAssembly32TargetInfo::getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const { WebAssemblyTargetInfo::getTargetDefines(Opts, Builder); diff --git a/clang/lib/Basic/Targets/WebAssembly.h b/clang/lib/Basic/Targets/WebAssembly.h index 0068ccb5d71f..4a5ba25c75e7 100644 --- a/clang/lib/Basic/Targets/WebAssembly.h +++ b/clang/lib/Basic/Targets/WebAssembly.h @@ -27,7 +27,6 @@ class LLVM_LIBRARY_VISIBILITY WebAssemblyTargetInfo : public TargetInfo { enum SIMDEnum { NoSIMD, SIMD128, - UnimplementedSIMD128, } SIMDLevel = NoSIMD; bool HasNontrappingFPToInt = false; @@ -130,6 +129,8 @@ private: case CC_C: case CC_Swift: return CCCR_OK; + case CC_SwiftAsync: + return CCCR_Error; default: return CCCR_Warning; } @@ -138,6 +139,8 @@ private: bool hasExtIntType() const override { return true; } bool hasProtectedVisibility() const override { return false; } + + void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override; }; class LLVM_LIBRARY_VISIBILITY WebAssembly32TargetInfo @@ -146,7 +149,10 @@ public: explicit WebAssembly32TargetInfo(const llvm::Triple &T, const TargetOptions &Opts) : WebAssemblyTargetInfo(T, Opts) { - resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128"); + if (T.isOSEmscripten()) + resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32:64-S128-ni:1:10:20"); + else + resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128-ni:1:10:20"); } protected: @@ -165,7 +171,10 @@ public: SizeType = UnsignedLong; PtrDiffType = SignedLong; IntPtrType = SignedLong; - resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128"); + if (T.isOSEmscripten()) + resetDataLayout("e-m:e-p:64:64-i64:64-f128:64-n32:64-S128-ni:1:10:20"); + else + resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128-ni:1:10:20"); } protected: diff --git a/clang/lib/Basic/Targets/X86.cpp b/clang/lib/Basic/Targets/X86.cpp index 694a8095e336..9db96c20250f 100644 --- a/clang/lib/Basic/Targets/X86.cpp +++ b/clang/lib/Basic/Targets/X86.cpp @@ -117,7 +117,20 @@ bool X86TargetInfo::initFeatureMap( for (auto &F : CPUFeatures) setFeatureEnabled(Features, F, true); - if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec)) + std::vector<std::string> UpdatedFeaturesVec; + for (const auto &Feature : FeaturesVec) { + // Expand general-regs-only to -x86, -mmx and -sse + if (Feature == "+general-regs-only") { + UpdatedFeaturesVec.push_back("-x87"); + UpdatedFeaturesVec.push_back("-mmx"); + UpdatedFeaturesVec.push_back("-sse"); + continue; + } + + UpdatedFeaturesVec.push_back(Feature); + } + + if (!TargetInfo::initFeatureMap(Features, Diags, CPU, UpdatedFeaturesVec)) return false; // Can't do this earlier because we need to be able to explicitly enable @@ -126,20 +139,20 @@ bool X86TargetInfo::initFeatureMap( // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled. auto I = Features.find("sse4.2"); if (I != Features.end() && I->getValue() && - llvm::find(FeaturesVec, "-popcnt") == FeaturesVec.end()) + llvm::find(UpdatedFeaturesVec, "-popcnt") == UpdatedFeaturesVec.end()) Features["popcnt"] = true; // Additionally, if SSE is enabled and mmx is not explicitly disabled, // then enable MMX. I = Features.find("sse"); if (I != Features.end() && I->getValue() && - llvm::find(FeaturesVec, "-mmx") == FeaturesVec.end()) + llvm::find(UpdatedFeaturesVec, "-mmx") == UpdatedFeaturesVec.end()) Features["mmx"] = true; // Enable xsave if avx is enabled and xsave is not explicitly disabled. I = Features.find("avx"); if (I != Features.end() && I->getValue() && - llvm::find(FeaturesVec, "-xsave") == FeaturesVec.end()) + llvm::find(UpdatedFeaturesVec, "-xsave") == UpdatedFeaturesVec.end()) Features["xsave"] = true; return true; @@ -467,6 +480,7 @@ void X86TargetInfo::getTargetDefines(const LangOptions &Opts, case CK_Cooperlake: case CK_Cannonlake: case CK_IcelakeClient: + case CK_Rocketlake: case CK_IcelakeServer: case CK_Tigerlake: case CK_SapphireRapids: @@ -513,10 +527,11 @@ void X86TargetInfo::getTargetDefines(const LangOptions &Opts, case CK_K8: case CK_K8SSE3: case CK_x86_64: + defineCPUMacros(Builder, "k8"); + break; case CK_x86_64_v2: case CK_x86_64_v3: case CK_x86_64_v4: - defineCPUMacros(Builder, "k8"); break; case CK_AMDFAM10: defineCPUMacros(Builder, "amdfam10"); @@ -864,6 +879,7 @@ bool X86TargetInfo::isValidFeatureName(StringRef Name) const { .Case("fma4", true) .Case("fsgsbase", true) .Case("fxsr", true) + .Case("general-regs-only", true) .Case("gfni", true) .Case("hreset", true) .Case("invpcid", true) @@ -1314,6 +1330,7 @@ Optional<unsigned> X86TargetInfo::getCPUCacheLineSize() const { case CK_Tigerlake: case CK_SapphireRapids: case CK_IcelakeClient: + case CK_Rocketlake: case CK_IcelakeServer: case CK_Alderlake: case CK_KNL: @@ -1396,13 +1413,13 @@ bool X86TargetInfo::validateOperandSize(const llvm::StringMap<bool> &FeatureMap, return Size <= 64; case 'z': // XMM0/YMM/ZMM0 - if (FeatureMap.lookup("avx512f")) + if (hasFeatureEnabled(FeatureMap, "avx512f")) // ZMM0 can be used if target supports AVX512F. return Size <= 512U; - else if (FeatureMap.lookup("avx")) + else if (hasFeatureEnabled(FeatureMap, "avx")) // YMM0 can be used if target supports AVX. return Size <= 256U; - else if (FeatureMap.lookup("sse")) + else if (hasFeatureEnabled(FeatureMap, "sse")) return Size <= 128U; return false; case 'i': @@ -1416,10 +1433,10 @@ bool X86TargetInfo::validateOperandSize(const llvm::StringMap<bool> &FeatureMap, break; case 'v': case 'x': - if (FeatureMap.lookup("avx512f")) + if (hasFeatureEnabled(FeatureMap, "avx512f")) // 512-bit zmm registers can be used if target supports AVX512F. return Size <= 512U; - else if (FeatureMap.lookup("avx")) + else if (hasFeatureEnabled(FeatureMap, "avx")) // 256-bit ymm registers can be used if target supports AVX. return Size <= 256U; return Size <= 128U; diff --git a/clang/lib/Basic/Targets/X86.h b/clang/lib/Basic/Targets/X86.h index 91a365c7d405..fcaaf50624e9 100644 --- a/clang/lib/Basic/Targets/X86.h +++ b/clang/lib/Basic/Targets/X86.h @@ -35,6 +35,11 @@ static const unsigned X86AddrSpaceMap[] = { 0, // cuda_device 0, // cuda_constant 0, // cuda_shared + 0, // sycl_global + 0, // sycl_global_device + 0, // sycl_global_host + 0, // sycl_local + 0, // sycl_private 270, // ptr32_sptr 271, // ptr32_uptr 272 // ptr64 @@ -333,6 +338,10 @@ public: bool setFPMath(StringRef Name) override; + bool supportsExtendIntArgs() const override { + return getTriple().getArch() != llvm::Triple::x86; + } + CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { // Most of the non-ARM calling conventions are i386 conventions. switch (CC) { @@ -348,11 +357,15 @@ public: case CC_IntelOclBicc: case CC_OpenCLKernel: return CCCR_OK; + case CC_SwiftAsync: + return CCCR_Error; default: return CCCR_Warning; } } + bool checkArithmeticFenceSupported() const override { return true; } + CallingConv getDefaultCallingConv() const override { return CC_C; } @@ -383,11 +396,13 @@ public: LongDoubleWidth = 96; LongDoubleAlign = 32; SuitableAlign = 128; - resetDataLayout(Triple.isOSBinFormatMachO() ? - "e-m:o-p:32:32-p270:32:32-p271:32:32-p272:64:64-f64:32:64-" - "f80:32-n8:16:32-S128" : - "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-f64:32:64-" - "f80:32-n8:16:32-S128"); + resetDataLayout( + Triple.isOSBinFormatMachO() + ? "e-m:o-p:32:32-p270:32:32-p271:32:32-p272:64:64-f64:32:64-" + "f80:32-n8:16:32-S128" + : "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-f64:32:64-" + "f80:32-n8:16:32-S128", + Triple.isOSBinFormatMachO() ? "_" : ""); SizeType = UnsignedInt; PtrDiffType = SignedInt; IntPtrType = SignedInt; @@ -491,7 +506,7 @@ public: SizeType = UnsignedLong; IntPtrType = SignedLong; resetDataLayout("e-m:o-p:32:32-p270:32:32-p271:32:32-p272:64:64-f64:32:64-" - "f80:128-n8:16:32-S128"); + "f80:128-n8:16:32-S128", "_"); HasAlignMac68kSupport = true; } @@ -519,7 +534,8 @@ public: resetDataLayout(IsWinCOFF ? "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:" "64-i64:64-f80:32-n8:16:32-a:0:32-S32" : "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:" - "64-i64:64-f80:32-n8:16:32-a:0:32-S32"); + "64-i64:64-f80:32-n8:16:32-a:0:32-S32", + IsWinCOFF ? "_" : ""); } }; @@ -568,7 +584,8 @@ public: this->WCharType = TargetInfo::UnsignedShort; DoubleAlign = LongLongAlign = 64; resetDataLayout("e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:" - "32-n8:16:32-a:0:32-S32"); + "32-n8:16:32-a:0:32-S32", + "_"); } void getTargetDefines(const LangOptions &Opts, @@ -648,7 +665,7 @@ class LLVM_LIBRARY_VISIBILITY X86_64TargetInfo : public X86TargetInfo { public: X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : X86TargetInfo(Triple, Opts) { - const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32; + const bool IsX32 = getTriple().isX32(); bool IsWinCOFF = getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF(); LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64; @@ -702,6 +719,7 @@ public: switch (CC) { case CC_C: case CC_Swift: + case CC_SwiftAsync: case CC_X86VectorCall: case CC_IntelOclBicc: case CC_Win64: @@ -783,6 +801,7 @@ public: case CC_PreserveAll: case CC_X86_64SysV: case CC_Swift: + case CC_SwiftAsync: case CC_X86RegCall: case CC_OpenCLKernel: return CCCR_OK; @@ -863,7 +882,7 @@ public: if (T.isiOS()) UseSignedCharForObjCBool = false; resetDataLayout("e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:" - "16:32:64-S128"); + "16:32:64-S128", "_"); } bool handleTargetFeatures(std::vector<std::string> &Features, diff --git a/clang/lib/Basic/Targets/XCore.cpp b/clang/lib/Basic/Targets/XCore.cpp index da614f10e338..ba64f15f3394 100644 --- a/clang/lib/Basic/Targets/XCore.cpp +++ b/clang/lib/Basic/Targets/XCore.cpp @@ -28,6 +28,7 @@ const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = { void XCoreTargetInfo::getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const { + Builder.defineMacro("__xcore__"); Builder.defineMacro("__XS1B__"); } diff --git a/clang/lib/Basic/XRayInstr.cpp b/clang/lib/Basic/XRayInstr.cpp index 79052e05860e..822e14bbb622 100644 --- a/clang/lib/Basic/XRayInstr.cpp +++ b/clang/lib/Basic/XRayInstr.cpp @@ -11,6 +11,7 @@ //===----------------------------------------------------------------------===// #include "clang/Basic/XRayInstr.h" +#include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringSwitch.h" namespace clang { @@ -30,4 +31,30 @@ XRayInstrMask parseXRayInstrValue(StringRef Value) { return ParsedKind; } +void serializeXRayInstrValue(XRayInstrSet Set, + SmallVectorImpl<StringRef> &Values) { + if (Set.Mask == XRayInstrKind::All) { + Values.push_back("all"); + return; + } + + if (Set.Mask == XRayInstrKind::None) { + Values.push_back("none"); + return; + } + + if (Set.has(XRayInstrKind::Custom)) + Values.push_back("custom"); + + if (Set.has(XRayInstrKind::Typed)) + Values.push_back("typed"); + + if (Set.has(XRayInstrKind::FunctionEntry) && + Set.has(XRayInstrKind::FunctionExit)) + Values.push_back("function"); + else if (Set.has(XRayInstrKind::FunctionEntry)) + Values.push_back("function-entry"); + else if (Set.has(XRayInstrKind::FunctionExit)) + Values.push_back("function-exit"); +} } // namespace clang |
