forked from OSchip/llvm-project
[PECOFF] Support =internalName syntax in .def file.
Export definitions in a module definition file is as follows: exportedname[=internalname] [@ordinal [NONAME]] [PRIVATE] [DATA] Previously we did not support =internalname, so users couldn't export symbols from a DLL with a different name. llvm-svn: 207827
This commit is contained in:
parent
9663780e35
commit
0e363b75a4
|
@ -67,7 +67,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string name;
|
std::string name;
|
||||||
std::string internalName;
|
std::string externalName;
|
||||||
int ordinal;
|
int ordinal;
|
||||||
bool noname;
|
bool noname;
|
||||||
bool isData;
|
bool isData;
|
||||||
|
|
|
@ -195,6 +195,17 @@ bool Parser::parseExport(PECOFFLinkingContext::ExportDesc &result) {
|
||||||
}
|
}
|
||||||
result.name = _tok._range;
|
result.name = _tok._range;
|
||||||
|
|
||||||
|
consumeToken();
|
||||||
|
if (_tok._kind == Kind::equal) {
|
||||||
|
consumeToken();
|
||||||
|
if (_tok._kind != Kind::identifier)
|
||||||
|
return false;
|
||||||
|
result.externalName = result.name;
|
||||||
|
result.name = _tok._range;
|
||||||
|
} else {
|
||||||
|
ungetToken();
|
||||||
|
}
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
consumeToken();
|
consumeToken();
|
||||||
if (_tok._kind == Kind::identifier && _tok._range[0] == '@') {
|
if (_tok._kind == Kind::identifier && _tok._range[0] == '@') {
|
||||||
|
|
|
@ -77,7 +77,8 @@ static bool getExportedAtoms(PECOFFLinkingContext &ctx, MutableFile *file,
|
||||||
}
|
}
|
||||||
const DefinedAtom *atom = it->second;
|
const DefinedAtom *atom = it->second;
|
||||||
ret.push_back(TableEntry(desc.name, desc.ordinal, atom, desc.noname));
|
ret.push_back(TableEntry(desc.name, desc.ordinal, atom, desc.noname));
|
||||||
desc.internalName = removeLeadingUnderscore(atom->name());
|
if (desc.externalName.empty())
|
||||||
|
desc.externalName = removeLeadingUnderscore(atom->name());
|
||||||
exports.insert(desc);
|
exports.insert(desc);
|
||||||
}
|
}
|
||||||
ctx.getDllExports().swap(exports);
|
ctx.getDllExports().swap(exports);
|
||||||
|
|
|
@ -30,7 +30,7 @@ createModuleDefinitionFile(const PECOFFLinkingContext &ctx) {
|
||||||
<< "EXPORTS\n";
|
<< "EXPORTS\n";
|
||||||
|
|
||||||
for (const PECOFFLinkingContext::ExportDesc &desc : ctx.getDllExports()) {
|
for (const PECOFFLinkingContext::ExportDesc &desc : ctx.getDllExports()) {
|
||||||
os << " " << desc.internalName << " @" << desc.ordinal;
|
os << " " << desc.externalName << " @" << desc.ordinal;
|
||||||
if (desc.noname)
|
if (desc.noname)
|
||||||
os << " NONAME";
|
os << " NONAME";
|
||||||
if (desc.isData)
|
if (desc.isData)
|
||||||
|
|
|
@ -48,4 +48,10 @@ symbols:
|
||||||
SimpleType: IMAGE_SYM_TYPE_NULL
|
SimpleType: IMAGE_SYM_TYPE_NULL
|
||||||
ComplexType: IMAGE_SYM_DTYPE_NULL
|
ComplexType: IMAGE_SYM_DTYPE_NULL
|
||||||
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
|
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
|
||||||
|
- Name: _exportfn6
|
||||||
|
Value: 16
|
||||||
|
SectionNumber: 1
|
||||||
|
SimpleType: IMAGE_SYM_TYPE_NULL
|
||||||
|
ComplexType: IMAGE_SYM_DTYPE_NULL
|
||||||
|
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
|
||||||
...
|
...
|
||||||
|
|
|
@ -3,3 +3,4 @@
|
||||||
EXPORTS
|
EXPORTS
|
||||||
exportfn1 @5 ; foo
|
exportfn1 @5 ; foo
|
||||||
exportfn2
|
exportfn2
|
||||||
|
exportfn5=exportfn6
|
||||||
|
|
|
@ -39,4 +39,5 @@ CHECK4: DLL name: export.test.tmp4.dll
|
||||||
CHECK4: Ordinal RVA Name
|
CHECK4: Ordinal RVA Name
|
||||||
CHECK4-NEXT: 5 0x2008 exportfn1
|
CHECK4-NEXT: 5 0x2008 exportfn1
|
||||||
CHECK4-NEXT: 6 0x2010 exportfn2
|
CHECK4-NEXT: 6 0x2010 exportfn2
|
||||||
CHECK4-NEXT: 7 0x2010 exportfn3@256
|
CHECK4-NEXT: 7 0x2010 exportfn6
|
||||||
|
CHECK4-NEXT: 8 0x2010 exportfn3@256
|
||||||
|
|
Loading…
Reference in New Issue