Commit c9634470 by Iain Buclaw Committed by Iain Buclaw

d/dmd: Merge upstream dmd 7423993c9

Fixes C++ mangling for substituted basic types that are target-specific.
Introduces a new method that currently does nothing, but could in future
make use of flag_abi_version as extern(C++) integration improves in
latter versions of the D front-end.

Reviewed-on: https://github.com/dlang/dmd/pull/9439

gcc/d/ChangeLog:

2019-03-12  Iain Buclaw  <ibuclaw@gdcproject.org>

	* d-lang.cc (d_init_options): Set global.params.cplusplus to C++14.
	* d-target.cc (Target::cppFundamentalType): New method.

From-SVN: r269611
parent df2a91de
2019-03-12 Iain Buclaw <ibuclaw@gdcproject.org>
* d-lang.cc (d_init_options): Set global.params.cplusplus to C++14.
* d-target.cc (Target::cppFundamentalType): New method.
2019-03-09 Iain Buclaw <ibuclaw@gdcproject.org> 2019-03-09 Iain Buclaw <ibuclaw@gdcproject.org>
PR d/89041 PR d/89041
......
...@@ -282,6 +282,9 @@ d_init_options (unsigned int, cl_decoded_option *decoded_options) ...@@ -282,6 +282,9 @@ d_init_options (unsigned int, cl_decoded_option *decoded_options)
global.params.betterC = false; global.params.betterC = false;
global.params.allInst = false; global.params.allInst = false;
/* Default extern(C++) mangling to C++14. */
global.params.cplusplus = CppStdRevisionCpp14;
global.params.linkswitches = new Strings (); global.params.linkswitches = new Strings ();
global.params.libfiles = new Strings (); global.params.libfiles = new Strings ();
global.params.objfiles = new Strings (); global.params.objfiles = new Strings ();
......
...@@ -385,6 +385,15 @@ Target::cppParameterType (Parameter *arg) ...@@ -385,6 +385,15 @@ Target::cppParameterType (Parameter *arg)
return t; return t;
} }
/* Checks whether TYPE is a vendor-specific fundamental type. Stores the result
in IS_FUNDAMENTAL and returns true if the parameter was set. */
bool
Target::cppFundamentalType (const Type *, bool &)
{
return false;
}
/* Return the default system linkage for the target. */ /* Return the default system linkage for the target. */
LINK LINK
......
fcc235e8e25f7758266f7874edd5abefb9943e0b 7423993c996ed9f73d6ba6d58f625ad3c778ca1d
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the dlang/dmd repository. merge done from the dlang/dmd repository.
...@@ -120,6 +120,40 @@ class CppMangleVisitor : public Visitor ...@@ -120,6 +120,40 @@ class CppMangleVisitor : public Visitor
!getQualifier(s)); // at global level !getQualifier(s)); // at global level
} }
/************************
* Determine if type is a C++ fundamental type.
* Params:
* t = type to check
* Returns:
* true if it is a fundamental type
*/
static bool isFundamentalType(Type *t)
{
// First check the target whether some specific ABI is being followed.
bool isFundamental;
if (Target::cppFundamentalType(t, isFundamental))
return isFundamental;
if (t->ty == Tenum)
{
// Peel off enum type from special types.
TypeEnum *te = (TypeEnum *)t;
if (te->sym->isSpecial())
t = te->sym->getMemtype(Loc());
}
// Fundamental arithmetic types:
// 1. integral types: bool, char, int, ...
// 2. floating point types: float, double, real
// 3. void
// 4. null pointer: std::nullptr_t (since C++11)
if (t->ty == Tvoid || t->ty == Tbool)
return true;
else if (t->ty == Tnull && global.params.cplusplus >= CppStdRevisionCpp11)
return true;
else
return t->isTypeBasic() && (t->isintegral() || t->isreal());
}
/****************************** /******************************
* Write the mangled representation of the template arguments. * Write the mangled representation of the template arguments.
* Params: * Params:
...@@ -741,7 +775,8 @@ public: ...@@ -741,7 +775,8 @@ public:
*/ */
void writeBasicType(Type *t, char p, char c) void writeBasicType(Type *t, char p, char c)
{ {
if (p || t->isConst()) // Only do substitutions for non-fundamental types.
if (!isFundamentalType(t) || t->isConst())
{ {
if (substitute(t)) if (substitute(t))
return; return;
...@@ -767,6 +802,22 @@ public: ...@@ -767,6 +802,22 @@ public:
if (t->isImmutable() || t->isShared()) if (t->isImmutable() || t->isShared())
return error(t); return error(t);
// Handle any target-specific basic types.
if (const char *tm = Target::cppTypeMangle(t))
{
// Only do substitutions for non-fundamental types.
if (!isFundamentalType(t) || t->isConst())
{
if (substitute(t))
return;
else
append(t);
}
CV_qualifiers(t);
buf->writestring(tm);
return;
}
/* <builtin-type>: /* <builtin-type>:
* v void * v void
* w wchar_t * w wchar_t
...@@ -832,17 +883,6 @@ public: ...@@ -832,17 +883,6 @@ public:
case Tcomplex80: p = 'C'; c = 'e'; break; case Tcomplex80: p = 'C'; c = 'e'; break;
default: default:
// Handle any target-specific basic types.
if (const char *tm = Target::cppTypeMangle(t))
{
if (substitute(t))
return;
else
append(t);
CV_qualifiers(t);
buf->writestring(tm);
return;
}
return error(t); return error(t);
} }
writeBasicType(t, p, c); writeBasicType(t, p, c);
......
...@@ -55,6 +55,14 @@ enum CPU ...@@ -55,6 +55,14 @@ enum CPU
native // the machine the compiler is being run on native // the machine the compiler is being run on
}; };
enum CppStdRevision
{
CppStdRevisionCpp98 = 199711,
CppStdRevisionCpp11 = 201103,
CppStdRevisionCpp14 = 201402,
CppStdRevisionCpp17 = 201703
};
// Put command line switches in here // Put command line switches in here
struct Param struct Param
{ {
...@@ -114,6 +122,7 @@ struct Param ...@@ -114,6 +122,7 @@ struct Param
bool check10378; // check for issues transitioning to 10738 bool check10378; // check for issues transitioning to 10738
bool bug10378; // use pre-bugzilla 10378 search strategy bool bug10378; // use pre-bugzilla 10378 search strategy
bool vsafe; // use enhanced @safe checking bool vsafe; // use enhanced @safe checking
unsigned cplusplus; // version of C++ name mangling to support
bool showGaggedErrors; // print gagged errors anyway bool showGaggedErrors; // print gagged errors anyway
CPU cpu; // CPU instruction set to target CPU cpu; // CPU instruction set to target
......
...@@ -71,5 +71,6 @@ struct Target ...@@ -71,5 +71,6 @@ struct Target
static const char *cppTypeInfoMangle(ClassDeclaration *cd); static const char *cppTypeInfoMangle(ClassDeclaration *cd);
static const char *cppTypeMangle(Type *t); static const char *cppTypeMangle(Type *t);
static Type *cppParameterType(Parameter *p); static Type *cppParameterType(Parameter *p);
static bool cppFundamentalType(const Type *t, bool& isFundamental);
static LINK systemLinkage(); static LINK systemLinkage();
}; };
...@@ -619,6 +619,7 @@ else ...@@ -619,6 +619,7 @@ else
alias c_long_double myld; alias c_long_double myld;
extern (C++) myld testld(myld); extern (C++) myld testld(myld);
extern (C++) myld testldld(myld, myld);
void test15() void test15()
...@@ -626,6 +627,10 @@ void test15() ...@@ -626,6 +627,10 @@ void test15()
myld ld = 5.0; myld ld = 5.0;
ld = testld(ld); ld = testld(ld);
assert(ld == 6.0); assert(ld == 6.0);
myld ld2 = 5.0;
ld2 = testldld(ld2, ld2);
assert(ld2 == 6.0);
} }
/****************************************/ /****************************************/
......
...@@ -439,6 +439,12 @@ long double testld(long double ld) ...@@ -439,6 +439,12 @@ long double testld(long double ld)
return ld + 1; return ld + 1;
} }
long double testldld(long double ld1, long double ld2)
{
assert(ld1 == 5);
return ld2 + 1;
}
long testl(long lng) long testl(long lng)
{ {
assert(lng == 5); assert(lng == 5);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment