[llvm] r344391 - [SanitizerCoverage] Prevent /OPT:REF from stripping constructors
Jonathan Metzman via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 12 11:11:47 PDT 2018
Author: metzman
Date: Fri Oct 12 11:11:47 2018
New Revision: 344391
URL: http://llvm.org/viewvc/llvm-project?rev=344391&view=rev
Log:
[SanitizerCoverage] Prevent /OPT:REF from stripping constructors
Summary:
Linking with the /OPT:REF linker flag when building COFF files causes
the linker to strip SanitizerCoverage's constructors. Prevent this by
giving the constructors WeakODR linkage and by passing the linker a
directive to include sancov.module_ctor.
Include a test in compiler-rt to verify libFuzzer can be linked using
/OPT:REF
Reviewers: morehouse, rnk
Reviewed By: morehouse, rnk
Subscribers: rnk, morehouse, hiraditya
Differential Revision: https://reviews.llvm.org/D52119
Modified:
llvm/trunk/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
Modified: llvm/trunk/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/SanitizerCoverage.cpp?rev=344391&r1=344390&r2=344391&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Instrumentation/SanitizerCoverage.cpp (original)
+++ llvm/trunk/lib/Transforms/Instrumentation/SanitizerCoverage.cpp Fri Oct 12 11:11:47 2018
@@ -29,6 +29,7 @@
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/MDBuilder.h"
+#include "llvm/IR/Mangler.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Type.h"
#include "llvm/Support/CommandLine.h"
@@ -298,6 +299,26 @@ Function *SanitizerCoverageModule::Creat
} else {
appendToGlobalCtors(M, CtorFunc, SanCtorAndDtorPriority);
}
+
+ if (TargetTriple.getObjectFormat() == Triple::COFF) {
+ // In COFF files, if the contructors are set as COMDAT (they are because
+ // COFF supports COMDAT) and the linker flag /OPT:REF (strip unreferenced
+ // functions and data) is used, the constructors get stripped. To prevent
+ // this, give the constructors weak ODR linkage and tell the linker to
+ // always include the sancov constructor. This way the linker can
+ // deduplicate the constructors but always leave one copy.
+ CtorFunc->setLinkage(GlobalValue::WeakODRLinkage);
+ SmallString<20> PartialIncDirective("/include:");
+ // Get constructor's mangled name in order to support i386.
+ SmallString<40> MangledName;
+ Mangler().getNameWithPrefix(MangledName, CtorFunc, true);
+ Twine IncDirective = PartialIncDirective + MangledName;
+ Metadata *Args[1] = {MDString::get(*C, IncDirective.str())};
+ MDNode *MetadataNode = MDNode::get(*C, Args);
+ NamedMDNode *NamedMetadata =
+ M.getOrInsertNamedMetadata("llvm.linker.options");
+ NamedMetadata->addOperand(MetadataNode);
+ }
return CtorFunc;
}
More information about the llvm-commits
mailing list