struct ExportDesc {
ExportDesc()
: ordinal(-1), noname(false), isData(false), isPrivate(false) {}
+
bool operator<(const ExportDesc &other) const {
- return name.compare(other.name) < 0;
+ return getExternalName().compare(other.getExternalName()) < 0;
+ }
+
+ StringRef getExternalName() const {
+ if (!externalName.empty())
+ return externalName;
+ return name;
}
std::string name;
return false;
if (name.find('=') == StringRef::npos) {
ret.name = name;
- ret.externalName = name;
} else {
std::tie(ret.externalName, ret.name) = name.split("=");
if (ret.name.empty())
return false;
}
result.name = _tok._range;
- result.externalName = result.name;
consumeToken();
if (_tok._kind == Kind::equal) {
consumeToken();
if (_tok._kind != Kind::identifier)
return false;
+ result.externalName = result.name;
result.name = _tok._range;
} else {
ungetToken();
// One can export a symbol with a different name than the symbol
// name used in DLL. If such name is specified, use it in the
// .edata section.
- ret.push_back(TableEntry(desc.externalName, desc.ordinal, atom, desc.noname));
+ ret.push_back(TableEntry(desc.getExternalName(), desc.ordinal, atom,
+ desc.noname));
}
std::sort(ret.begin(), ret.end(),
[](const TableEntry &a, const TableEntry &b) {
<< "EXPORTS\n";
for (const PECOFFLinkingContext::ExportDesc &desc : ctx.getDllExports()) {
- os << " " << desc.externalName;
+ os << " " << desc.getExternalName();
if (!desc.isPrivate)
os << " @" << desc.ordinal;
if (desc.noname)
CHECK6: Export Table:
CHECK6: DLL name: export.test.tmp6.dll
CHECK6: Ordinal RVA Name
-CHECK6-NEXT: 1 0x2010 exportfn8
+CHECK6-NEXT: 1 0x2010 ?exportfn8@@YAXXZ
# RUN: lld -flavor link /out:%t6.dll /dll /entry:init \
# RUN: /export:exportfn8 /export:exportfn8 -- %t.obj
DUP: Export Table:
DUP: DLL name: export.test.tmp6.dll
DUP: Ordinal RVA Name
-DUP: 1 0x2010 exportfn8
-DUP-NOT: 1 0x2010 exportfn8
+DUP: 1 0x2010 ?exportfn8@@YAXXZ
+DUP-NOT: 1 0x2010 ?exportfn8@@YAXXZ
# RUN: yaml2obj %p/Inputs/export.obj.yaml > %t.obj
#