mirror of
https://github.com/dlang/dmd.git
synced 2025-04-29 06:30:10 +03:00
Get rid of obsolete DMC mangling special cases
This commit is contained in:
parent
99069d9fb8
commit
dd673700c0
1 changed files with 39 additions and 90 deletions
|
@ -41,8 +41,7 @@ import dmd.visitor;
|
||||||
|
|
||||||
const(char)* toCppMangleMSVC(Dsymbol s)
|
const(char)* toCppMangleMSVC(Dsymbol s)
|
||||||
{
|
{
|
||||||
// TODO: get rid of isDmc flag
|
scope VisualCPPMangler v = new VisualCPPMangler(s.loc, global.errorSink);
|
||||||
scope VisualCPPMangler v = new VisualCPPMangler(false, s.loc, global.errorSink);
|
|
||||||
auto p = v.mangleOf(s);
|
auto p = v.mangleOf(s);
|
||||||
if (v.errors)
|
if (v.errors)
|
||||||
fatal(); // because this error should be handled in frontend
|
fatal(); // because this error should be handled in frontend
|
||||||
|
@ -71,7 +70,6 @@ private extern (C++) final class VisualCPPMangler : Visitor
|
||||||
bool ignoreConst; /// in some cases we should ignore CV-modifiers.
|
bool ignoreConst; /// in some cases we should ignore CV-modifiers.
|
||||||
bool escape; /// toplevel const non-pointer types need a '$$C' escape in addition to a cv qualifier.
|
bool escape; /// toplevel const non-pointer types need a '$$C' escape in addition to a cv qualifier.
|
||||||
bool mangleReturnType; /// return type shouldn't be saved and substituted in arguments
|
bool mangleReturnType; /// return type shouldn't be saved and substituted in arguments
|
||||||
bool isDmc; /// Digital Mars C++ name mangling
|
|
||||||
bool errors; /// errors occurred
|
bool errors; /// errors occurred
|
||||||
|
|
||||||
OutBuffer buf;
|
OutBuffer buf;
|
||||||
|
@ -80,16 +78,14 @@ private extern (C++) final class VisualCPPMangler : Visitor
|
||||||
{
|
{
|
||||||
saved_idents[] = rvl.saved_idents[];
|
saved_idents[] = rvl.saved_idents[];
|
||||||
saved_types[] = rvl.saved_types[];
|
saved_types[] = rvl.saved_types[];
|
||||||
isDmc = rvl.isDmc;
|
|
||||||
loc = rvl.loc;
|
loc = rvl.loc;
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
extern (D) this(bool isDmc, Loc loc, ErrorSink eSink) scope @safe
|
extern (D) this(Loc loc, ErrorSink eSink) scope @safe
|
||||||
{
|
{
|
||||||
saved_idents[] = null;
|
saved_idents[] = null;
|
||||||
saved_types[] = null;
|
saved_types[] = null;
|
||||||
this.isDmc = isDmc;
|
|
||||||
this.loc = loc;
|
this.loc = loc;
|
||||||
this.eSink = eSink;
|
this.eSink = eSink;
|
||||||
}
|
}
|
||||||
|
@ -133,7 +129,7 @@ public:
|
||||||
if (checkImmutableShared(type, loc))
|
if (checkImmutableShared(type, loc))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (type.isConst() && (isNotTopType || isDmc))
|
if (type.isConst() && isNotTopType)
|
||||||
{
|
{
|
||||||
if (checkTypeSaved(type))
|
if (checkTypeSaved(type))
|
||||||
return;
|
return;
|
||||||
|
@ -142,23 +138,20 @@ public:
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!isDmc)
|
switch (type.ty)
|
||||||
{
|
{
|
||||||
switch (type.ty)
|
case Tint64:
|
||||||
{
|
case Tuns64:
|
||||||
case Tint64:
|
case Tint128:
|
||||||
case Tuns64:
|
case Tuns128:
|
||||||
case Tint128:
|
case Tfloat80:
|
||||||
case Tuns128:
|
case Twchar:
|
||||||
case Tfloat80:
|
if (checkTypeSaved(type))
|
||||||
case Twchar:
|
return;
|
||||||
if (checkTypeSaved(type))
|
break;
|
||||||
return;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
mangleModifier(type);
|
mangleModifier(type);
|
||||||
switch (type.ty)
|
switch (type.ty)
|
||||||
|
@ -203,10 +196,7 @@ public:
|
||||||
buf.writeByte('N');
|
buf.writeByte('N');
|
||||||
break;
|
break;
|
||||||
case Tfloat80:
|
case Tfloat80:
|
||||||
if (isDmc)
|
buf.writestring("_T"); // Intel long double
|
||||||
buf.writestring("_Z"); // DigitalMars long double
|
|
||||||
else
|
|
||||||
buf.writestring("_T"); // Intel long double
|
|
||||||
break;
|
break;
|
||||||
case Tbool:
|
case Tbool:
|
||||||
buf.writestring("_N");
|
buf.writestring("_N");
|
||||||
|
@ -246,10 +236,7 @@ public:
|
||||||
if (checkTypeSaved(type))
|
if (checkTypeSaved(type))
|
||||||
return;
|
return;
|
||||||
// first dimension always mangled as const pointer
|
// first dimension always mangled as const pointer
|
||||||
if (isDmc)
|
buf.writeByte('P');
|
||||||
buf.writeByte('Q');
|
|
||||||
else
|
|
||||||
buf.writeByte('P');
|
|
||||||
isNotTopType = true;
|
isNotTopType = true;
|
||||||
assert(type.next);
|
assert(type.next);
|
||||||
if (type.next.ty == Tsarray)
|
if (type.next.ty == Tsarray)
|
||||||
|
@ -295,10 +282,7 @@ public:
|
||||||
if (checkTypeSaved(type))
|
if (checkTypeSaved(type))
|
||||||
return;
|
return;
|
||||||
mangleModifier(type);
|
mangleModifier(type);
|
||||||
if (type.isConst() || !isDmc)
|
buf.writeByte('Q'); // const
|
||||||
buf.writeByte('Q'); // const
|
|
||||||
else
|
|
||||||
buf.writeByte('P'); // mutable
|
|
||||||
if (target.isLP64)
|
if (target.isLP64)
|
||||||
buf.writeByte('E');
|
buf.writeByte('E');
|
||||||
isNotTopType = true;
|
isNotTopType = true;
|
||||||
|
@ -352,15 +336,7 @@ public:
|
||||||
override void visit(TypeFunction type)
|
override void visit(TypeFunction type)
|
||||||
{
|
{
|
||||||
const(char)* arg = mangleFunctionType(type);
|
const(char)* arg = mangleFunctionType(type);
|
||||||
if (isDmc)
|
buf.writestring("$$A6");
|
||||||
{
|
|
||||||
if (checkTypeSaved(type))
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
buf.writestring("$$A6");
|
|
||||||
}
|
|
||||||
buf.writestring(arg);
|
buf.writestring(arg);
|
||||||
isNotTopType = false;
|
isNotTopType = false;
|
||||||
ignoreConst = false;
|
ignoreConst = false;
|
||||||
|
@ -400,16 +376,14 @@ public:
|
||||||
else if (id == Id.__c_char)
|
else if (id == Id.__c_char)
|
||||||
c = "D"; // VC++ char
|
c = "D"; // VC++ char
|
||||||
else if (id == Id.__c_wchar_t)
|
else if (id == Id.__c_wchar_t)
|
||||||
{
|
c = "_W";
|
||||||
c = isDmc ? "_Y" : "_W";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c.length)
|
if (c.length)
|
||||||
{
|
{
|
||||||
if (checkImmutableShared(type, loc))
|
if (checkImmutableShared(type, loc))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (type.isConst() && (isNotTopType || isDmc))
|
if (type.isConst() && isNotTopType)
|
||||||
{
|
{
|
||||||
if (checkTypeSaved(type))
|
if (checkTypeSaved(type))
|
||||||
return;
|
return;
|
||||||
|
@ -568,9 +542,8 @@ extern(D):
|
||||||
* Params:
|
* Params:
|
||||||
* o = expression that represents the value
|
* o = expression that represents the value
|
||||||
* tv = template value
|
* tv = template value
|
||||||
* is_dmc_template = use DMC mangling
|
|
||||||
*/
|
*/
|
||||||
void mangleTemplateValue(RootObject o, TemplateValueParameter tv, Dsymbol sym, bool is_dmc_template)
|
void mangleTemplateValue(RootObject o, TemplateValueParameter tv, Dsymbol sym)
|
||||||
{
|
{
|
||||||
if (!tv.valType.isintegral())
|
if (!tv.valType.isintegral())
|
||||||
{
|
{
|
||||||
|
@ -586,12 +559,6 @@ extern(D):
|
||||||
{
|
{
|
||||||
mangleNumber(buf, e.toUInteger());
|
mangleNumber(buf, e.toUInteger());
|
||||||
}
|
}
|
||||||
else if (is_dmc_template)
|
|
||||||
{
|
|
||||||
// NOTE: DMC mangles everything based on
|
|
||||||
// unsigned int
|
|
||||||
mangleNumber(buf, e.toInteger());
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sinteger_t val = e.toInteger();
|
sinteger_t val = e.toInteger();
|
||||||
|
@ -624,40 +591,30 @@ extern(D):
|
||||||
else if (e && e.op == EXP.variable && (cast(VarExp)e).var.isVarDeclaration())
|
else if (e && e.op == EXP.variable && (cast(VarExp)e).var.isVarDeclaration())
|
||||||
{
|
{
|
||||||
buf.writeByte('$');
|
buf.writeByte('$');
|
||||||
if (isDmc)
|
buf.writeByte('E');
|
||||||
buf.writeByte('1');
|
|
||||||
else
|
|
||||||
buf.writeByte('E');
|
|
||||||
mangleVariable((cast(VarExp)e).var.isVarDeclaration());
|
mangleVariable((cast(VarExp)e).var.isVarDeclaration());
|
||||||
}
|
}
|
||||||
else if (d && d.isTemplateDeclaration() && d.isTemplateDeclaration().onemember)
|
else if (d && d.isTemplateDeclaration() && d.isTemplateDeclaration().onemember)
|
||||||
{
|
{
|
||||||
Dsymbol ds = d.isTemplateDeclaration().onemember;
|
Dsymbol ds = d.isTemplateDeclaration().onemember;
|
||||||
if (isDmc)
|
if (ds.isUnionDeclaration())
|
||||||
|
{
|
||||||
|
buf.writeByte('T');
|
||||||
|
}
|
||||||
|
else if (ds.isStructDeclaration())
|
||||||
|
{
|
||||||
|
buf.writeByte('U');
|
||||||
|
}
|
||||||
|
else if (ds.isClassDeclaration())
|
||||||
{
|
{
|
||||||
buf.writeByte('V');
|
buf.writeByte('V');
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (ds.isUnionDeclaration())
|
eSink.error(sym.loc, "%s `%s` internal compiler error: C++ templates support only integral value, type parameters, alias templates and alias function parameters",
|
||||||
{
|
sym.kind, sym.toPrettyChars);
|
||||||
buf.writeByte('T');
|
errors = true;
|
||||||
}
|
return;
|
||||||
else if (ds.isStructDeclaration())
|
|
||||||
{
|
|
||||||
buf.writeByte('U');
|
|
||||||
}
|
|
||||||
else if (ds.isClassDeclaration())
|
|
||||||
{
|
|
||||||
buf.writeByte('V');
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
eSink.error(sym.loc, "%s `%s` internal compiler error: C++ templates support only integral value, type parameters, alias templates and alias function parameters",
|
|
||||||
sym.kind, sym.toPrettyChars);
|
|
||||||
errors = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
mangleIdent(d);
|
mangleIdent(d);
|
||||||
}
|
}
|
||||||
|
@ -693,7 +650,6 @@ extern(D):
|
||||||
void mangleName(Dsymbol sym, bool dont_use_back_reference)
|
void mangleName(Dsymbol sym, bool dont_use_back_reference)
|
||||||
{
|
{
|
||||||
//printf("mangleName('%s')\n", sym.toChars());
|
//printf("mangleName('%s')\n", sym.toChars());
|
||||||
bool is_dmc_template = false;
|
|
||||||
|
|
||||||
if (string s = mangleSpecialName(sym))
|
if (string s = mangleSpecialName(sym))
|
||||||
{
|
{
|
||||||
|
@ -704,7 +660,7 @@ extern(D):
|
||||||
void writeName(Identifier name)
|
void writeName(Identifier name)
|
||||||
{
|
{
|
||||||
assert(name);
|
assert(name);
|
||||||
if (!is_dmc_template && dont_use_back_reference)
|
if (dont_use_back_reference)
|
||||||
saveIdent(name);
|
saveIdent(name);
|
||||||
else if (checkAndSaveIdent(name))
|
else if (checkAndSaveIdent(name))
|
||||||
return;
|
return;
|
||||||
|
@ -766,18 +722,13 @@ extern(D):
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
scope VisualCPPMangler tmp = new VisualCPPMangler(isDmc ? true : false, loc, eSink);
|
scope VisualCPPMangler tmp = new VisualCPPMangler(loc, eSink);
|
||||||
tmp.buf.writeByte('?');
|
tmp.buf.writeByte('?');
|
||||||
tmp.buf.writeByte('$');
|
tmp.buf.writeByte('$');
|
||||||
tmp.buf.writestring(symName);
|
tmp.buf.writestring(symName);
|
||||||
tmp.saved_idents[0] = id;
|
tmp.saved_idents[0] = id;
|
||||||
if (symName == id.toString())
|
if (symName == id.toString())
|
||||||
tmp.buf.writeByte('@');
|
tmp.buf.writeByte('@');
|
||||||
if (isDmc)
|
|
||||||
{
|
|
||||||
tmp.mangleIdent(sym.parent, true);
|
|
||||||
is_dmc_template = true;
|
|
||||||
}
|
|
||||||
bool is_var_arg = false;
|
bool is_var_arg = false;
|
||||||
for (size_t i = firstTemplateArg; i < actualti.tiargs.length; i++)
|
for (size_t i = firstTemplateArg; i < actualti.tiargs.length; i++)
|
||||||
{
|
{
|
||||||
|
@ -800,7 +751,7 @@ extern(D):
|
||||||
}
|
}
|
||||||
if (tv)
|
if (tv)
|
||||||
{
|
{
|
||||||
tmp.mangleTemplateValue(o, tv, actualti, is_dmc_template);
|
tmp.mangleTemplateValue(o, tv, actualti);
|
||||||
}
|
}
|
||||||
else if (!tp || tp.isTemplateTypeParameter())
|
else if (!tp || tp.isTemplateTypeParameter())
|
||||||
{
|
{
|
||||||
|
@ -965,8 +916,6 @@ extern(D):
|
||||||
buf.writestring("$$CB");
|
buf.writestring("$$CB");
|
||||||
else if (isNotTopType)
|
else if (isNotTopType)
|
||||||
buf.writeByte('B'); // const
|
buf.writeByte('B'); // const
|
||||||
else if (isDmc && type.ty != Tpointer)
|
|
||||||
buf.writestring("_O");
|
|
||||||
}
|
}
|
||||||
else if (isNotTopType)
|
else if (isNotTopType)
|
||||||
buf.writeByte('A'); // mutable
|
buf.writeByte('A'); // mutable
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue