diff options
author | Iain Buclaw <ibuclaw@gdcproject.org> | 2019-03-12 13:29:16 +0000 |
---|---|---|
committer | Iain Buclaw <ibuclaw@gcc.gnu.org> | 2019-03-12 13:29:16 +0000 |
commit | c9634470ba8b918c01a7680740cf9ea13ca06967 (patch) | |
tree | 279986d79aff26484061e545bce82c387b8edb0a | |
parent | df2a91dece0ac6e410e3cf48b39cba8c3744c5f3 (diff) | |
download | gcc-c9634470ba8b918c01a7680740cf9ea13ca06967.zip gcc-c9634470ba8b918c01a7680740cf9ea13ca06967.tar.gz gcc-c9634470ba8b918c01a7680740cf9ea13ca06967.tar.bz2 |
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
-rw-r--r-- | gcc/d/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/d/d-lang.cc | 3 | ||||
-rw-r--r-- | gcc/d/d-target.cc | 9 | ||||
-rw-r--r-- | gcc/d/dmd/MERGE | 2 | ||||
-rw-r--r-- | gcc/d/dmd/cppmangle.c | 64 | ||||
-rw-r--r-- | gcc/d/dmd/globals.h | 9 | ||||
-rw-r--r-- | gcc/d/dmd/target.h | 1 | ||||
-rw-r--r-- | gcc/testsuite/gdc.test/runnable/cppa.d | 5 | ||||
-rw-r--r-- | gcc/testsuite/gdc.test/runnable/extra-files/cppb.cpp | 6 |
9 files changed, 91 insertions, 13 deletions
diff --git a/gcc/d/ChangeLog b/gcc/d/ChangeLog index 4d9fb99..c91a050 100644 --- a/gcc/d/ChangeLog +++ b/gcc/d/ChangeLog @@ -1,3 +1,8 @@ +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> PR d/89041 diff --git a/gcc/d/d-lang.cc b/gcc/d/d-lang.cc index b53e56e..d97525a 100644 --- a/gcc/d/d-lang.cc +++ b/gcc/d/d-lang.cc @@ -282,6 +282,9 @@ d_init_options (unsigned int, cl_decoded_option *decoded_options) global.params.betterC = false; global.params.allInst = false; + /* Default extern(C++) mangling to C++14. */ + global.params.cplusplus = CppStdRevisionCpp14; + global.params.linkswitches = new Strings (); global.params.libfiles = new Strings (); global.params.objfiles = new Strings (); diff --git a/gcc/d/d-target.cc b/gcc/d/d-target.cc index de57d92..e0cfbaf 100644 --- a/gcc/d/d-target.cc +++ b/gcc/d/d-target.cc @@ -385,6 +385,15 @@ Target::cppParameterType (Parameter *arg) 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. */ LINK diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE index cf5a22f..f58b620 100644 --- a/gcc/d/dmd/MERGE +++ b/gcc/d/dmd/MERGE @@ -1,4 +1,4 @@ -fcc235e8e25f7758266f7874edd5abefb9943e0b +7423993c996ed9f73d6ba6d58f625ad3c778ca1d The first line of this file holds the git revision number of the last merge done from the dlang/dmd repository. diff --git a/gcc/d/dmd/cppmangle.c b/gcc/d/dmd/cppmangle.c index b991417..9b24fd2 100644 --- a/gcc/d/dmd/cppmangle.c +++ b/gcc/d/dmd/cppmangle.c @@ -120,6 +120,40 @@ class CppMangleVisitor : public Visitor !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. * Params: @@ -741,7 +775,8 @@ public: */ 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)) return; @@ -767,6 +802,22 @@ public: if (t->isImmutable() || t->isShared()) 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>: * v void * w wchar_t @@ -832,17 +883,6 @@ public: case Tcomplex80: p = 'C'; c = 'e'; break; 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); } writeBasicType(t, p, c); diff --git a/gcc/d/dmd/globals.h b/gcc/d/dmd/globals.h index 6c37cca..e2d42c7 100644 --- a/gcc/d/dmd/globals.h +++ b/gcc/d/dmd/globals.h @@ -55,6 +55,14 @@ enum CPU 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 struct Param { @@ -114,6 +122,7 @@ struct Param bool check10378; // check for issues transitioning to 10738 bool bug10378; // use pre-bugzilla 10378 search strategy bool vsafe; // use enhanced @safe checking + unsigned cplusplus; // version of C++ name mangling to support bool showGaggedErrors; // print gagged errors anyway CPU cpu; // CPU instruction set to target diff --git a/gcc/d/dmd/target.h b/gcc/d/dmd/target.h index 66be201..1729bc3 100644 --- a/gcc/d/dmd/target.h +++ b/gcc/d/dmd/target.h @@ -71,5 +71,6 @@ struct Target static const char *cppTypeInfoMangle(ClassDeclaration *cd); static const char *cppTypeMangle(Type *t); static Type *cppParameterType(Parameter *p); + static bool cppFundamentalType(const Type *t, bool& isFundamental); static LINK systemLinkage(); }; diff --git a/gcc/testsuite/gdc.test/runnable/cppa.d b/gcc/testsuite/gdc.test/runnable/cppa.d index 82b93ad..6b2bafb 100644 --- a/gcc/testsuite/gdc.test/runnable/cppa.d +++ b/gcc/testsuite/gdc.test/runnable/cppa.d @@ -619,6 +619,7 @@ else alias c_long_double myld; extern (C++) myld testld(myld); +extern (C++) myld testldld(myld, myld); void test15() @@ -626,6 +627,10 @@ void test15() myld ld = 5.0; ld = testld(ld); assert(ld == 6.0); + + myld ld2 = 5.0; + ld2 = testldld(ld2, ld2); + assert(ld2 == 6.0); } /****************************************/ diff --git a/gcc/testsuite/gdc.test/runnable/extra-files/cppb.cpp b/gcc/testsuite/gdc.test/runnable/extra-files/cppb.cpp index 7574c5f..587145c 100644 --- a/gcc/testsuite/gdc.test/runnable/extra-files/cppb.cpp +++ b/gcc/testsuite/gdc.test/runnable/extra-files/cppb.cpp @@ -439,6 +439,12 @@ long double testld(long double ld) return ld + 1; } +long double testldld(long double ld1, long double ld2) +{ + assert(ld1 == 5); + return ld2 + 1; +} + long testl(long lng) { assert(lng == 5); |