https://github.com/mati865 created https://github.com/llvm/llvm-project/pull/134458
This is part of the fixes from https://github.com/mati865/llvm-project/commits/cygwin-more-fixes/ that I consider good enough to upstream. The other branch with hacky changes even goes as far as making Clang successfully build LLVM+LLD+itself (although it still calls GCC for linking), but it would take a lot more work that I'm not planning to do. From 7f22b8f408e25fcdb239343043d157dcfe05d270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miku=C5=82a?= <o...@mateuszmikula.dev> Date: Sat, 8 Feb 2025 01:13:06 +0100 Subject: [PATCH 1/5] [Clang][Cygwin] Enable few conditions that are shared with MinGW --- clang/lib/AST/ItaniumCXXABI.cpp | 2 +- clang/lib/AST/RecordLayoutBuilder.cpp | 2 +- clang/lib/CodeGen/CodeGenModule.cpp | 2 +- clang/lib/CodeGen/ItaniumCXXABI.cpp | 4 ++-- clang/lib/CodeGen/Targets/X86.cpp | 2 +- clang/lib/Driver/ToolChain.cpp | 2 +- clang/lib/Sema/SemaDecl.cpp | 2 +- clang/lib/Sema/SemaDeclCXX.cpp | 4 ++-- clang/lib/Sema/SemaTemplate.cpp | 8 ++++---- 9 files changed, 14 insertions(+), 14 deletions(-) diff --git a/clang/lib/AST/ItaniumCXXABI.cpp b/clang/lib/AST/ItaniumCXXABI.cpp index a1b2551419f5e..d866f6023e146 100644 --- a/clang/lib/AST/ItaniumCXXABI.cpp +++ b/clang/lib/AST/ItaniumCXXABI.cpp @@ -236,7 +236,7 @@ class ItaniumCXXABI : public CXXABI { CallingConv getDefaultMethodCallConv(bool isVariadic) const override { const llvm::Triple &T = Context.getTargetInfo().getTriple(); - if (!isVariadic && T.isWindowsGNUEnvironment() && + if (!isVariadic && T.isOSCygMing() && T.getArch() == llvm::Triple::x86) return CC_X86ThisCall; return Context.getTargetInfo().getDefaultCallingConv(); diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index 3e756ab9b9bfe..43b54850598af 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -1950,7 +1950,7 @@ void ItaniumRecordLayoutBuilder::LayoutField(const FieldDecl *D, // silently there. For other targets that have ms_struct enabled // (most probably via a pragma or attribute), trigger a diagnostic // that defaults to an error. - if (!Context.getTargetInfo().getTriple().isWindowsGNUEnvironment()) + if (!Context.getTargetInfo().getTriple().isOSCygMing()) Diag(D->getLocation(), diag::warn_npot_ms_struct); } if (TypeSize > FieldAlign && diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 8f9cf965af2b9..f4cf4f8ae7c0d 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -1680,7 +1680,7 @@ static bool shouldAssumeDSOLocal(const CodeGenModule &CGM, const llvm::Triple &TT = CGM.getTriple(); const auto &CGOpts = CGM.getCodeGenOpts(); - if (TT.isWindowsGNUEnvironment()) { + if (TT.isOSCygMing()) { // In MinGW, variables without DLLImport can still be automatically // imported from a DLL by the linker; don't mark variables that // potentially could come from another DLL as DSO local. diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index 2822d526a54b0..f8c63d185a24a 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -3757,7 +3757,7 @@ static bool ShouldUseExternalRTTIDescriptor(CodeGenModule &CGM, bool IsDLLImport = RD->hasAttr<DLLImportAttr>(); // Don't import the RTTI but emit it locally. - if (CGM.getTriple().isWindowsGNUEnvironment()) + if (CGM.getTriple().isOSCygMing()) return false; if (CGM.getVTables().isVTableExternal(RD)) { @@ -4047,7 +4047,7 @@ static llvm::GlobalVariable::LinkageTypes getTypeInfoLinkage(CodeGenModule &CGM, !CGM.getContext() .getTargetInfo() .getTriple() - .isWindowsGNUEnvironment()) + .isOSCygMing()) return CGM.getVTableLinkage(RD); } diff --git a/clang/lib/CodeGen/Targets/X86.cpp b/clang/lib/CodeGen/Targets/X86.cpp index b36a6e1396653..cb09c52856744 100644 --- a/clang/lib/CodeGen/Targets/X86.cpp +++ b/clang/lib/CodeGen/Targets/X86.cpp @@ -1391,7 +1391,7 @@ class WinX86_64ABIInfo : public ABIInfo { public: WinX86_64ABIInfo(CodeGen::CodeGenTypes &CGT, X86AVXABILevel AVXLevel) : ABIInfo(CGT), AVXLevel(AVXLevel), - IsMingw64(getTarget().getTriple().isWindowsGNUEnvironment()) {} + IsMingw64(getTarget().getTriple().isOSCygMing()) {} void computeInfo(CGFunctionInfo &FI) const override; diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 36d0ae34dec86..26d7311227327 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -745,7 +745,7 @@ std::string ToolChain::buildCompilerRTBasename(const llvm::opt::ArgList &Args, break; case ToolChain::FT_Shared: Suffix = TT.isOSWindows() - ? (TT.isWindowsGNUEnvironment() ? ".dll.a" : ".lib") + ? (TT.isOSCygMing() ? ".dll.a" : ".lib") : ".so"; break; } diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index d630f9bd409fd..351d3a4ee74d9 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -12536,7 +12536,7 @@ static bool isDefaultStdCall(FunctionDecl *FD, Sema &S) { // Default calling convention for MinGW is __cdecl const llvm::Triple &T = S.Context.getTargetInfo().getTriple(); - if (T.isWindowsGNUEnvironment()) + if (T.isOSCygMing()) return false; // Default calling convention for WinMain, wWinMain and DllMain diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 07379c6876731..e201e1e7ae0ed 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -6272,7 +6272,7 @@ static void ReferenceDllExportedMembers(Sema &S, CXXRecordDecl *Class) { } } MarkingDllexportedContext(S, Class, ClassAttr->getLocation()); - if (S.Context.getTargetInfo().getTriple().isWindowsGNUEnvironment()) + if (S.Context.getTargetInfo().getTriple().isOSCygMing()) S.MarkVTableUsed(Class->getLocation(), Class, true); for (Decl *Member : Class->decls()) { @@ -6574,7 +6574,7 @@ void Sema::checkClassLevelDLLAttribute(CXXRecordDecl *Class) { // declarations, except in MinGW mode. if (ClassExported && !ClassAttr->isInherited() && TSK == TSK_ExplicitInstantiationDeclaration && - !Context.getTargetInfo().getTriple().isWindowsGNUEnvironment()) { + !Context.getTargetInfo().getTriple().isOSCygMing()) { Class->dropAttr<DLLExportAttr>(); return; } diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 153f44f8ec67a..32a3eea78c4da 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -8890,7 +8890,7 @@ Sema::CheckSpecializationInstantiationRedecl(SourceLocation NewLoc, // still okay to specialize it. StripImplicitInstantiation( PrevDecl, - Context.getTargetInfo().getTriple().isWindowsGNUEnvironment()); + Context.getTargetInfo().getTriple().isOSCygMing()); return false; } // Fall through @@ -9758,7 +9758,7 @@ DeclResult Sema::ActOnExplicitInstantiation( : TSK_ExplicitInstantiationDeclaration; if (TSK == TSK_ExplicitInstantiationDeclaration && - !Context.getTargetInfo().getTriple().isWindowsGNUEnvironment()) { + !Context.getTargetInfo().getTriple().isOSCygMing()) { // Check for dllexport class template instantiation declarations, // except for MinGW mode. for (const ParsedAttr &AL : Attr) { @@ -9823,7 +9823,7 @@ DeclResult Sema::ActOnExplicitInstantiation( = PrevDecl ? PrevDecl->getTemplateSpecializationKind() : TSK_Undeclared; if (TSK == TSK_ExplicitInstantiationDefinition && PrevDecl != nullptr && - Context.getTargetInfo().getTriple().isWindowsGNUEnvironment()) { + Context.getTargetInfo().getTriple().isOSCygMing()) { // Check for dllexport class template instantiation definitions in MinGW // mode, if a previous declaration of the instantiation was seen. for (const ParsedAttr &AL : Attr) { @@ -9991,7 +9991,7 @@ DeclResult Sema::ActOnExplicitInstantiation( // In MinGW mode, export the template instantiation if the declaration // was marked dllexport. if (PrevDecl_TSK == TSK_ExplicitInstantiationDeclaration && - Context.getTargetInfo().getTriple().isWindowsGNUEnvironment() && + Context.getTargetInfo().getTriple().isOSCygMing() && PrevDecl->hasAttr<DLLExportAttr>()) { dllExportImportClassTemplateSpecialization(*this, Def); } From e36be5aa3d64c049f7e777d5f33a1436cb14dea3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miku=C5=82a?= <o...@mateuszmikula.dev> Date: Sat, 8 Feb 2025 01:23:32 +0100 Subject: [PATCH 2/5] [Clang][Cygwin] Enable TLS --- clang/lib/Basic/Targets/X86.h | 1 - 1 file changed, 1 deletion(-) diff --git a/clang/lib/Basic/Targets/X86.h b/clang/lib/Basic/Targets/X86.h index 205edcab9ccb3..7ca2952f73451 100644 --- a/clang/lib/Basic/Targets/X86.h +++ b/clang/lib/Basic/Targets/X86.h @@ -948,7 +948,6 @@ class LLVM_LIBRARY_VISIBILITY CygwinX86_64TargetInfo : public X86_64TargetInfo { CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : X86_64TargetInfo(Triple, Opts) { this->WCharType = TargetInfo::UnsignedShort; - TLSSupported = false; } void getTargetDefines(const LangOptions &Opts, From 962ca19ded3d98e7fe3b51a876ee40f0e9dd8eb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miku=C5=82a?= <o...@mateuszmikula.dev> Date: Sat, 8 Feb 2025 13:57:49 +0100 Subject: [PATCH 3/5] [Clang][Cygwin] Fix symbol visibility definition --- clang/include/clang/Support/Compiler.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/include/clang/Support/Compiler.h b/clang/include/clang/Support/Compiler.h index 5a74f8e3b6723..e1ae3eda4ccc2 100644 --- a/clang/include/clang/Support/Compiler.h +++ b/clang/include/clang/Support/Compiler.h @@ -50,7 +50,7 @@ #define CLANG_EXPORT_TEMPLATE #endif #elif defined(__ELF__) || defined(__MINGW32__) || defined(_AIX) || \ - defined(__MVS__) + defined(__MVS__) || defined(__CYGWIN__) #define CLANG_ABI LLVM_ATTRIBUTE_VISIBILITY_DEFAULT #define CLANG_TEMPLATE_ABI LLVM_ATTRIBUTE_VISIBILITY_DEFAULT #define CLANG_EXPORT_TEMPLATE From 3066e9fb51a9831b37ef6f4142ce5212b327647a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miku=C5=82a?= <o...@mateuszmikula.dev> Date: Fri, 4 Apr 2025 20:12:21 +0200 Subject: [PATCH 4/5] [LLVM][Cygwin] Fix symbol visibility definition --- llvm/cmake/modules/AddLLVM.cmake | 2 +- llvm/include/llvm/Support/Compiler.h | 4 ++-- llvm/lib/Target/CMakeLists.txt | 2 +- llvm/tools/llvm-shlib/CMakeLists.txt | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake index 39f0e28a249d3..66462dc328dd0 100644 --- a/llvm/cmake/modules/AddLLVM.cmake +++ b/llvm/cmake/modules/AddLLVM.cmake @@ -666,7 +666,7 @@ function(llvm_add_library name) # When building shared objects for each target there are some internal APIs # that are used across shared objects which we can't hide. if (LLVM_BUILD_LLVM_DYLIB_VIS AND NOT BUILD_SHARED_LIBS AND NOT APPLE AND - (NOT (WIN32 OR CYGWIN) OR (MINGW AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")) AND + (NOT (WIN32 OR CYGWIN) OR ((MINGW OR CYGWIN) AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")) AND NOT (${CMAKE_SYSTEM_NAME} MATCHES "AIX") AND NOT DEFINED CMAKE_CXX_VISIBILITY_PRESET) diff --git a/llvm/include/llvm/Support/Compiler.h b/llvm/include/llvm/Support/Compiler.h index d3772896069cc..5499f91137339 100644 --- a/llvm/include/llvm/Support/Compiler.h +++ b/llvm/include/llvm/Support/Compiler.h @@ -129,7 +129,7 @@ #endif #if (!(defined(_WIN32) || defined(__CYGWIN__)) || \ - (defined(__MINGW32__) && defined(__clang__))) + ((defined(__MINGW32__) || defined (__CYGWIN__)) && defined(__clang__))) #define LLVM_LIBRARY_VISIBILITY LLVM_ATTRIBUTE_VISIBILITY_HIDDEN // Clang compilers older then 15 do not support gnu style attributes on // namespaces. @@ -198,7 +198,7 @@ #endif #define LLVM_ABI_EXPORT __declspec(dllexport) #elif defined(__ELF__) || defined(__MINGW32__) || defined(_AIX) || \ - defined(__MVS__) + defined(__MVS__) || defined(__CYGWIN__) #define LLVM_ABI LLVM_ATTRIBUTE_VISIBILITY_DEFAULT #define LLVM_TEMPLATE_ABI LLVM_ATTRIBUTE_VISIBILITY_DEFAULT #define LLVM_EXPORT_TEMPLATE diff --git a/llvm/lib/Target/CMakeLists.txt b/llvm/lib/Target/CMakeLists.txt index 9472288229cac..f5f6f5386f899 100644 --- a/llvm/lib/Target/CMakeLists.txt +++ b/llvm/lib/Target/CMakeLists.txt @@ -22,7 +22,7 @@ add_llvm_component_library(LLVMTarget # When building shared objects for each target there are some internal APIs # that are used across shared objects which we can't hide. if (NOT BUILD_SHARED_LIBS AND NOT APPLE AND - (NOT (WIN32 OR CYGWIN) OR (MINGW AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")) AND + (NOT (WIN32 OR CYGWIN) OR ((MINGW OR CYGWIN) AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")) AND NOT (${CMAKE_SYSTEM_NAME} MATCHES "AIX") AND NOT DEFINED CMAKE_CXX_VISIBILITY_PRESET) # Set default visibility to hidden, so we don't export all the Target classes diff --git a/llvm/tools/llvm-shlib/CMakeLists.txt b/llvm/tools/llvm-shlib/CMakeLists.txt index a5b0cab0f1ce5..05551dc57402a 100644 --- a/llvm/tools/llvm-shlib/CMakeLists.txt +++ b/llvm/tools/llvm-shlib/CMakeLists.txt @@ -66,11 +66,11 @@ if(LLVM_BUILD_LLVM_DYLIB) else() # GNU ld doesn't resolve symbols in the version script. set(LIB_NAMES -Wl,--whole-archive ${LIB_NAMES} -Wl,--no-whole-archive) - if (NOT LLVM_LINKER_IS_SOLARISLD AND NOT MINGW) + if (NOT LLVM_LINKER_IS_SOLARISLD AND NOT (MINGW OR CYGWIN)) # Solaris ld does not accept global: *; so there is no way to version *all* global symbols set(LIB_NAMES -Wl,--version-script,${LLVM_LIBRARY_DIR}/tools/llvm-shlib/simple_version_script.map ${LIB_NAMES}) endif() - if (NOT MINGW AND NOT LLVM_LINKER_IS_SOLARISLD_ILLUMOS) + if (NOT (MINGW OR CYGWIN) AND NOT LLVM_LINKER_IS_SOLARISLD_ILLUMOS) # Optimize function calls for default visibility definitions to avoid PLT and # reduce dynamic relocations. # Note: for -fno-pic default, the address of a function may be different from From 31b30d090f77fac2b489318fe0dba31e371c8a38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miku=C5=82a?= <o...@mateuszmikula.dev> Date: Fri, 4 Apr 2025 21:41:50 +0200 Subject: [PATCH 5/5] [Clang][Cygwin] Remove erroneous define --- clang/tools/libclang/CIndexer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/clang/tools/libclang/CIndexer.cpp b/clang/tools/libclang/CIndexer.cpp index 12d9d418dea51..1b9d58bc439ad 100644 --- a/clang/tools/libclang/CIndexer.cpp +++ b/clang/tools/libclang/CIndexer.cpp @@ -29,7 +29,6 @@ #ifdef __CYGWIN__ #include <cygwin/version.h> #include <sys/cygwin.h> -#define _WIN32 1 #endif #ifdef _WIN32 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits