Get rid of obsolete DMC mangling special cases

This commit is contained in:
Martin Kinkelin 2024-05-25 15:44:23 +02:00
parent 99069d9fb8
commit dd673700c0

View file

@ -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