|
35 | 35 | #include "clang/Lex/HeaderSearch.h"
|
36 | 36 | #include "clang/Lex/HeaderSearchOptions.h"
|
37 | 37 | #include "clang/Frontend/CodeGenOptions.h"
|
| 38 | +#include "llvm/IR/IRBuilder.h" |
38 | 39 | #include "llvm/IR/Constants.h"
|
39 | 40 | #include "llvm/IR/DataLayout.h"
|
40 | 41 | #include "llvm/IR/DerivedTypes.h"
|
@@ -851,19 +852,20 @@ void IRGenModule::addLinkLibrary(const LinkLibrary &linkLib) {
|
851 | 852 | if (linkLib.shouldForceLoad()) {
|
852 | 853 | llvm::SmallString<64> buf;
|
853 | 854 | encodeForceLoadSymbolName(buf, linkLib.getName());
|
854 |
| - auto symbolAddr = Module.getOrInsertGlobal(buf.str(), Int1Ty); |
| 855 | + auto ForceImportThunk = |
| 856 | + Module.getOrInsertFunction(buf, llvm::FunctionType::get(VoidTy, false)); |
855 | 857 | if (useDllStorage())
|
856 |
| - cast<llvm::GlobalVariable>(symbolAddr) |
| 858 | + cast<llvm::GlobalValue>(ForceImportThunk) |
857 | 859 | ->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
|
858 | 860 |
|
859 | 861 | buf += "_$";
|
860 | 862 | appendEncodedName(buf, IRGen.Opts.ModuleName);
|
861 | 863 |
|
862 | 864 | if (!Module.getGlobalVariable(buf.str())) {
|
863 |
| - auto ref = new llvm::GlobalVariable(Module, symbolAddr->getType(), |
| 865 | + auto ref = new llvm::GlobalVariable(Module, ForceImportThunk->getType(), |
864 | 866 | /*isConstant=*/true,
|
865 | 867 | llvm::GlobalValue::WeakAnyLinkage,
|
866 |
| - symbolAddr, buf.str()); |
| 868 | + ForceImportThunk, buf.str()); |
867 | 869 | ref->setVisibility(llvm::GlobalValue::HiddenVisibility);
|
868 | 870 | auto casted = llvm::ConstantExpr::getBitCast(ref, Int8PtrTy);
|
869 | 871 | LLVMUsed.push_back(casted);
|
@@ -953,13 +955,17 @@ void IRGenModule::emitAutolinkInfo() {
|
953 | 955 | if (!IRGen.Opts.ForceLoadSymbolName.empty()) {
|
954 | 956 | llvm::SmallString<64> buf;
|
955 | 957 | encodeForceLoadSymbolName(buf, IRGen.Opts.ForceLoadSymbolName);
|
956 |
| - auto symbol = |
957 |
| - new llvm::GlobalVariable(Module, Int1Ty, /*isConstant=*/false, |
958 |
| - llvm::GlobalValue::CommonLinkage, |
959 |
| - llvm::Constant::getNullValue(Int1Ty), |
960 |
| - buf.str()); |
| 958 | + auto ForceImportThunk = |
| 959 | + llvm::Function::Create(llvm::FunctionType::get(VoidTy, false), |
| 960 | + llvm::GlobalValue::WeakODRLinkage, buf, |
| 961 | + &Module); |
961 | 962 | if (useDllStorage())
|
962 |
| - symbol->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass); |
| 963 | + ForceImportThunk |
| 964 | + ->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass); |
| 965 | + |
| 966 | + auto BB = llvm::BasicBlock::Create(getLLVMContext(), "", ForceImportThunk); |
| 967 | + llvm::IRBuilder<> IRB(BB); |
| 968 | + IRB.CreateRetVoid(); |
963 | 969 | }
|
964 | 970 | }
|
965 | 971 |
|
|
0 commit comments