mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 19:52:54 +01:00
Dllexport stuff cleanup:
1. Emit external function type information for all COFF targets since it's a feature of object format 2. Emit linker directives only for cygming (since this is ld-specific stuff) llvm-svn: 84214
This commit is contained in:
parent
c0762ba283
commit
7d6c12de5b
@ -225,7 +225,7 @@ void X86AsmPrinter::printSymbolOperand(const MachineOperand &MO) {
|
||||
|
||||
std::string Name = Mang->getMangledName(GV, Suffix, Suffix[0] != '\0');
|
||||
if (Subtarget->isTargetCygMing()) {
|
||||
X86COFFMachineModuleInfo &COFFMMI =
|
||||
X86COFFMachineModuleInfo &COFFMMI =
|
||||
MMI->getObjFileInfo<X86COFFMachineModuleInfo>();
|
||||
COFFMMI.DecorateCygMingName(Name, GV, *TM.getTargetData());
|
||||
}
|
||||
@ -871,48 +871,54 @@ void X86AsmPrinter::EmitEndOfAsmFile(Module &M) {
|
||||
// linker can safely perform dead code stripping. Since LLVM never
|
||||
// generates code that does this, it is always safe to set.
|
||||
O << "\t.subsections_via_symbols\n";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (Subtarget->isTargetCOFF()) {
|
||||
// Necessary for dllexport support
|
||||
std::vector<std::string> DLLExportedFns, DLLExportedGlobals;
|
||||
|
||||
X86COFFMachineModuleInfo &COFFMMI =
|
||||
X86COFFMachineModuleInfo &COFFMMI =
|
||||
MMI->getObjFileInfo<X86COFFMachineModuleInfo>();
|
||||
TargetLoweringObjectFileCOFF &TLOFCOFF =
|
||||
static_cast<TargetLoweringObjectFileCOFF&>(getObjFileLowering());
|
||||
|
||||
for (Module::const_iterator I = M.begin(), E = M.end(); I != E; ++I)
|
||||
if (I->hasDLLExportLinkage())
|
||||
DLLExportedFns.push_back(Mang->getMangledName(I));
|
||||
|
||||
for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
|
||||
I != E; ++I)
|
||||
if (I->hasDLLExportLinkage())
|
||||
DLLExportedGlobals.push_back(Mang->getMangledName(I));
|
||||
|
||||
if (Subtarget->isTargetCygMing()) {
|
||||
// Emit type information for external functions
|
||||
for (X86COFFMachineModuleInfo::stub_iterator I = COFFMMI.stub_begin(),
|
||||
// Emit type information for external functions
|
||||
for (X86COFFMachineModuleInfo::stub_iterator I = COFFMMI.stub_begin(),
|
||||
E = COFFMMI.stub_end(); I != E; ++I) {
|
||||
O << "\t.def\t " << I->getKeyData()
|
||||
O << "\t.def\t " << I->getKeyData()
|
||||
<< ";\t.scl\t" << COFF::C_EXT
|
||||
<< ";\t.type\t" << (COFF::DT_FCN << COFF::N_BTSHFT)
|
||||
<< ";\t.endef\n";
|
||||
}
|
||||
}
|
||||
|
||||
// Output linker support code for dllexported globals on windows.
|
||||
if (!DLLExportedGlobals.empty() || !DLLExportedFns.empty()) {
|
||||
OutStreamer.SwitchSection(TLOFCOFF.getCOFFSection(".section .drectve",
|
||||
true,
|
||||
|
||||
if (Subtarget->isTargetCygMing()) {
|
||||
// Necessary for dllexport support
|
||||
std::vector<std::string> DLLExportedFns, DLLExportedGlobals;
|
||||
|
||||
TargetLoweringObjectFileCOFF &TLOFCOFF =
|
||||
static_cast<TargetLoweringObjectFileCOFF&>(getObjFileLowering());
|
||||
|
||||
for (Module::const_iterator I = M.begin(), E = M.end(); I != E; ++I)
|
||||
if (I->hasDLLExportLinkage()) {
|
||||
std::string Name = Mang->getMangledName(I);
|
||||
COFFMMI.DecorateCygMingName(Name, I, *TM.getTargetData());
|
||||
DLLExportedFns.push_back(Name);
|
||||
}
|
||||
|
||||
for (Module::const_global_iterator I = M.global_begin(),
|
||||
E = M.global_end(); I != E; ++I)
|
||||
if (I->hasDLLExportLinkage()) {
|
||||
std::string Name = Mang->getMangledName(I);
|
||||
COFFMMI.DecorateCygMingName(Name, I, *TM.getTargetData());
|
||||
DLLExportedGlobals.push_back(Mang->getMangledName(I));
|
||||
}
|
||||
|
||||
// Output linker support code for dllexported globals on windows.
|
||||
if (!DLLExportedGlobals.empty() || !DLLExportedFns.empty()) {
|
||||
OutStreamer.SwitchSection(TLOFCOFF.getCOFFSection(".section .drectve",
|
||||
true,
|
||||
SectionKind::getMetadata()));
|
||||
|
||||
for (unsigned i = 0, e = DLLExportedGlobals.size(); i != e; ++i)
|
||||
O << "\t.ascii \" -export:" << DLLExportedGlobals[i] << ",data\"\n";
|
||||
|
||||
for (unsigned i = 0, e = DLLExportedFns.size(); i != e; ++i)
|
||||
O << "\t.ascii \" -export:" << DLLExportedFns[i] << "\"\n";
|
||||
for (unsigned i = 0, e = DLLExportedGlobals.size(); i != e; ++i)
|
||||
O << "\t.ascii \" -export:" << DLLExportedGlobals[i] << ",data\"\n";
|
||||
|
||||
for (unsigned i = 0, e = DLLExportedFns.size(); i != e; ++i)
|
||||
O << "\t.ascii \" -export:" << DLLExportedFns[i] << "\"\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user