205 lines
6.9 KiB
Diff
205 lines
6.9 KiB
Diff
|
From 8e1dffa5203439996d6c461485cad566ec321884 Mon Sep 17 00:00:00 2001
|
||
|
From: Ikey Doherty <ikey@serpentos.com>
|
||
|
Date: Mon, 22 May 2023 10:53:55 +0100
|
||
|
Subject: [PATCH] For LLVM >= 16, use std::optional APIs
|
||
|
|
||
|
Unfortunately when building with LLVM < 15, we're using C++-11,
|
||
|
so the std::optional bits are only available in C++-17.
|
||
|
|
||
|
Even more unfortunately we can't really override this, rather
|
||
|
inherit the fact of using C++-17 when using LLVM > 16.
|
||
|
|
||
|
Thus, we add a slightly messy conditional compilation situation
|
||
|
to allow usage of LDC on older LLVM versions, and with newer
|
||
|
LLVM/libcxx.
|
||
|
|
||
|
Signed-off-by: Ikey Doherty <ikey@serpentos.com>
|
||
|
---
|
||
|
driver/args.cpp | 4 ++++
|
||
|
driver/linker.cpp | 4 ++++
|
||
|
driver/linker.h | 4 ++++
|
||
|
gen/dcompute/druntime.cpp | 7 ++++++-
|
||
|
gen/dibuilder.cpp | 21 +++++++++++++++++++++
|
||
|
gen/optimizer.cpp | 5 +++++
|
||
|
gen/uda.cpp | 4 ++++
|
||
|
utils/not.cpp | 4 ++++
|
||
|
8 files changed, 52 insertions(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/driver/args.cpp b/driver/args.cpp
|
||
|
index da291202d1..bad8e45dee 100644
|
||
|
--- a/driver/args.cpp
|
||
|
+++ b/driver/args.cpp
|
||
|
@@ -175,7 +175,11 @@ int executeAndWait(std::vector<const char *> fullArgs,
|
||
|
}
|
||
|
|
||
|
const std::vector<llvm::StringRef> argv = toRefsVector(fullArgs);
|
||
|
+#if LDC_LLVM_VER < 1600
|
||
|
auto envVars = llvm::None;
|
||
|
+#else
|
||
|
+ auto envVars = std::nullopt;
|
||
|
+#endif
|
||
|
|
||
|
return llvm::sys::ExecuteAndWait(argv[0], argv, envVars, {}, 0, 0, errorMsg);
|
||
|
}
|
||
|
diff --git a/driver/linker.cpp b/driver/linker.cpp
|
||
|
index 76266379d2..803d5e883e 100644
|
||
|
--- a/driver/linker.cpp
|
||
|
+++ b/driver/linker.cpp
|
||
|
@@ -195,7 +195,11 @@ static std::vector<std::string> getDefaultLibNames() {
|
||
|
llvm::Optional<std::vector<std::string>> getExplicitPlatformLibs() {
|
||
|
if (platformLib.getNumOccurrences() > 0)
|
||
|
return parseLibNames(platformLib);
|
||
|
+#if LDC_LLVM_VER < 1600
|
||
|
return llvm::None;
|
||
|
+#else
|
||
|
+ return std::nullopt;
|
||
|
+#endif
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
diff --git a/driver/linker.h b/driver/linker.h
|
||
|
index f962054efa..28362d8652 100644
|
||
|
--- a/driver/linker.h
|
||
|
+++ b/driver/linker.h
|
||
|
@@ -42,7 +42,11 @@ bool linkAgainstSharedDefaultLibs();
|
||
|
/**
|
||
|
* Returns the -platformlib library names, if specified.
|
||
|
*/
|
||
|
+#if LDC_LLVM_VER < 1600
|
||
|
llvm::Optional<std::vector<std::string>> getExplicitPlatformLibs();
|
||
|
+#else
|
||
|
+std::optional<std::vector<std::string>> getExplicitPlatformLibs();
|
||
|
+#endif
|
||
|
|
||
|
/**
|
||
|
* Returns the value of -mscrtlib.
|
||
|
diff --git a/gen/dcompute/druntime.cpp b/gen/dcompute/druntime.cpp
|
||
|
index 6867765466..aee93f4c53 100644
|
||
|
--- a/gen/dcompute/druntime.cpp
|
||
|
+++ b/gen/dcompute/druntime.cpp
|
||
|
@@ -42,8 +42,13 @@ bool isFromLDC_OpenCL(Dsymbol *sym) {
|
||
|
}
|
||
|
|
||
|
llvm::Optional<DcomputePointer> toDcomputePointer(StructDeclaration *sd) {
|
||
|
- if (sd->ident != Id::dcPointer || !isFromLDC_DCompute(sd))
|
||
|
+ if (sd->ident != Id::dcPointer || !isFromLDC_DCompute(sd)) {
|
||
|
+#if LDC_LLVM_VER < 1600
|
||
|
return llvm::Optional<DcomputePointer>(llvm::None);
|
||
|
+#else
|
||
|
+ return std::optional<DcomputePointer>(std::nullopt);
|
||
|
+#endif
|
||
|
+ }
|
||
|
|
||
|
TemplateInstance *ti = sd->isInstantiated();
|
||
|
int addrspace = isExpression((*ti->tiargs)[0])->toInteger();
|
||
|
diff --git a/gen/dibuilder.cpp b/gen/dibuilder.cpp
|
||
|
index 1e817ee3f4..f7068294dd 100644
|
||
|
--- a/gen/dibuilder.cpp
|
||
|
+++ b/gen/dibuilder.cpp
|
||
|
@@ -372,7 +372,11 @@ DIType DIBuilder::CreateEnumType(TypeEnum *type) {
|
||
|
DIType DIBuilder::CreatePointerType(TypePointer *type) {
|
||
|
// TODO: The addressspace is important for dcompute targets. See e.g.
|
||
|
// https://www.mail-archive.com/dwarf-discuss@lists.dwarfstd.org/msg00326.html
|
||
|
+#if LDC_LLVM_VER < 1600
|
||
|
const llvm::Optional<unsigned> DWARFAddressSpace = llvm::None;
|
||
|
+#else
|
||
|
+ const std::optional<unsigned> DWARFAddressSpace = std::nullopt;
|
||
|
+#endif
|
||
|
|
||
|
const auto name = processDIName(type->toPrettyChars(true));
|
||
|
|
||
|
@@ -730,7 +734,11 @@ DISubroutineType DIBuilder::CreateFunctionType(Type *type) {
|
||
|
}
|
||
|
|
||
|
DISubroutineType DIBuilder::CreateEmptyFunctionType() {
|
||
|
+#if LDC_LLVM_VER < 1600
|
||
|
auto paramsArray = DBuilder.getOrCreateTypeArray(llvm::None);
|
||
|
+#else
|
||
|
+ auto paramsArray = DBuilder.getOrCreateTypeArray(std::nullopt);
|
||
|
+#endif
|
||
|
return DBuilder.createSubroutineType(paramsArray);
|
||
|
}
|
||
|
|
||
|
@@ -774,9 +782,16 @@ DIType DIBuilder::CreateTypeDescription(Type *t, bool voidToUbyte) {
|
||
|
return nullptr;
|
||
|
if (t->ty == TY::Tnull) {
|
||
|
// display null as void*
|
||
|
+#if LDC_LLVM_VER < 1600
|
||
|
return DBuilder.createPointerType(
|
||
|
CreateTypeDescription(Type::tvoid), target.ptrsize * 8, 0,
|
||
|
/* DWARFAddressSpace */ llvm::None, "typeof(null)");
|
||
|
+#else
|
||
|
+ return DBuilder.createPointerType(
|
||
|
+ CreateTypeDescription(Type::tvoid), target.ptrsize * 8, 0,
|
||
|
+ /* DWARFAddressSpace */ std::nullopt, "typeof(null)");
|
||
|
+#endif
|
||
|
+
|
||
|
}
|
||
|
if (auto te = t->isTypeEnum())
|
||
|
return CreateEnumType(te);
|
||
|
@@ -798,8 +813,14 @@ DIType DIBuilder::CreateTypeDescription(Type *t, bool voidToUbyte) {
|
||
|
const auto aggregateDIType = CreateCompositeType(t);
|
||
|
const auto name =
|
||
|
(tc->sym->toPrettyChars(true) + llvm::StringRef("*")).str();
|
||
|
+#if LDC_LLVM_VER < 1600
|
||
|
return DBuilder.createPointerType(aggregateDIType, target.ptrsize * 8, 0,
|
||
|
llvm::None, processDIName(name));
|
||
|
+#else
|
||
|
+ return DBuilder.createPointerType(aggregateDIType, target.ptrsize * 8, 0,
|
||
|
+ std::nullopt, processDIName(name));
|
||
|
+#endif
|
||
|
+
|
||
|
}
|
||
|
if (auto tf = t->isTypeFunction())
|
||
|
return CreateFunctionType(tf);
|
||
|
diff --git a/gen/optimizer.cpp b/gen/optimizer.cpp
|
||
|
index 86146bf6f3..13bad60a04 100644
|
||
|
--- a/gen/optimizer.cpp
|
||
|
+++ b/gen/optimizer.cpp
|
||
|
@@ -572,8 +572,13 @@ static llvm::Optional<PGOOptions> getPGOOptions() {
|
||
|
PGOOptions::CSPGOAction::NoCSAction,
|
||
|
debugInfoForProfiling, pseudoProbeForProfiling);
|
||
|
}
|
||
|
+#if LDC_LLVM_VER < 1600
|
||
|
return None;
|
||
|
+#else
|
||
|
+ return std::nullopt;
|
||
|
+#endif
|
||
|
}
|
||
|
+
|
||
|
static PipelineTuningOptions getPipelineTuningOptions(unsigned optLevelVal, unsigned sizeLevelVal) {
|
||
|
PipelineTuningOptions pto;
|
||
|
|
||
|
diff --git a/gen/uda.cpp b/gen/uda.cpp
|
||
|
index 371b565b38..521205c5da 100644
|
||
|
--- a/gen/uda.cpp
|
||
|
+++ b/gen/uda.cpp
|
||
|
@@ -219,7 +219,11 @@ void applyAttrAllocSize(StructLiteralExp *sle, IrFunction *irFunc) {
|
||
|
if (numArgIdx >= 0) {
|
||
|
builder.addAllocSizeAttr(llvmSizeIdx, llvmNumIdx);
|
||
|
} else {
|
||
|
+#if LDC_LLVM_VER < 1600
|
||
|
builder.addAllocSizeAttr(llvmSizeIdx, llvm::Optional<unsigned>());
|
||
|
+#else
|
||
|
+ builder.addAllocSizeAttr(llvmSizeIdx, std::optional<unsigned>());
|
||
|
+#endif
|
||
|
}
|
||
|
|
||
|
llvm::Function *func = irFunc->getLLVMFunc();
|
||
|
diff --git a/utils/not.cpp b/utils/not.cpp
|
||
|
index b434af7331..7ca8d1d8a6 100644
|
||
|
--- a/utils/not.cpp
|
||
|
+++ b/utils/not.cpp
|
||
|
@@ -43,7 +43,11 @@ int main(int argc, const char **argv) {
|
||
|
Argv.reserve(argc);
|
||
|
for (int i = 0; i < argc; ++i)
|
||
|
Argv.push_back(argv[i]);
|
||
|
+#if LDC_LLVM_VER < 1600
|
||
|
auto Env = llvm::None;
|
||
|
+#else
|
||
|
+ auto Env = std::nullopt;
|
||
|
+#endif
|
||
|
|
||
|
std::string ErrMsg;
|
||
|
int Result = sys::ExecuteAndWait(*Program, Argv, Env, {}, 0, 0, &ErrMsg);
|