From fda4b225f85c2a517c956f5489d0d6962510d8ab Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 10 May 2014 13:55:09 +0000 Subject: [PATCH] [SPEC2DEF] Add support for adding aliases when exporting data by specifying the -withalias switch. This will cause MS LINK to generate _FooVar as an alias alias for _imp__FooVar. While this looks wrong and is not the way you usually handle data imports, this is what we have in the DDK for a number of data exports like KdDebuggerNotPresent, IoFileObjectType, ..., which we currently define in an incompatible way. Remove stdcall decorations on non-x86 builds svn path=/trunk/; revision=63217 --- reactos/tools/spec2def/spec2def.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/reactos/tools/spec2def/spec2def.c b/reactos/tools/spec2def/spec2def.c index 018b72fe424..de427f06e19 100644 --- a/reactos/tools/spec2def/spec2def.c +++ b/reactos/tools/spec2def/spec2def.c @@ -52,6 +52,7 @@ enum FL_STUB = 2, FL_NONAME = 4, FL_ORDINAL = 8, + FL_DATA_ALIAS = 16 }; enum @@ -369,6 +370,15 @@ PrintName(FILE *fileDest, EXPORT *pexp, PSTRING pstr, int fDeco) } else { + /* Does the string already have stdcall decoration? */ + pcAt = ScanToken(pcName, '@'); + if (pcAt && (pcAt < (pcName + nNameLength)) && pcName[0] == '_') + { + /* Skip leading underscore and remove trailing decoration */ + pcName++; + nNameLength = pcAt - pcName; + } + /* Print the undecorated function name */ fprintf(fileDest, "%.*s", nNameLength, pcName); } @@ -492,7 +502,9 @@ OutputLine_def(FILE *fileDest, EXPORT *pexp) fprintf(fileDest, " PRIVATE"); } - if (pexp->nCallingConvention == CC_EXTERN) + /* Make this a data export, unless this is MSVC and -withalias was given */ + if ((pexp->nCallingConvention == CC_EXTERN) && + !(gbMSComp && (pexp->uFlags & FL_DATA_ALIAS))) { fprintf(fileDest, " DATA"); } @@ -645,6 +657,15 @@ ParseFile(char* pcStart, FILE *fileDest, PFNOUTLINE OutputLine) { exp.uFlags |= FL_STUB; } + else if (CompareToken(pc, "-withalias")) + { + /* This flag is to create a nin _imp_ prefixed alias for a + data export, so that the hacked DDK declarations work */ + if (exp.nCallingConvention != CC_EXTERN) + fprintf(stderr, "error: line %d -withalias on non-data export\n", nLine); + else + exp.uFlags |= FL_DATA_ALIAS; + } else if (CompareToken(pc, "-norelay") || CompareToken(pc, "-register") || CompareToken(pc, "-ret64"))