Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[COFF] Move MinGW specific functions/classes to a separate file. NFC.
Differential Revision: https://reviews.llvm.org/D39067 llvm-svn: 316178
- Loading branch information
Showing
5 changed files
with
161 additions
and
107 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,119 @@ | ||
//===- MinGW.cpp ----------------------------------------------------------===// | ||
// | ||
// The LLVM Linker | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#include "MinGW.h" | ||
#include "Error.h" | ||
#include "llvm/Object/COFF.h" | ||
#include "llvm/Support/Path.h" | ||
#include "llvm/Support/raw_ostream.h" | ||
|
||
using namespace lld; | ||
using namespace lld::coff; | ||
using namespace llvm; | ||
using namespace llvm::COFF; | ||
|
||
AutoExporter::AutoExporter() { | ||
if (Config->Machine == I386) | ||
ExcludeSymbols = { | ||
"__NULL_IMPORT_DESCRIPTOR", | ||
"__pei386_runtime_relocator", | ||
"_do_pseudo_reloc", | ||
"_impure_ptr", | ||
"__impure_ptr", | ||
"__fmode", | ||
"_environ", | ||
"___dso_handle", | ||
// These are the MinGW names that differ from the standard | ||
// ones (lacking an extra underscore). | ||
"_DllMain@12", | ||
"_DllEntryPoint@12", | ||
"_DllMainCRTStartup@12", | ||
}; | ||
else | ||
ExcludeSymbols = { | ||
"_NULL_IMPORT_DESCRIPTOR", | ||
"_pei386_runtime_relocator", | ||
"do_pseudo_reloc", | ||
"impure_ptr", | ||
"_impure_ptr", | ||
"_fmode", | ||
"environ", | ||
"__dso_handle", | ||
// These are the MinGW names that differ from the standard | ||
// ones (lacking an extra underscore). | ||
"DllMain", | ||
"DllEntryPoint", | ||
"DllMainCRTStartup", | ||
}; | ||
|
||
ExcludeLibs = { | ||
"libgcc", | ||
"libgcc_s", | ||
"libstdc++", | ||
"libmingw32", | ||
"libmingwex", | ||
"libg2c", | ||
"libsupc++", | ||
"libobjc", | ||
"libgcj", | ||
"libclang_rt.builtins-aarch64", | ||
"libclang_rt.builtins-arm", | ||
"libclang_rt.builtins-i386", | ||
"libclang_rt.builtins-x86_64", | ||
}; | ||
ExcludeObjects = { | ||
"crt0.o", | ||
"crt1.o", | ||
"crt1u.o", | ||
"crt2.o", | ||
"crt2u.o", | ||
"dllcrt1.o", | ||
"dllcrt2.o", | ||
"gcrt0.o", | ||
"gcrt1.o", | ||
"gcrt2.o", | ||
"crtbegin.o", | ||
"crtend.o", | ||
}; | ||
} | ||
|
||
bool AutoExporter::shouldExport(Defined *Sym) const { | ||
if (!Sym || !Sym->isLive() || !Sym->getChunk()) | ||
return false; | ||
if (ExcludeSymbols.count(Sym->getName())) | ||
return false; | ||
StringRef LibName = sys::path::filename(Sym->getFile()->ParentName); | ||
// Drop the file extension. | ||
LibName = LibName.substr(0, LibName.rfind('.')); | ||
if (ExcludeLibs.count(LibName)) | ||
return false; | ||
StringRef FileName = sys::path::filename(Sym->getFile()->getName()); | ||
if (LibName.empty() && ExcludeObjects.count(FileName)) | ||
return false; | ||
return true; | ||
} | ||
|
||
void coff::writeDefFile(StringRef Name) { | ||
std::error_code EC; | ||
raw_fd_ostream OS(Name, EC, sys::fs::F_None); | ||
if (EC) | ||
fatal("cannot open " + Name + ": " + EC.message()); | ||
|
||
OS << "EXPORTS\n"; | ||
for (Export &E : Config->Exports) { | ||
OS << " " << E.ExportName << " " | ||
<< "@" << E.Ordinal; | ||
if (auto *Def = dyn_cast_or_null<Defined>(E.Sym)) { | ||
if (Def && Def->getChunk() && | ||
!(Def->getChunk()->getPermissions() & IMAGE_SCN_MEM_EXECUTE)) | ||
OS << " DATA"; | ||
} | ||
OS << "\n"; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
//===- MinGW.h --------------------------------------------------*- C++ -*-===// | ||
// | ||
// The LLVM Linker | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef LLD_COFF_MINGW_H | ||
#define LLD_COFF_MINGW_H | ||
|
||
#include "Config.h" | ||
#include "Symbols.h" | ||
#include "lld/Common/LLVM.h" | ||
|
||
namespace lld { | ||
namespace coff { | ||
|
||
// Logic for deciding what symbols to export, when exporting all | ||
// symbols for MinGW. | ||
class AutoExporter { | ||
public: | ||
AutoExporter(); | ||
|
||
StringSet<> ExcludeSymbols; | ||
StringSet<> ExcludeLibs; | ||
StringSet<> ExcludeObjects; | ||
|
||
bool shouldExport(Defined *Sym) const; | ||
}; | ||
|
||
void writeDefFile(StringRef Name); | ||
|
||
} // namespace coff | ||
} // namespace lld | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters