Accepting request 631699 from devel:languages:D
OBS-URL: https://build.opensuse.org/request/show/631699 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/ldc?expand=0&rev=3
This commit is contained in:
commit
0b4bcde1c6
@ -1,10 +0,0 @@
|
|||||||
--- ldc-0.17.5-src.orig/runtime/phobos/etc/c/zlib/gzread.c 2018-05-14 14:41:28.022309026 +0200
|
|
||||||
+++ ldc-0.17.5-src/runtime/phobos/etc/c/zlib/gzread.c 2018-06-01 14:09:53.063607286 +0200
|
|
||||||
@@ -3,6 +3,7 @@
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
+#include <unistd.h>
|
|
||||||
#include "gzguts.h"
|
|
||||||
|
|
||||||
/* Local functions */
|
|
File diff suppressed because it is too large
Load Diff
@ -1,433 +0,0 @@
|
|||||||
From 6ed3ce435845e72ce8c88d39c0f7d3fb950ef54e Mon Sep 17 00:00:00 2001
|
|
||||||
From: Johan Engelen <jbc.engelen@gmail.com>
|
|
||||||
Date: Mon, 18 Sep 2017 23:11:32 +0200
|
|
||||||
Subject: [PATCH] Backport PR #2315.
|
|
||||||
|
|
||||||
The change is to fix debuginfo build errors with Phobos and LLVM5.0. This PR is mostly copy-pasting from master and fixing compile errors, so not much checking whether things make sense or not for LTS.
|
|
||||||
---
|
|
||||||
gen/dibuilder.cpp | 104 ++++++++++++++++++++++++++++++++++++++++++++----------
|
|
||||||
gen/dibuilder.h | 13 +++++--
|
|
||||||
gen/functions.cpp | 11 +++---
|
|
||||||
gen/nested.cpp | 103 ++++++++++++++++++++++++++++-------------------------
|
|
||||||
4 files changed, 159 insertions(+), 72 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/gen/dibuilder.cpp b/gen/dibuilder.cpp
|
|
||||||
index f322811ea..1bc9c47c2 100644
|
|
||||||
--- a/gen/dibuilder.cpp
|
|
||||||
+++ b/gen/dibuilder.cpp
|
|
||||||
@@ -62,7 +62,9 @@ Module *ldc::DIBuilder::getDefinedModule(Dsymbol *s) {
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
ldc::DIBuilder::DIBuilder(IRState *const IR)
|
|
||||||
- : IR(IR), DBuilder(IR->module), CUNode(nullptr) {}
|
|
||||||
+ : IR(IR), DBuilder(IR->module), CUNode(nullptr),
|
|
||||||
+ isTargetMSVCx64(global.params.targetTriple.isWindowsMSVCEnvironment() &&
|
|
||||||
+ global.params.targetTriple.isArch64Bit()) {}
|
|
||||||
|
|
||||||
llvm::LLVMContext &ldc::DIBuilder::getContext() { return IR->context(); }
|
|
||||||
|
|
||||||
@@ -75,7 +77,7 @@ ldc::DIScope ldc::DIBuilder::GetCurrentScope() {
|
|
||||||
return fn->diLexicalBlocks.top();
|
|
||||||
}
|
|
||||||
|
|
||||||
-void ldc::DIBuilder::Declare(const Loc &loc, llvm::Value *var,
|
|
||||||
+void ldc::DIBuilder::Declare(const Loc &loc, llvm::Value *storage,
|
|
||||||
ldc::DILocalVariable divar
|
|
||||||
#if LDC_LLVM_VER >= 306
|
|
||||||
,
|
|
||||||
@@ -83,19 +85,42 @@ void ldc::DIBuilder::Declare(const Loc &loc, llvm::Value *var,
|
|
||||||
#endif
|
|
||||||
) {
|
|
||||||
unsigned charnum = (loc.linnum ? loc.charnum : 0);
|
|
||||||
+ auto debugLoc = llvm::DebugLoc::get(loc.linnum, charnum, GetCurrentScope());
|
|
||||||
#if LDC_LLVM_VER < 307
|
|
||||||
- llvm::Instruction *instr = DBuilder.insertDeclare(var, divar,
|
|
||||||
+ llvm::Instruction *instr = DBuilder.insertDeclare(storage, divar,
|
|
||||||
#if LDC_LLVM_VER >= 306
|
|
||||||
diexpr,
|
|
||||||
#endif
|
|
||||||
IR->scopebb());
|
|
||||||
- instr->setDebugLoc(
|
|
||||||
- llvm::DebugLoc::get(loc.linnum, charnum, GetCurrentScope()));
|
|
||||||
+ instr->setDebugLoc(debugLoc);
|
|
||||||
+#else // if LLVM >= 3.7
|
|
||||||
+ DBuilder.insertDeclare(storage, divar, diexpr, debugLoc, IR->scopebb());
|
|
||||||
+#endif
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+// Sets the (current) value for a debuginfo variable.
|
|
||||||
+void ldc::DIBuilder::SetValue(const Loc &loc, llvm::Value *value,
|
|
||||||
+ ldc::DILocalVariable divar
|
|
||||||
+#if LDC_LLVM_VER >= 306
|
|
||||||
+ ,
|
|
||||||
+ ldc::DIExpression diexpr
|
|
||||||
+#endif
|
|
||||||
+ ) {
|
|
||||||
+ unsigned charnum = (loc.linnum ? loc.charnum : 0);
|
|
||||||
+ auto debugLoc = llvm::DebugLoc::get(loc.linnum, charnum, GetCurrentScope());
|
|
||||||
+#if LDC_LLVM_VER < 307
|
|
||||||
+ llvm::Instruction *instr = DBuilder.insertDbgValueIntrinsic(value, divar,
|
|
||||||
+#if LDC_LLVM_VER >= 306
|
|
||||||
+ diexpr,
|
|
||||||
+#endif
|
|
||||||
+ IR->scopebb());
|
|
||||||
+ instr->setDebugLoc(debugLoc);
|
|
||||||
#else // if LLVM >= 3.7
|
|
||||||
- DBuilder.insertDeclare(
|
|
||||||
- var, divar, diexpr,
|
|
||||||
- llvm::DebugLoc::get(loc.linnum, charnum, GetCurrentScope()),
|
|
||||||
- IR->scopebb());
|
|
||||||
+ DBuilder.insertDbgValueIntrinsic(value,
|
|
||||||
+#if LDC_LLVM_VER < 600
|
|
||||||
+ 0,
|
|
||||||
+#endif
|
|
||||||
+ divar, diexpr, debugLoc, IR->scopebb());
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -852,6 +877,7 @@ void ldc::DIBuilder::EmitValue(llvm::Value *val, VarDeclaration *vd) {
|
|
||||||
|
|
||||||
void ldc::DIBuilder::EmitLocalVariable(llvm::Value *ll, VarDeclaration *vd,
|
|
||||||
Type *type, bool isThisPtr,
|
|
||||||
+ bool forceAsLocal, bool isRefRVal,
|
|
||||||
#if LDC_LLVM_VER >= 306
|
|
||||||
llvm::ArrayRef<int64_t> addr
|
|
||||||
#else
|
|
||||||
@@ -872,13 +898,46 @@ void ldc::DIBuilder::EmitLocalVariable(llvm::Value *ll, VarDeclaration *vd,
|
|
||||||
}
|
|
||||||
|
|
||||||
// get type description
|
|
||||||
- ldc::DIType TD = CreateTypeDescription(type ? type : vd->type, true);
|
|
||||||
+ if (!type)
|
|
||||||
+ type = vd->type;
|
|
||||||
+ ldc::DIType TD = CreateTypeDescription(type, true);
|
|
||||||
if (static_cast<llvm::MDNode *>(TD) == nullptr) {
|
|
||||||
return; // unsupported
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (vd->storage_class & (STCref | STCout)) {
|
|
||||||
+ const bool isRefOrOut = vd->isRef() || vd->isOut(); // incl. special-ref vars
|
|
||||||
+
|
|
||||||
+ // For MSVC x64 targets, declare params rewritten by ExplicitByvalRewrite as
|
|
||||||
+ // DI references, as if they were ref parameters.
|
|
||||||
+ const bool isPassedExplicitlyByval =
|
|
||||||
+ isTargetMSVCx64 && !isRefOrOut && isaArgument(ll) && addr.empty();
|
|
||||||
+
|
|
||||||
+ bool useDbgValueIntrinsic = false;
|
|
||||||
+ if (isRefOrOut || isPassedExplicitlyByval) {
|
|
||||||
+ // With the exception of special-ref loop variables, the reference/pointer
|
|
||||||
+ // itself is constant. So we don't have to attach the debug information to a
|
|
||||||
+ // memory location and can use llvm.dbg.value to set the constant pointer
|
|
||||||
+ // for the DI reference.
|
|
||||||
+ useDbgValueIntrinsic =
|
|
||||||
+ isPassedExplicitlyByval || (!isSpecialRefVar(vd) && isRefRVal);
|
|
||||||
+#if LDC_LLVM_VER >= 308
|
|
||||||
+ // Note: createReferenceType expects the size to be the size of a pointer,
|
|
||||||
+ // not the size of the type the reference refers to.
|
|
||||||
+ TD = DBuilder.createReferenceType(
|
|
||||||
+ llvm::dwarf::DW_TAG_reference_type, TD,
|
|
||||||
+ gDataLayout->getPointerSizeInBits(), // size (bits)
|
|
||||||
+ DtoAlignment(type) * 8); // align (bits)
|
|
||||||
+#else
|
|
||||||
TD = DBuilder.createReferenceType(llvm::dwarf::DW_TAG_reference_type, TD);
|
|
||||||
+#endif
|
|
||||||
+ } else {
|
|
||||||
+ // FIXME: For MSVC x64 targets, declare dynamic array and vector parameters
|
|
||||||
+ // as DI locals to work around garbage for both cdb and VS debuggers.
|
|
||||||
+ if (isTargetMSVCx64) {
|
|
||||||
+ TY ty = type->toBasetype()->ty;
|
|
||||||
+ if (ty == Tarray || ty == Tvector)
|
|
||||||
+ forceAsLocal = true;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
// get variable description
|
|
||||||
@@ -886,7 +945,7 @@ void ldc::DIBuilder::EmitLocalVariable(llvm::Value *ll, VarDeclaration *vd,
|
|
||||||
|
|
||||||
#if LDC_LLVM_VER < 308
|
|
||||||
unsigned tag;
|
|
||||||
- if (vd->isParameter()) {
|
|
||||||
+ if (!forceAsLocal && vd->isParameter()) {
|
|
||||||
tag = llvm::dwarf::DW_TAG_arg_variable;
|
|
||||||
} else {
|
|
||||||
tag = llvm::dwarf::DW_TAG_auto_variable;
|
|
||||||
@@ -930,7 +989,7 @@ void ldc::DIBuilder::EmitLocalVariable(llvm::Value *ll, VarDeclaration *vd,
|
|
||||||
Flags // flags
|
|
||||||
);
|
|
||||||
#else
|
|
||||||
- if (vd->isParameter()) {
|
|
||||||
+ if (!forceAsLocal && vd->isParameter()) {
|
|
||||||
FuncDeclaration *fd = vd->parent->isFuncDeclaration();
|
|
||||||
assert(fd);
|
|
||||||
size_t argNo = 0;
|
|
||||||
@@ -970,14 +1029,23 @@ void ldc::DIBuilder::EmitLocalVariable(llvm::Value *ll, VarDeclaration *vd,
|
|
||||||
#endif
|
|
||||||
variableMap[vd] = debugVariable;
|
|
||||||
|
|
||||||
-// declare
|
|
||||||
+ if (useDbgValueIntrinsic) {
|
|
||||||
#if LDC_LLVM_VER >= 306
|
|
||||||
- Declare(vd->loc, ll, debugVariable, addr.empty()
|
|
||||||
- ? DBuilder.createExpression()
|
|
||||||
- : DBuilder.createExpression(addr));
|
|
||||||
+ SetValue(vd->loc, ll, debugVariable,
|
|
||||||
+ addr.empty() ? DBuilder.createExpression()
|
|
||||||
+ : DBuilder.createExpression(addr));
|
|
||||||
#else
|
|
||||||
- Declare(vd->loc, ll, debugVariable);
|
|
||||||
+ SetValue(vd->loc, ll, debugVariable);
|
|
||||||
#endif
|
|
||||||
+ } else {
|
|
||||||
+#if LDC_LLVM_VER >= 306
|
|
||||||
+ Declare(vd->loc, ll, debugVariable,
|
|
||||||
+ addr.empty() ? DBuilder.createExpression()
|
|
||||||
+ : DBuilder.createExpression(addr));
|
|
||||||
+#else
|
|
||||||
+ Declare(vd->loc, ll, debugVariable);
|
|
||||||
+#endif
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
diff --git a/gen/dibuilder.h b/gen/dibuilder.h
|
|
||||||
index fbfa830da..8fc5dea6c 100644
|
|
||||||
--- a/gen/dibuilder.h
|
|
||||||
+++ b/gen/dibuilder.h
|
|
||||||
@@ -79,6 +79,8 @@ class DIBuilder {
|
|
||||||
const llvm::MDNode *CUNode;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
+ const bool isTargetMSVCx64;
|
|
||||||
+
|
|
||||||
DICompileUnit GetCU() {
|
|
||||||
#if LDC_LLVM_VER >= 307
|
|
||||||
return CUNode;
|
|
||||||
@@ -133,7 +135,8 @@ class DIBuilder {
|
|
||||||
/// \param addr An array of complex address operations.
|
|
||||||
void
|
|
||||||
EmitLocalVariable(llvm::Value *ll, VarDeclaration *vd, Type *type = nullptr,
|
|
||||||
- bool isThisPtr = false,
|
|
||||||
+ bool isThisPtr = false, bool forceAsLocal = false,
|
|
||||||
+ bool isRefRVal = false,
|
|
||||||
#if LDC_LLVM_VER >= 306
|
|
||||||
llvm::ArrayRef<int64_t> addr = llvm::ArrayRef<int64_t>()
|
|
||||||
#else
|
|
||||||
@@ -155,12 +158,18 @@ class DIBuilder {
|
|
||||||
llvm::LLVMContext &getContext();
|
|
||||||
Module *getDefinedModule(Dsymbol *s);
|
|
||||||
DIScope GetCurrentScope();
|
|
||||||
- void Declare(const Loc &loc, llvm::Value *var, ldc::DILocalVariable divar
|
|
||||||
+ void Declare(const Loc &loc, llvm::Value *storage, ldc::DILocalVariable divar
|
|
||||||
#if LDC_LLVM_VER >= 306
|
|
||||||
,
|
|
||||||
ldc::DIExpression diexpr
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
+ void SetValue(const Loc &loc, llvm::Value *value, ldc::DILocalVariable divar
|
|
||||||
+#if LDC_LLVM_VER >= 306
|
|
||||||
+ ,
|
|
||||||
+ ldc::DIExpression diexpr
|
|
||||||
+#endif
|
|
||||||
+ );
|
|
||||||
void AddBaseFields(ClassDeclaration *sd, ldc::DIFile file,
|
|
||||||
#if LDC_LLVM_VER >= 306
|
|
||||||
std::vector<llvm::Metadata *> &elems
|
|
||||||
diff --git a/gen/functions.cpp b/gen/functions.cpp
|
|
||||||
index 796124db4..107779ecd 100644
|
|
||||||
--- a/gen/functions.cpp
|
|
||||||
+++ b/gen/functions.cpp
|
|
||||||
@@ -861,10 +861,13 @@ void DtoDefineFunction(FuncDeclaration *fd) {
|
|
||||||
++llArgIdx;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (global.params.symdebug &&
|
|
||||||
- !(isaArgument(irparam->value) &&
|
|
||||||
- isaArgument(irparam->value)->hasByValAttr())) {
|
|
||||||
- gIR->DBuilder.EmitLocalVariable(irparam->value, vd, debugInfoType);
|
|
||||||
+ // The debuginfos for captured params are handled later by
|
|
||||||
+ // DtoCreateNestedContext().
|
|
||||||
+ if (global.params.symdebug && vd->nestedrefs.dim == 0) {
|
|
||||||
+ // Reference (ref/out) parameters have no storage themselves as they are
|
|
||||||
+ // constant pointers, so pass the reference rvalue to EmitLocalVariable().
|
|
||||||
+ gIR->DBuilder.EmitLocalVariable(irparam->value, vd, debugInfoType,
|
|
||||||
+ false, false, /*isRefRVal=*/true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
diff --git a/gen/nested.cpp b/gen/nested.cpp
|
|
||||||
index 2a13a1aa6..2b72f9873 100644
|
|
||||||
--- a/gen/nested.cpp
|
|
||||||
+++ b/gen/nested.cpp
|
|
||||||
@@ -58,14 +58,13 @@ DValue *DtoNestedVariable(Loc &loc, Type *astype, VarDeclaration *vd,
|
|
||||||
|
|
||||||
// Check whether we can access the needed frame
|
|
||||||
FuncDeclaration *fd = irfunc->decl;
|
|
||||||
- while (fd != vdparent) {
|
|
||||||
- if (fd->isStatic()) {
|
|
||||||
- error(loc, "function %s cannot access frame of function %s",
|
|
||||||
- irfunc->decl->toPrettyChars(), vdparent->toPrettyChars());
|
|
||||||
- return new DVarValue(astype, llvm::UndefValue::get(DtoPtrToType(astype)));
|
|
||||||
- }
|
|
||||||
+ while (fd && fd != vdparent) {
|
|
||||||
fd = getParentFunc(fd, false);
|
|
||||||
- assert(fd);
|
|
||||||
+ }
|
|
||||||
+ if (!fd) {
|
|
||||||
+ error(loc, "function %s cannot access frame of function %s",
|
|
||||||
+ irfunc->decl->toPrettyChars(), vdparent->toPrettyChars());
|
|
||||||
+ return new DVarValue(astype, llvm::UndefValue::get(DtoPtrToType(astype)));
|
|
||||||
}
|
|
||||||
|
|
||||||
// is the nested variable in this scope?
|
|
||||||
@@ -73,38 +72,32 @@ DValue *DtoNestedVariable(Loc &loc, Type *astype, VarDeclaration *vd,
|
|
||||||
return makeVarDValue(astype, vd);
|
|
||||||
}
|
|
||||||
|
|
||||||
- LLValue *dwarfValue = nullptr;
|
|
||||||
-#if LDC_LLVM_VER >= 306
|
|
||||||
- std::vector<int64_t> dwarfAddr;
|
|
||||||
-#else
|
|
||||||
- std::vector<LLValue *> dwarfAddr;
|
|
||||||
-#endif
|
|
||||||
-
|
|
||||||
// get the nested context
|
|
||||||
LLValue *ctx = nullptr;
|
|
||||||
- if (irfunc->nestedVar) {
|
|
||||||
- // If this function has its own nested context struct, always load it.
|
|
||||||
- ctx = irfunc->nestedVar;
|
|
||||||
- dwarfValue = ctx;
|
|
||||||
+ bool skipDIDeclaration = false;
|
|
||||||
+ auto currentCtx = irfunc->nestedVar;
|
|
||||||
+ if (currentCtx) {
|
|
||||||
+ Logger::println("Using own nested context of current function");
|
|
||||||
+ ctx = currentCtx;
|
|
||||||
} else if (irfunc->decl->isMember2()) {
|
|
||||||
- // If this is a member function of a nested class without its own
|
|
||||||
- // context, load the vthis member.
|
|
||||||
+ Logger::println(
|
|
||||||
+ "Current function is member of nested class, loading vthis");
|
|
||||||
+
|
|
||||||
AggregateDeclaration *cd = irfunc->decl->isMember2();
|
|
||||||
LLValue *val = irfunc->thisArg;
|
|
||||||
if (cd->isClassDeclaration()) {
|
|
||||||
val = DtoLoad(val);
|
|
||||||
}
|
|
||||||
ctx = DtoLoad(DtoGEPi(val, 0, getVthisIdx(cd), ".vthis"));
|
|
||||||
+ skipDIDeclaration = true;
|
|
||||||
} else {
|
|
||||||
- // Otherwise, this is a simple nested function, load from the context
|
|
||||||
- // argument.
|
|
||||||
+ Logger::println("Regular nested function, loading context arg");
|
|
||||||
+
|
|
||||||
ctx = DtoLoad(irfunc->nestArg);
|
|
||||||
- dwarfValue = irfunc->nestArg;
|
|
||||||
- if (global.params.symdebug) {
|
|
||||||
- gIR->DBuilder.OpDeref(dwarfAddr);
|
|
||||||
- }
|
|
||||||
}
|
|
||||||
+
|
|
||||||
assert(ctx);
|
|
||||||
+ IF_LOG { Logger::cout() << "Context: " << *ctx << '\n'; }
|
|
||||||
|
|
||||||
DtoCreateNestedContextType(vdparent->isFuncDeclaration());
|
|
||||||
assert(isIrLocalCreated(vd));
|
|
||||||
@@ -112,11 +105,9 @@ DValue *DtoNestedVariable(Loc &loc, Type *astype, VarDeclaration *vd,
|
|
||||||
////////////////////////////////////
|
|
||||||
// Extract variable from nested context
|
|
||||||
|
|
||||||
- LLValue *val = DtoBitCast(ctx, LLPointerType::getUnqual(irfunc->frameType));
|
|
||||||
- IF_LOG {
|
|
||||||
- Logger::cout() << "Context: " << *val << '\n';
|
|
||||||
- Logger::cout() << "of type: " << *irfunc->frameType << '\n';
|
|
||||||
- }
|
|
||||||
+ const auto frameType = LLPointerType::getUnqual(irfunc->frameType);
|
|
||||||
+ IF_LOG { Logger::cout() << "casting to: " << *irfunc->frameType << '\n'; }
|
|
||||||
+ LLValue *val = DtoBitCast(ctx, frameType);
|
|
||||||
|
|
||||||
IrLocal *const irLocal = getIrLocal(vd);
|
|
||||||
const auto vardepth = irLocal->nestedDepth;
|
|
||||||
@@ -135,10 +126,6 @@ DValue *DtoNestedVariable(Loc &loc, Type *astype, VarDeclaration *vd,
|
|
||||||
IF_LOG Logger::println("Same depth");
|
|
||||||
} else {
|
|
||||||
// Load frame pointer and index that...
|
|
||||||
- if (dwarfValue && global.params.symdebug) {
|
|
||||||
- gIR->DBuilder.OpOffset(dwarfAddr, val, vardepth);
|
|
||||||
- gIR->DBuilder.OpDeref(dwarfAddr);
|
|
||||||
- }
|
|
||||||
IF_LOG Logger::println("Lower depth");
|
|
||||||
val = DtoGEPi(val, 0, vardepth);
|
|
||||||
IF_LOG Logger::cout() << "Frame index: " << *val << '\n';
|
|
||||||
@@ -150,27 +137,42 @@ DValue *DtoNestedVariable(Loc &loc, Type *astype, VarDeclaration *vd,
|
|
||||||
const auto idx = irLocal->nestedIndex;
|
|
||||||
assert(idx != -1 && "Nested context not yet resolved for variable.");
|
|
||||||
|
|
||||||
- if (dwarfValue && global.params.symdebug) {
|
|
||||||
- gIR->DBuilder.OpOffset(dwarfAddr, val, idx);
|
|
||||||
- }
|
|
||||||
+#if LDC_LLVM_VER >= 306
|
|
||||||
+ std::vector<int64_t> dwarfAddrOps;
|
|
||||||
+#else
|
|
||||||
+ std::vector<LLValue *> dwarfAddrOps;
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
- val = DtoGEPi(val, 0, idx, vd->toChars());
|
|
||||||
+ LLValue *gep = DtoGEPi(val, 0, idx, vd->toChars());
|
|
||||||
+ val = gep;
|
|
||||||
IF_LOG {
|
|
||||||
Logger::cout() << "Addr: " << *val << '\n';
|
|
||||||
Logger::cout() << "of type: " << *val->getType() << '\n';
|
|
||||||
}
|
|
||||||
- if (byref || (vd->isParameter() && getIrParameter(vd)->arg &&
|
|
||||||
- getIrParameter(vd)->arg->byref)) {
|
|
||||||
+ const bool isRefOrOut = vd->isRef() || vd->isOut();
|
|
||||||
+ if (isSpecialRefVar(vd)) {
|
|
||||||
+ // Handled appropriately by makeVarDValue() and EmitLocalVariable(), pass
|
|
||||||
+ // storage of pointer (reference lvalue).
|
|
||||||
+ } else if (byref || isRefOrOut) {
|
|
||||||
val = DtoAlignedLoad(val);
|
|
||||||
- // dwarfOpDeref(dwarfAddr);
|
|
||||||
+ // ref/out variables get a reference-debuginfo-type in EmitLocalVariable();
|
|
||||||
+ // pass the GEP as reference lvalue in that case.
|
|
||||||
+ if (!isRefOrOut)
|
|
||||||
+ gIR->DBuilder.OpDeref(dwarfAddrOps);
|
|
||||||
IF_LOG {
|
|
||||||
Logger::cout() << "Was byref, now: " << *irLocal->value << '\n';
|
|
||||||
Logger::cout() << "of type: " << *irLocal->value->getType() << '\n';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (dwarfValue && global.params.symdebug) {
|
|
||||||
- gIR->DBuilder.EmitLocalVariable(dwarfValue, vd, nullptr, false, dwarfAddr);
|
|
||||||
+ if (!skipDIDeclaration && global.params.symdebug) {
|
|
||||||
+#if LDC_LLVM_VER < 500
|
|
||||||
+ // Because we are passing a GEP instead of an alloca to
|
|
||||||
+ // llvm.dbg.declare, we have to make the address dereference explicit.
|
|
||||||
+ gIR->DBuilder.OpDeref(dwarfAddrOps);
|
|
||||||
+#endif
|
|
||||||
+ gIR->DBuilder.EmitLocalVariable(gep, vd, nullptr, false,
|
|
||||||
+ /*forceAsLocal=*/true, false, dwarfAddrOps);
|
|
||||||
}
|
|
||||||
|
|
||||||
return makeVarDValue(astype, vd, val);
|
|
||||||
@@ -532,12 +534,17 @@ void DtoCreateNestedContext(FuncDeclaration *fd) {
|
|
||||||
|
|
||||||
if (global.params.symdebug) {
|
|
||||||
#if LDC_LLVM_VER >= 306
|
|
||||||
- LLSmallVector<int64_t, 2> addr;
|
|
||||||
+ LLSmallVector<int64_t, 2> dwarfAddrOps;
|
|
||||||
#else
|
|
||||||
- LLSmallVector<LLValue *, 2> addr;
|
|
||||||
+ LLSmallVector<LLValue *, 2> dwarfAddrOps;
|
|
||||||
+#endif
|
|
||||||
+#if LDC_LLVM_VER < 500
|
|
||||||
+ // Because we are passing a GEP instead of an alloca to
|
|
||||||
+ // llvm.dbg.declare, we have to make the address dereference explicit.
|
|
||||||
+ gIR->DBuilder.OpDeref(dwarfAddrOps);
|
|
||||||
#endif
|
|
||||||
- gIR->DBuilder.OpOffset(addr, frameType, irLocal->nestedIndex);
|
|
||||||
- gIR->DBuilder.EmitLocalVariable(gep, vd, nullptr, false, addr);
|
|
||||||
+ gIR->DBuilder.EmitLocalVariable(gep, vd, nullptr, false, false, false,
|
|
||||||
+ dwarfAddrOps);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,33 +0,0 @@
|
|||||||
From d9496882163e173ea718756a7fb0cbc627c5326f Mon Sep 17 00:00:00 2001
|
|
||||||
From: Matthias Klumpp <matthias@tenstral.net>
|
|
||||||
Date: Tue, 2 Aug 2016 17:10:09 +0200
|
|
||||||
Subject: [PATCH] Default to PIC code on Linux
|
|
||||||
|
|
||||||
Modern Linux distributions have their toolchain generate PIC code for
|
|
||||||
additional security features (like ASLR).
|
|
||||||
Since there is no (sane) way to detect whether the toolchain defaults to
|
|
||||||
PIC code, we simply default to PIC code on all Linux
|
|
||||||
distributions to avoid linking issues on these OSes.
|
|
||||||
|
|
||||||
The relocation model can be switched back to non-PIC code manually at
|
|
||||||
any time.
|
|
||||||
---
|
|
||||||
driver/targetmachine.cpp | 5 ++++-
|
|
||||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/driver/targetmachine.cpp b/driver/targetmachine.cpp
|
|
||||||
index 1a0fddf70..987be4263 100644
|
|
||||||
--- a/driver/targetmachine.cpp
|
|
||||||
+++ b/driver/targetmachine.cpp
|
|
||||||
@@ -528,7 +528,10 @@ llvm::TargetMachine *createTargetMachine(
|
|
||||||
// Darwin defaults to PIC (and as of 10.7.5/LLVM 3.1-3.3, TLS use leads
|
|
||||||
// to crashes for non-PIC code). LLVM doesn't handle this.
|
|
||||||
relocModel = llvm::Reloc::PIC_;
|
|
||||||
- } else if (triple.getEnvironment() == llvm::Triple::Android) {
|
|
||||||
+ } else if (triple.isOSLinux()) {
|
|
||||||
+ // Modern Linux distributions have their toolchain generate PIC code for additional security
|
|
||||||
+ // features (like ASLR). We default to PIC code to avoid linking issues on these OSes.
|
|
||||||
+ // On Android, PIC is default as well.
|
|
||||||
relocModel = llvm::Reloc::PIC_;
|
|
||||||
} else {
|
|
||||||
// ARM for other than Darwin or Android defaults to static
|
|
@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:7aa540a135f9fa1ee9722cad73100a8f3600a07f9a11d199d8be68887cc90008
|
|
||||||
size 5006161
|
|
3
ldc-0.17.6-src.tar.gz
Normal file
3
ldc-0.17.6-src.tar.gz
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:868b8c07ab697306ea65f0006fc2b6b96db4df226e82f8f11cafbed6fa9ac561
|
||||||
|
size 4986528
|
@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:99b6e2b8dcaf28a2947318fb25e43fa0b96dd3a6377995146f987c4d17dd8371
|
|
||||||
size 6658773
|
|
3
ldc-1.11.0-src.tar.gz
Normal file
3
ldc-1.11.0-src.tar.gz
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:85464fae47bc605308910afd6cfc6ddeafe95a8ad5b61e2c0c23caff82119f70
|
||||||
|
size 6724384
|
74
ldc.changes
74
ldc.changes
@ -1,3 +1,77 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Aug 27 06:56:16 UTC 2018 - guillaume.gardet@opensuse.org
|
||||||
|
|
||||||
|
- Fix so_version to 81
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri Aug 24 10:24:47 UTC 2018 - guillaume@opensuse.org
|
||||||
|
|
||||||
|
- Update to 1.11.0:
|
||||||
|
* Big news:
|
||||||
|
- Frontend, druntime and Phobos are at version 2.081.2.
|
||||||
|
(#2752, #2772, #2776, #2791, #2815) (new)
|
||||||
|
- Add some support for classes without TypeInfos, for
|
||||||
|
-betterC and/or a minimal (d)runtime. (#2765)
|
||||||
|
- LLVM for prebuilt packages upgraded to v6.0.1.
|
||||||
|
The x86_64 packages feature some more LLVM targets for
|
||||||
|
cross-compilation (experiments): MIPS, MSP430, RISC-V
|
||||||
|
and WebAssembly. (#2760)
|
||||||
|
- Rudimentary support for compiling & linking directly to
|
||||||
|
WebAssembly. See the dedicated Wiki page for how to get
|
||||||
|
started. (#2766, #2779, #2785)
|
||||||
|
- AArch64 (64-bit ARM) now mostly working on Linux/glibc
|
||||||
|
and Android. Current ltsmaster is able to bootstrap v1.11,
|
||||||
|
which can also bootstrap itself; most tests pass.
|
||||||
|
(Preliminary) CI has been set up. (#2802, #2817, #2813) (new)
|
||||||
|
- LDC on Windows now uses 80-bit compile-time reals. This allows
|
||||||
|
for seamless cross-compilation to other x86(_64) targets,
|
||||||
|
e.g., without real.min underflowing to 0 and real.max
|
||||||
|
overflowing to infinity. (#2752)
|
||||||
|
- New @naked UDA in ldc.attributes & enhanced functionality
|
||||||
|
for @llvmAttr("<name>"). (#2773)
|
||||||
|
* Platform support:
|
||||||
|
- Supports LLVM 3.7 - 6.0.
|
||||||
|
- Windows: Supports Visual Studio/C++ Build Tools 2015 and 2017.
|
||||||
|
- Alpine linux/x64: built against Musl libc to support Docker
|
||||||
|
images based on the Alpine distro, requires the llvm5-libs,
|
||||||
|
musl-dev, and gcc packages to build and link D apps and the
|
||||||
|
tzdata and libcurl packages for certain stdlib modules.
|
||||||
|
* Bug fixes:
|
||||||
|
- extern(C++) on Posix: Pass non-PODs indirectly by value.
|
||||||
|
(#2728)
|
||||||
|
- extern(C++) on Windows/MSVC: Methods return all structs via
|
||||||
|
hidden sret pointer. (#2720, #1935)
|
||||||
|
- Make GC2Stack IR optimization pass work as intended. (#2750)
|
||||||
|
- Work around inline assembly regression with LLVM 6 on Win32.
|
||||||
|
The prebuilt Win32 package is now using LLVM 6.0.1 too. (#2629, #2770)
|
||||||
|
- Fix overzealous check for multiple main() functions. (#2778) (new)
|
||||||
|
- Fix corrupt prefix in integrated LLD's console output. (#2781) (new)
|
||||||
|
- No context ptr for nested non-extern(D) functions. (#2808, #2809) (new)
|
||||||
|
* Known issues:
|
||||||
|
- LDC does not zero the padding area of a real variable. This may
|
||||||
|
lead to wrong results if the padding area is also considered.
|
||||||
|
See #770. Does not apply to real members inside structs etc.
|
||||||
|
- Update bootstrap version to 0.17.6:
|
||||||
|
* Added support for LLVM 6.0 and 7.0. (#2600, #2825)
|
||||||
|
* Backported AArch64 fixes from master; most tests passing on
|
||||||
|
Linux/glibc and Android
|
||||||
|
* Fix generation of debug info. (#2594)
|
||||||
|
* Added support for bootstrapping on DragonFly BSD
|
||||||
|
* Fixed missing definition in std.datetime on Solaris
|
||||||
|
* Fixed std.datetime unittest failure. (ldc-developers/phobos#59)
|
||||||
|
* Fixed tests for PowerPC. (#2634, #2635)
|
||||||
|
* Improvements for MIPS.
|
||||||
|
* Make core.stdc.stdarg.va_* functions nothrow to enable
|
||||||
|
compiling the 2.082 frontend. (#2821)
|
||||||
|
* CI updates.
|
||||||
|
- Remove upstreamed patches:
|
||||||
|
* ldc-0.17.5-add_missing_include.patch
|
||||||
|
* ldc-0.17.5-add_support_to_LLVM6.patch
|
||||||
|
* ldc-0.17.5-backport_pr_2315.patch
|
||||||
|
* ldc-0.17.5-default-to-pic.patch
|
||||||
|
- Enable aarch64 since it can be boostrapped with ldc 0.17.6
|
||||||
|
- Fix x86_64 build by adding '-fPIC' to C_FLAGS of bootstrap
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Mon Jul 30 09:55:27 UTC 2018 - matthias.eliasson@gmail.com
|
Mon Jul 30 09:55:27 UTC 2018 - matthias.eliasson@gmail.com
|
||||||
|
|
||||||
|
29
ldc.spec
29
ldc.spec
@ -16,18 +16,18 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
%define so_ver 80
|
%define so_ver 81
|
||||||
%define lname_runtime libdruntime-%{name}
|
%define lname_runtime libdruntime-%{name}
|
||||||
%define lname_phobos libphobos2-%{name}
|
%define lname_phobos libphobos2-%{name}
|
||||||
%bcond_without ldc_bootstrap
|
%bcond_without ldc_bootstrap
|
||||||
%bcond_with ldc_tests
|
%bcond_with ldc_tests
|
||||||
Name: ldc
|
Name: ldc
|
||||||
Version: 1.10.0
|
Version: 1.11.0
|
||||||
Release: 0
|
Release: 0
|
||||||
Summary: The LLVM D Compiler
|
Summary: The LLVM D Compiler
|
||||||
License: BSD-3-Clause AND Artistic-1.0
|
License: BSD-3-Clause AND Artistic-1.0
|
||||||
Group: Development/Languages/Other
|
Group: Development/Languages/Other
|
||||||
URL: https://wiki.dlang.org/LDC
|
Url: https://wiki.dlang.org/LDC
|
||||||
Source0: https://github.com/ldc-developers/ldc/releases/download/v%{version}/ldc-%{version}-src.tar.gz
|
Source0: https://github.com/ldc-developers/ldc/releases/download/v%{version}/ldc-%{version}-src.tar.gz
|
||||||
Source1: %{name}-rpmlintrc
|
Source1: %{name}-rpmlintrc
|
||||||
Patch0: ldc-1.9.0-fix_arm_build.patch
|
Patch0: ldc-1.9.0-fix_arm_build.patch
|
||||||
@ -45,12 +45,8 @@ BuildRequires: zlib-devel
|
|||||||
Recommends: ldc-phobos-devel = %{version}
|
Recommends: ldc-phobos-devel = %{version}
|
||||||
Recommends: ldc-runtime-devel = %{version}
|
Recommends: ldc-runtime-devel = %{version}
|
||||||
%if %{with ldc_bootstrap}
|
%if %{with ldc_bootstrap}
|
||||||
# v0.17.5 is the last version buildable with a C++ compiler, so use it for bootstrapping
|
# v0.17.6 is the last version buildable with a C++ compiler, so use it for bootstrapping
|
||||||
Source10: https://github.com/ldc-developers/ldc/releases/download/v0.17.5/ldc-0.17.5-src.tar.gz
|
Source10: https://github.com/ldc-developers/ldc/releases/download/v0.17.6/ldc-0.17.6-src.tar.gz
|
||||||
Patch10: ldc-0.17.5-backport_pr_2315.patch
|
|
||||||
Patch11: ldc-0.17.5-add_support_to_LLVM6.patch
|
|
||||||
Patch12: ldc-0.17.5-add_missing_include.patch
|
|
||||||
Patch13: ldc-0.17.5-default-to-pic.patch
|
|
||||||
%endif
|
%endif
|
||||||
%if %{with ldc_tests}
|
%if %{with ldc_tests}
|
||||||
BuildRequires: gcc-c++
|
BuildRequires: gcc-c++
|
||||||
@ -68,10 +64,6 @@ BuildRequires: python
|
|||||||
BuildRequires: timezone
|
BuildRequires: timezone
|
||||||
BuildRequires: unzip
|
BuildRequires: unzip
|
||||||
%endif
|
%endif
|
||||||
%if %{with ldc_bootstrap}
|
|
||||||
# We cannot build v0.17.5 for aarch64 due to no aarch64 support in phobos, so bootstrap is impossible
|
|
||||||
ExcludeArch: aarch64
|
|
||||||
%endif
|
|
||||||
|
|
||||||
%description
|
%description
|
||||||
LDC is an LLVM based compiler for the D programming language. It uses the
|
LDC is an LLVM based compiler for the D programming language. It uses the
|
||||||
@ -118,17 +110,13 @@ with LDC.
|
|||||||
%patch0 -p1
|
%patch0 -p1
|
||||||
%if %{with ldc_bootstrap}
|
%if %{with ldc_bootstrap}
|
||||||
tar xf %{SOURCE10}
|
tar xf %{SOURCE10}
|
||||||
pushd ldc-0.17.5-src
|
pushd ldc-0.17.6-src
|
||||||
%patch10 -p1
|
|
||||||
%patch11 -p1
|
|
||||||
%patch12 -p1
|
|
||||||
%patch13 -p1
|
|
||||||
popd
|
popd
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%build
|
%build
|
||||||
%if %{with ldc_bootstrap}
|
%if %{with ldc_bootstrap}
|
||||||
pushd ldc-0.17.5-src
|
pushd ldc-0.17.6-src
|
||||||
#Needs to be compiled with clang, but opensuse_rules.cmake forces gcc so disable rule
|
#Needs to be compiled with clang, but opensuse_rules.cmake forces gcc so disable rule
|
||||||
touch ./no-suse-rules
|
touch ./no-suse-rules
|
||||||
mkdir build && pushd build
|
mkdir build && pushd build
|
||||||
@ -139,6 +127,7 @@ cmake \
|
|||||||
-DCMAKE_CXX_COMPILER="%{_bindir}/clang++" \
|
-DCMAKE_CXX_COMPILER="%{_bindir}/clang++" \
|
||||||
-DINCLUDE_INSTALL_DIR:PATH=%{_includedir}/d \
|
-DINCLUDE_INSTALL_DIR:PATH=%{_includedir}/d \
|
||||||
-DCMAKE_CXX_FLAGS="-std=c++11" \
|
-DCMAKE_CXX_FLAGS="-std=c++11" \
|
||||||
|
-DCMAKE_C_FLAGS="-fPIC" \
|
||||||
..
|
..
|
||||||
make %{?_smp_mflags}
|
make %{?_smp_mflags}
|
||||||
popd
|
popd
|
||||||
@ -152,7 +141,7 @@ touch no-suse-rules
|
|||||||
-DCMAKE_CXX_COMPILER="%{_bindir}/clang++" \
|
-DCMAKE_CXX_COMPILER="%{_bindir}/clang++" \
|
||||||
-DINCLUDE_INSTALL_DIR:PATH=%{_includedir}/d \
|
-DINCLUDE_INSTALL_DIR:PATH=%{_includedir}/d \
|
||||||
%if %{with ldc_bootstrap}
|
%if %{with ldc_bootstrap}
|
||||||
-DD_COMPILER:PATH=`pwd`/../ldc-0.17.5-src/build/bin/ldmd2 \
|
-DD_COMPILER:PATH=`pwd`/../ldc-0.17.6-src/build/bin/ldmd2 \
|
||||||
%endif
|
%endif
|
||||||
-DCMAKE_CXX_FLAGS="-std=c++11"
|
-DCMAKE_CXX_FLAGS="-std=c++11"
|
||||||
make %{?_smp_mflags}
|
make %{?_smp_mflags}
|
||||||
|
Loading…
Reference in New Issue
Block a user