From 8e1dffa5203439996d6c461485cad566ec321884 Mon Sep 17 00:00:00 2001 From: Ikey Doherty 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 --- 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 fullArgs, } const std::vector 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 getDefaultLibNames() { llvm::Optional> 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> getExplicitPlatformLibs(); +#else +std::optional> 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 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(llvm::None); +#else + return std::optional(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 DWARFAddressSpace = llvm::None; +#else + const std::optional 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 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()); +#else + builder.addAllocSizeAttr(llvmSizeIdx, std::optional()); +#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);