mirror of
https://github.com/dlang/dmd.git
synced 2025-04-25 20:50:41 +03:00
upgrade obj_mangle2() to use OutBuffer (#21209)
This commit is contained in:
parent
b553068344
commit
f5ef1eb0da
1 changed files with 31 additions and 39 deletions
|
@ -545,6 +545,9 @@ void build_syment_table(bool bigobj)
|
||||||
/* Add symbols from symbuf[]
|
/* Add symbols from symbuf[]
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
OutBuffer buf;
|
||||||
|
buf.reserve(DEST_LEN + 1); // pre-allocate some space
|
||||||
|
|
||||||
int n = cast(int)SegData.length;
|
int n = cast(int)SegData.length;
|
||||||
size_t dim = symbuf.length() / (Symbol*).sizeof;
|
size_t dim = symbuf.length() / (Symbol*).sizeof;
|
||||||
for (size_t i = 0; i < dim; i++)
|
for (size_t i = 0; i < dim; i++)
|
||||||
|
@ -554,9 +557,9 @@ void build_syment_table(bool bigobj)
|
||||||
|
|
||||||
SymbolTable32 sym;
|
SymbolTable32 sym;
|
||||||
|
|
||||||
char[DEST_LEN+1] dest = void;
|
buf.reset();
|
||||||
char* destr = obj_mangle2(s, dest.ptr);
|
obj_mangle2(s, buf);
|
||||||
syment_set_name(&sym, destr);
|
syment_set_name(&sym, buf.peekChars());
|
||||||
|
|
||||||
sym.Value = 0;
|
sym.Value = 0;
|
||||||
switch (s.Sclass)
|
switch (s.Sclass)
|
||||||
|
@ -1672,35 +1675,36 @@ private extern (D) char* unsstr(uint value)
|
||||||
|
|
||||||
/*******************************
|
/*******************************
|
||||||
* Mangle a name.
|
* Mangle a name.
|
||||||
* Returns:
|
* Params:
|
||||||
* mangled name
|
* s = Symbol
|
||||||
|
* buf = sink for mangled name
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@trusted
|
@trusted
|
||||||
private extern (D)
|
private extern (D)
|
||||||
char* obj_mangle2(Symbol* s,char* dest)
|
void obj_mangle2(Symbol* s, ref OutBuffer buf)
|
||||||
{
|
{
|
||||||
size_t len;
|
size_t len;
|
||||||
const(char)* name;
|
const(char)* name;
|
||||||
|
|
||||||
//printf("MsCoffObj_mangle(s = %p, '%s'), mangle = x%x\n",s,s.Sident.ptr,type_mangle(s.Stype));
|
//printf("MsCoffObj_mangle(s = %p, '%s'), mangle = x%x\n",s,s.Sident.ptr,type_mangle(s.Stype));
|
||||||
symbol_debug(s);
|
symbol_debug(s);
|
||||||
assert(dest);
|
|
||||||
|
|
||||||
// C++ name mangling is handled by front end
|
// C++ name mangling is handled by front end
|
||||||
name = &s.Sident[0];
|
name = &s.Sident[0];
|
||||||
|
|
||||||
len = strlen(name); // # of bytes in name
|
len = strlen(name); // # of bytes in name
|
||||||
//dbg_printf("len %d\n",len);
|
//dbg_printf("len %d\n",len);
|
||||||
|
|
||||||
switch (type_mangle(s.Stype))
|
switch (type_mangle(s.Stype))
|
||||||
{
|
{
|
||||||
case Mangle.pascal: // if upper case
|
case Mangle.pascal: // if upper case
|
||||||
case Mangle.fortran:
|
case Mangle.fortran:
|
||||||
if (len >= DEST_LEN)
|
foreach (c; name[0 .. len])
|
||||||
dest = cast(char*)mem_malloc(len + 1);
|
{
|
||||||
memcpy(dest,name,len + 1); // copy in name and ending 0
|
buf.writeByte(('a' <= c && c <= 'z') ? c - 'a' + 'A' : c); // to upper case
|
||||||
strupr(dest); // to upper case
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Mangle.stdcall:
|
case Mangle.stdcall:
|
||||||
if (!(config.flags4 & CFG4oldstdmangle) &&
|
if (!(config.flags4 & CFG4oldstdmangle) &&
|
||||||
config.exe == EX_WIN32 && tyfunc(s.ty()) &&
|
config.exe == EX_WIN32 && tyfunc(s.ty()) &&
|
||||||
|
@ -1708,37 +1712,26 @@ char* obj_mangle2(Symbol* s,char* dest)
|
||||||
{
|
{
|
||||||
char* pstr = unsstr(type_paramsize(s.Stype));
|
char* pstr = unsstr(type_paramsize(s.Stype));
|
||||||
size_t pstrlen = strlen(pstr);
|
size_t pstrlen = strlen(pstr);
|
||||||
size_t prelen = I32 ? 1 : 0;
|
|
||||||
size_t destlen = prelen + len + 1 + pstrlen + 1;
|
|
||||||
|
|
||||||
if (destlen > DEST_LEN)
|
if (I32)
|
||||||
dest = cast(char*)mem_malloc(destlen);
|
buf.writeByte('_');
|
||||||
dest[0] = '_';
|
buf.write(name[0 .. len]);
|
||||||
memcpy(dest + prelen,name,len);
|
buf.writeByte('@');
|
||||||
dest[prelen + len] = '@';
|
buf.write(pstr[0 .. pstrlen]);
|
||||||
memcpy(dest + prelen + 1 + len, pstr, pstrlen + 1);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
goto case 0;
|
||||||
|
|
||||||
|
case Mangle.c:
|
||||||
|
case Mangle.d:
|
||||||
|
if (I32)
|
||||||
|
buf.writeByte('_'); // Prepend _ to identifier
|
||||||
goto case;
|
goto case;
|
||||||
|
|
||||||
case Mangle.cpp:
|
case Mangle.cpp:
|
||||||
case Mangle.syscall:
|
case Mangle.syscall:
|
||||||
case_mTYman_c64:
|
|
||||||
case 0:
|
case 0:
|
||||||
if (len >= DEST_LEN)
|
buf.write(name[0 .. len]);
|
||||||
dest = cast(char*)mem_malloc(len + 1);
|
|
||||||
memcpy(dest,name,len+1);// copy in name and trailing 0
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Mangle.c:
|
|
||||||
case Mangle.d:
|
|
||||||
if(I64)
|
|
||||||
goto case_mTYman_c64;
|
|
||||||
// Prepend _ to identifier
|
|
||||||
if (len >= DEST_LEN - 1)
|
|
||||||
dest = cast(char*)mem_malloc(1 + len + 1);
|
|
||||||
dest[0] = '_';
|
|
||||||
memcpy(dest + 1,name,len+1);// copy in name and trailing 0
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -1751,7 +1744,6 @@ debug
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
//dbg_printf("\t %s\n",dest);
|
//dbg_printf("\t %s\n",dest);
|
||||||
return dest;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************
|
/*******************************
|
||||||
|
@ -1761,15 +1753,15 @@ debug
|
||||||
@trusted
|
@trusted
|
||||||
void MsCoffObj_export_symbol(Symbol* s,uint argsize)
|
void MsCoffObj_export_symbol(Symbol* s,uint argsize)
|
||||||
{
|
{
|
||||||
char[DEST_LEN+1] dest = void;
|
OutBuffer buf;
|
||||||
char* destr = obj_mangle2(s, dest.ptr);
|
obj_mangle2(s, buf);
|
||||||
|
|
||||||
int seg = MsCoffObj_seg_drectve();
|
int seg = MsCoffObj_seg_drectve();
|
||||||
//printf("MsCoffObj_export_symbol(%s,%d)\n",s.Sident.ptr,argsize);
|
//printf("MsCoffObj_export_symbol(%s,%d)\n",s.Sident.ptr,argsize);
|
||||||
SegData[seg].SDbuf.write(" /EXPORT:".ptr, 9);
|
SegData[seg].SDbuf.write(" /EXPORT:".ptr, 9);
|
||||||
// obj_mangle2 may not use the buffer dest,
|
// obj_mangle2 may not use the buffer dest,
|
||||||
// this will result in https://issues.dlang.org/show_bug.cgi?id=24340
|
// this will result in https://issues.dlang.org/show_bug.cgi?id=24340
|
||||||
SegData[seg].SDbuf.write(destr, cast(uint)strlen(destr));
|
SegData[seg].SDbuf.write(&buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************
|
/*******************************
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue