forked from xt-sys/xtchain
This toolchain is based on LLVM and we do not need GCC support in SPEC compiler.
This commit is contained in:
parent
91b34c1656
commit
c9e595cbb0
160
tools/xtcspecc.c
160
tools/xtcspecc.c
@ -49,7 +49,6 @@ enum _ARCH
|
|||||||
};
|
};
|
||||||
|
|
||||||
typedef int (*PFNOUTLINE)(FILE *, EXPORT *);
|
typedef int (*PFNOUTLINE)(FILE *, EXPORT *);
|
||||||
int gbMSComp = 0;
|
|
||||||
int gbImportLib = 0;
|
int gbImportLib = 0;
|
||||||
int gbNotPrivateNoWarn = 0;
|
int gbNotPrivateNoWarn = 0;
|
||||||
int gbTracing = 0;
|
int gbTracing = 0;
|
||||||
@ -531,20 +530,13 @@ PrintName(FILE *fileDest,
|
|||||||
pcAt = ScanToken(pcName, '@');
|
pcAt = ScanToken(pcName, '@');
|
||||||
if(pcAt && (pcAt < (pcName + nNameLength)))
|
if(pcAt && (pcAt < (pcName + nNameLength)))
|
||||||
{
|
{
|
||||||
/* On GCC, we need to remove the leading stdcall underscore */
|
|
||||||
if(!gbMSComp && (pexp->nCallingConvention == CC_STDCALL))
|
|
||||||
{
|
|
||||||
pcName++;
|
|
||||||
nNameLength--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Print the already decorated function name */
|
/* Print the already decorated function name */
|
||||||
fprintf(fileDest, "%.*s", nNameLength, pcName);
|
fprintf(fileDest, "%.*s", nNameLength, pcName);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Print the prefix, but skip it for (GCC && stdcall) */
|
/* Print the prefix, but skip it for stdcall */
|
||||||
if(gbMSComp || (pexp->nCallingConvention != CC_STDCALL))
|
if(pexp->nCallingConvention != CC_STDCALL)
|
||||||
{
|
{
|
||||||
fprintf(fileDest, "%c", pexp->nCallingConvention == CC_FASTCALL ? '@' : '_');
|
fprintf(fileDest, "%c", pexp->nCallingConvention == CC_FASTCALL ? '@' : '_');
|
||||||
}
|
}
|
||||||
@ -560,10 +552,13 @@ PrintName(FILE *fileDest,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
int
|
||||||
OutputLine_def_MS(FILE *fileDest,
|
OutputLine_def(FILE *fileDest,
|
||||||
EXPORT *pexp)
|
EXPORT *pexp)
|
||||||
{
|
{
|
||||||
|
DbgPrint("OutputLine_def: '%.*s'...\n", pexp->strName.len, pexp->strName.buf);
|
||||||
|
fprintf(fileDest, " ");
|
||||||
|
|
||||||
PrintName(fileDest, pexp, &pexp->strName, 0);
|
PrintName(fileDest, pexp, &pexp->strName, 0);
|
||||||
|
|
||||||
if(gbImportLib)
|
if(gbImportLib)
|
||||||
@ -610,92 +605,6 @@ OutputLine_def_MS(FILE *fileDest,
|
|||||||
/* Redirect it to the relay-tracing trampoline */
|
/* Redirect it to the relay-tracing trampoline */
|
||||||
fprintf(fileDest, "=$relaytrace$%.*s", pexp->strName.len, pexp->strName.buf);
|
fprintf(fileDest, "=$relaytrace$%.*s", pexp->strName.len, pexp->strName.buf);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
OutputLine_def_GCC(FILE *fileDest,
|
|
||||||
EXPORT *pexp)
|
|
||||||
{
|
|
||||||
int bTracing = 0;
|
|
||||||
/* Print the function name, with decoration for export libs */
|
|
||||||
PrintName(fileDest, pexp, &pexp->strName, gbImportLib);
|
|
||||||
DbgPrint("Generating def line for '%.*s'\n", pexp->strName.len, pexp->strName.buf);
|
|
||||||
|
|
||||||
/* Check if this is a forwarded export */
|
|
||||||
if(pexp->strTarget.buf)
|
|
||||||
{
|
|
||||||
int fIsExternal = !!ScanToken(pexp->strTarget.buf, '.');
|
|
||||||
DbgPrint("Got redirect '%.*s'\n", pexp->strTarget.len, pexp->strTarget.buf);
|
|
||||||
|
|
||||||
/* print the target name, don't decorate if it is external */
|
|
||||||
fprintf(fileDest, "=");
|
|
||||||
PrintName(fileDest, pexp, &pexp->strTarget, !fIsExternal);
|
|
||||||
}
|
|
||||||
else if(((pexp->uFlags & FL_STUB) || (pexp->nCallingConvention == CC_STUB)) &&
|
|
||||||
(pexp->strName.buf[0] == '?'))
|
|
||||||
{
|
|
||||||
/* C++ stubs are forwarded to C stubs */
|
|
||||||
fprintf(fileDest, "=stub_function%d", pexp->nNumber);
|
|
||||||
}
|
|
||||||
else if(gbTracing && ((pexp->uFlags & FL_NORELAY) == 0) &&
|
|
||||||
(pexp->nCallingConvention == CC_STDCALL) &&
|
|
||||||
(pexp->strName.buf[0] != '?'))
|
|
||||||
{
|
|
||||||
/* Redirect it to the relay-tracing trampoline */
|
|
||||||
char buf[256];
|
|
||||||
STRING strTarget;
|
|
||||||
fprintf(fileDest, "=");
|
|
||||||
sprintf(buf, "$relaytrace$%.*s", pexp->strName.len, pexp->strName.buf);
|
|
||||||
strTarget.buf = buf;
|
|
||||||
strTarget.len = pexp->strName.len + 12;
|
|
||||||
PrintName(fileDest, pexp, &strTarget, 1);
|
|
||||||
bTracing = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Special handling for stdcall and fastcall */
|
|
||||||
if((giArch == ARCH_X86) &&
|
|
||||||
((pexp->nCallingConvention == CC_STDCALL) ||
|
|
||||||
(pexp->nCallingConvention == CC_FASTCALL)))
|
|
||||||
{
|
|
||||||
/* Is this the import lib? */
|
|
||||||
if(gbImportLib)
|
|
||||||
{
|
|
||||||
/* Is the name in the spec file decorated? */
|
|
||||||
const char* pcDeco = ScanToken(pexp->strName.buf, '@');
|
|
||||||
if(pcDeco &&
|
|
||||||
(pexp->strName.len > 1) &&
|
|
||||||
(pcDeco < pexp->strName.buf + pexp->strName.len))
|
|
||||||
{
|
|
||||||
/* Write the name including the leading @ */
|
|
||||||
fprintf(fileDest, "==%.*s", pexp->strName.len, pexp->strName.buf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if((!pexp->strTarget.buf) && !(bTracing))
|
|
||||||
{
|
|
||||||
/* Write a forwarder to the actual decorated symbol */
|
|
||||||
fprintf(fileDest, "=");
|
|
||||||
PrintName(fileDest, pexp, &pexp->strName, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
OutputLine_def(FILE *fileDest,
|
|
||||||
EXPORT *pexp)
|
|
||||||
{
|
|
||||||
DbgPrint("OutputLine_def: '%.*s'...\n", pexp->strName.len, pexp->strName.buf);
|
|
||||||
fprintf(fileDest, " ");
|
|
||||||
|
|
||||||
if(gbMSComp)
|
|
||||||
OutputLine_def_MS(fileDest, pexp);
|
|
||||||
else
|
|
||||||
OutputLine_def_GCC(fileDest, pexp);
|
|
||||||
|
|
||||||
/* On GCC builds we force ordinals */
|
|
||||||
if((pexp->uFlags & FL_ORDINAL) || (!gbMSComp && !gbImportLib))
|
|
||||||
{
|
|
||||||
fprintf(fileDest, " @%d", pexp->nOrdinal);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(pexp->uFlags & FL_NONAME)
|
if(pexp->uFlags & FL_NONAME)
|
||||||
{
|
{
|
||||||
@ -1028,10 +937,6 @@ ParseFile(char* pcStart,
|
|||||||
else if(CompareToken(pc, "-ordinal"))
|
else if(CompareToken(pc, "-ordinal"))
|
||||||
{
|
{
|
||||||
exp.uFlags |= FL_ORDINAL;
|
exp.uFlags |= FL_ORDINAL;
|
||||||
/* GCC doesn't automatically import by ordinal if an ordinal
|
|
||||||
* is found in the def file. Force it. */
|
|
||||||
if(gbImportLib && !gbMSComp)
|
|
||||||
exp.uFlags |= FL_NONAME;
|
|
||||||
}
|
}
|
||||||
else if(CompareToken(pc, "-stub"))
|
else if(CompareToken(pc, "-stub"))
|
||||||
{
|
{
|
||||||
@ -1226,41 +1131,6 @@ ParseFile(char* pcStart,
|
|||||||
Fatal(pszSourceFileName, nLine, pcLine, pc, 0, "Ordinal export without ordinal");
|
Fatal(pszSourceFileName, nLine, pcLine, pc, 0, "Ordinal export without ordinal");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Check for special handling of OLE exports, only when MSVC
|
|
||||||
* is not used, since otherwise this is handled by MS LINK.EXE.
|
|
||||||
*/
|
|
||||||
if(!gbMSComp)
|
|
||||||
{
|
|
||||||
/* Check whether the current export is not PRIVATE, or has an ordinal */
|
|
||||||
int bIsNotPrivate = (!gbNotPrivateNoWarn && /*gbImportLib &&*/ !(exp.uFlags & FL_PRIVATE));
|
|
||||||
int bHasOrdinal = (exp.uFlags & FL_ORDINAL);
|
|
||||||
|
|
||||||
/* Check whether the current export is an OLE export, in case any of these tests pass */
|
|
||||||
if(bIsNotPrivate || bHasOrdinal)
|
|
||||||
{
|
|
||||||
for(i = 0; i < ARRAYSIZE(astrOlePrivateExports); ++i)
|
|
||||||
{
|
|
||||||
if(strlen(astrOlePrivateExports[i]) == exp.strName.len &&
|
|
||||||
strncmp(exp.strName.buf, astrOlePrivateExports[i], exp.strName.len) == 0)
|
|
||||||
{
|
|
||||||
/* The current export is an OLE export: display the corresponding warning */
|
|
||||||
if(bIsNotPrivate)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "WARNING: %s line %d: Exported symbol '%.*s' should be PRIVATE\n",
|
|
||||||
pszSourceFileName, nLine, exp.strName.len, exp.strName.buf);
|
|
||||||
}
|
|
||||||
if(bHasOrdinal)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "WARNING: %s line %d: exported symbol '%.*s' should not be assigned an ordinal\n",
|
|
||||||
pszSourceFileName, nLine, exp.strName.len, exp.strName.buf);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pexports[*cExports] = exp;
|
pexports[*cExports] = exp;
|
||||||
(*cExports)++;
|
(*cExports)++;
|
||||||
gbDebug = 0;
|
gbDebug = 0;
|
||||||
@ -1329,7 +1199,6 @@ void usage(void)
|
|||||||
" -n=<name> name of the dll\n"
|
" -n=<name> name of the dll\n"
|
||||||
" -a=<arch> set architecture to one of: aarch64, armv7, i686, x86_64\n"
|
" -a=<arch> set architecture to one of: aarch64, armv7, i686, x86_64\n"
|
||||||
" --implib generate a def file for an import library\n"
|
" --implib generate a def file for an import library\n"
|
||||||
" --msvc MSVC compatibility\n"
|
|
||||||
" --no-private-warnings suppress warnings about symbols that should be private\n"
|
" --no-private-warnings suppress warnings about symbols that should be private\n"
|
||||||
" --with-tracing generate wine-like \"+relay\" trace trampolines (needs -s)\n",
|
" --with-tracing generate wine-like \"+relay\" trace trampolines (needs -s)\n",
|
||||||
XTCSPECC_VERSION,
|
XTCSPECC_VERSION,
|
||||||
@ -1393,10 +1262,6 @@ int main(int argc,
|
|||||||
{
|
{
|
||||||
gbImportLib = 1;
|
gbImportLib = 1;
|
||||||
}
|
}
|
||||||
else if(strcasecmp(argv[i], "--msvc") == 0)
|
|
||||||
{
|
|
||||||
gbMSComp = 1;
|
|
||||||
}
|
|
||||||
else if(strcasecmp(argv[i], "--no-private-warnings") == 0)
|
else if(strcasecmp(argv[i], "--no-private-warnings") == 0)
|
||||||
{
|
{
|
||||||
gbNotPrivateNoWarn = 1;
|
gbNotPrivateNoWarn = 1;
|
||||||
@ -1516,15 +1381,6 @@ int main(int argc,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!gbMSComp)
|
|
||||||
{
|
|
||||||
if(ApplyOrdinals(pexports, cExports) < 0)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "error: could not apply ordinals!\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(pszDefFileName)
|
if(pszDefFileName)
|
||||||
{
|
{
|
||||||
/* Open output file */
|
/* Open output file */
|
||||||
|
Loading…
Reference in New Issue
Block a user