1 //===- DataFlowSanitizer.cpp - dynamic data flow analysis -----------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
10 /// This file is a part of DataFlowSanitizer, a generalised dynamic data flow
13 /// Unlike other Sanitizer tools, this tool is not designed to detect a specific
14 /// class of bugs on its own. Instead, it provides a generic dynamic data flow
15 /// analysis framework to be used by clients to help detect application-specific
16 /// issues within their own code.
18 /// The analysis is based on automatic propagation of data flow labels (also
19 /// known as taint labels) through a program as it performs computation. Each
20 /// byte of application memory is backed by two bytes of shadow memory which
21 /// hold the label. On Linux/x86_64, memory is laid out as follows:
23 /// +--------------------+ 0x800000000000 (top of memory)
24 /// | application memory |
25 /// +--------------------+ 0x700000008000 (kAppAddr)
29 /// +--------------------+ 0x200200000000 (kUnusedAddr)
31 /// +--------------------+ 0x200000000000 (kUnionTableAddr)
33 /// +--------------------+ 0x000000010000 (kShadowAddr)
34 /// | reserved by kernel |
35 /// +--------------------+ 0x000000000000
37 /// To derive a shadow memory address from an application memory address,
38 /// bits 44-46 are cleared to bring the address into the range
39 /// [0x000000008000,0x100000000000). Then the address is shifted left by 1 to
40 /// account for the double byte representation of shadow labels and move the
41 /// address into the shadow memory range. See the function
42 /// DataFlowSanitizer::getShadowAddress below.
44 /// For more information, please refer to the design document:
45 /// http://clang.llvm.org/docs/DataFlowSanitizerDesign.html
47 //===----------------------------------------------------------------------===//
49 #include "llvm/ADT/DenseMap.h"
50 #include "llvm/ADT/DenseSet.h"
51 #include "llvm/ADT/DepthFirstIterator.h"
52 #include "llvm/ADT/None.h"
53 #include "llvm/ADT/SmallPtrSet.h"
54 #include "llvm/ADT/SmallVector.h"
55 #include "llvm/ADT/StringExtras.h"
56 #include "llvm/ADT/StringRef.h"
57 #include "llvm/ADT/Triple.h"
58 #include "llvm/Transforms/Utils/Local.h"
59 #include "llvm/Analysis/ValueTracking.h"
60 #include "llvm/IR/Argument.h"
61 #include "llvm/IR/Attributes.h"
62 #include "llvm/IR/BasicBlock.h"
63 #include "llvm/IR/CallSite.h"
64 #include "llvm/IR/Constant.h"
65 #include "llvm/IR/Constants.h"
66 #include "llvm/IR/DataLayout.h"
67 #include "llvm/IR/DerivedTypes.h"
68 #include "llvm/IR/Dominators.h"
69 #include "llvm/IR/Function.h"
70 #include "llvm/IR/GlobalAlias.h"
71 #include "llvm/IR/GlobalValue.h"
72 #include "llvm/IR/GlobalVariable.h"
73 #include "llvm/IR/IRBuilder.h"
74 #include "llvm/IR/InlineAsm.h"
75 #include "llvm/IR/InstVisitor.h"
76 #include "llvm/IR/InstrTypes.h"
77 #include "llvm/IR/Instruction.h"
78 #include "llvm/IR/Instructions.h"
79 #include "llvm/IR/IntrinsicInst.h"
80 #include "llvm/IR/LLVMContext.h"
81 #include "llvm/IR/MDBuilder.h"
82 #include "llvm/IR/Module.h"
83 #include "llvm/IR/Type.h"
84 #include "llvm/IR/User.h"
85 #include "llvm/IR/Value.h"
86 #include "llvm/Pass.h"
87 #include "llvm/Support/Casting.h"
88 #include "llvm/Support/CommandLine.h"
89 #include "llvm/Support/ErrorHandling.h"
90 #include "llvm/Support/SpecialCaseList.h"
91 #include "llvm/Transforms/Instrumentation.h"
92 #include "llvm/Transforms/Utils/BasicBlockUtils.h"
104 using namespace llvm
;
106 // External symbol to be used when generating the shadow address for
107 // architectures with multiple VMAs. Instead of using a constant integer
108 // the runtime will set the external mask based on the VMA range.
109 static const char *const kDFSanExternShadowPtrMask
= "__dfsan_shadow_ptr_mask";
111 // The -dfsan-preserve-alignment flag controls whether this pass assumes that
112 // alignment requirements provided by the input IR are correct. For example,
113 // if the input IR contains a load with alignment 8, this flag will cause
114 // the shadow load to have alignment 16. This flag is disabled by default as
115 // we have unfortunately encountered too much code (including Clang itself;
116 // see PR14291) which performs misaligned access.
117 static cl::opt
<bool> ClPreserveAlignment(
118 "dfsan-preserve-alignment",
119 cl::desc("respect alignment requirements provided by input IR"), cl::Hidden
,
122 // The ABI list files control how shadow parameters are passed. The pass treats
123 // every function labelled "uninstrumented" in the ABI list file as conforming
124 // to the "native" (i.e. unsanitized) ABI. Unless the ABI list contains
125 // additional annotations for those functions, a call to one of those functions
126 // will produce a warning message, as the labelling behaviour of the function is
127 // unknown. The other supported annotations are "functional" and "discard",
128 // which are described below under DataFlowSanitizer::WrapperKind.
129 static cl::list
<std::string
> ClABIListFiles(
131 cl::desc("File listing native ABI functions and how the pass treats them"),
134 // Controls whether the pass uses IA_Args or IA_TLS as the ABI for instrumented
135 // functions (see DataFlowSanitizer::InstrumentedABI below).
136 static cl::opt
<bool> ClArgsABI(
138 cl::desc("Use the argument ABI rather than the TLS ABI"),
141 // Controls whether the pass includes or ignores the labels of pointers in load
143 static cl::opt
<bool> ClCombinePointerLabelsOnLoad(
144 "dfsan-combine-pointer-labels-on-load",
145 cl::desc("Combine the label of the pointer with the label of the data when "
146 "loading from memory."),
147 cl::Hidden
, cl::init(true));
149 // Controls whether the pass includes or ignores the labels of pointers in
150 // stores instructions.
151 static cl::opt
<bool> ClCombinePointerLabelsOnStore(
152 "dfsan-combine-pointer-labels-on-store",
153 cl::desc("Combine the label of the pointer with the label of the data when "
154 "storing in memory."),
155 cl::Hidden
, cl::init(false));
157 static cl::opt
<bool> ClDebugNonzeroLabels(
158 "dfsan-debug-nonzero-labels",
159 cl::desc("Insert calls to __dfsan_nonzero_label on observing a parameter, "
160 "load or return with a nonzero label"),
163 static StringRef
GetGlobalTypeString(const GlobalValue
&G
) {
164 // Types of GlobalVariables are always pointer types.
165 Type
*GType
= G
.getValueType();
166 // For now we support blacklisting struct types only.
167 if (StructType
*SGType
= dyn_cast
<StructType
>(GType
)) {
168 if (!SGType
->isLiteral())
169 return SGType
->getName();
171 return "<unknown type>";
177 std::unique_ptr
<SpecialCaseList
> SCL
;
180 DFSanABIList() = default;
182 void set(std::unique_ptr
<SpecialCaseList
> List
) { SCL
= std::move(List
); }
184 /// Returns whether either this function or its source file are listed in the
186 bool isIn(const Function
&F
, StringRef Category
) const {
187 return isIn(*F
.getParent(), Category
) ||
188 SCL
->inSection("dataflow", "fun", F
.getName(), Category
);
191 /// Returns whether this global alias is listed in the given category.
193 /// If GA aliases a function, the alias's name is matched as a function name
194 /// would be. Similarly, aliases of globals are matched like globals.
195 bool isIn(const GlobalAlias
&GA
, StringRef Category
) const {
196 if (isIn(*GA
.getParent(), Category
))
199 if (isa
<FunctionType
>(GA
.getValueType()))
200 return SCL
->inSection("dataflow", "fun", GA
.getName(), Category
);
202 return SCL
->inSection("dataflow", "global", GA
.getName(), Category
) ||
203 SCL
->inSection("dataflow", "type", GetGlobalTypeString(GA
),
207 /// Returns whether this module is listed in the given category.
208 bool isIn(const Module
&M
, StringRef Category
) const {
209 return SCL
->inSection("dataflow", "src", M
.getModuleIdentifier(), Category
);
213 /// TransformedFunction is used to express the result of transforming one
214 /// function type into another. This struct is immutable. It holds metadata
215 /// useful for updating calls of the old function to the new type.
216 struct TransformedFunction
{
217 TransformedFunction(FunctionType
* OriginalType
,
218 FunctionType
* TransformedType
,
219 std::vector
<unsigned> ArgumentIndexMapping
)
220 : OriginalType(OriginalType
),
221 TransformedType(TransformedType
),
222 ArgumentIndexMapping(ArgumentIndexMapping
) {}
225 TransformedFunction(const TransformedFunction
&) = delete;
226 TransformedFunction
& operator=(const TransformedFunction
&) = delete;
229 TransformedFunction(TransformedFunction
&&) = default;
230 TransformedFunction
& operator=(TransformedFunction
&&) = default;
232 /// Type of the function before the transformation.
233 FunctionType
*OriginalType
;
235 /// Type of the function after the transformation.
236 FunctionType
*TransformedType
;
238 /// Transforming a function may change the position of arguments. This
239 /// member records the mapping from each argument's old position to its new
240 /// position. Argument positions are zero-indexed. If the transformation
241 /// from F to F' made the first argument of F into the third argument of F',
242 /// then ArgumentIndexMapping[0] will equal 2.
243 std::vector
<unsigned> ArgumentIndexMapping
;
246 /// Given function attributes from a call site for the original function,
247 /// return function attributes appropriate for a call to the transformed
249 AttributeList
TransformFunctionAttributes(
250 const TransformedFunction
& TransformedFunction
,
251 LLVMContext
& Ctx
, AttributeList CallSiteAttrs
) {
253 // Construct a vector of AttributeSet for each function argument.
254 std::vector
<llvm::AttributeSet
> ArgumentAttributes(
255 TransformedFunction
.TransformedType
->getNumParams());
257 // Copy attributes from the parameter of the original function to the
258 // transformed version. 'ArgumentIndexMapping' holds the mapping from
259 // old argument position to new.
260 for (unsigned i
=0, ie
= TransformedFunction
.ArgumentIndexMapping
.size();
262 unsigned TransformedIndex
= TransformedFunction
.ArgumentIndexMapping
[i
];
263 ArgumentAttributes
[TransformedIndex
] = CallSiteAttrs
.getParamAttributes(i
);
266 // Copy annotations on varargs arguments.
267 for (unsigned i
= TransformedFunction
.OriginalType
->getNumParams(),
268 ie
= CallSiteAttrs
.getNumAttrSets(); i
<ie
; ++i
) {
269 ArgumentAttributes
.push_back(CallSiteAttrs
.getParamAttributes(i
));
272 return AttributeList::get(
274 CallSiteAttrs
.getFnAttributes(),
275 CallSiteAttrs
.getRetAttributes(),
276 llvm::makeArrayRef(ArgumentAttributes
));
279 class DataFlowSanitizer
: public ModulePass
{
280 friend struct DFSanFunction
;
281 friend class DFSanVisitor
;
287 /// Which ABI should be used for instrumented functions?
288 enum InstrumentedABI
{
289 /// Argument and return value labels are passed through additional
290 /// arguments and by modifying the return type.
293 /// Argument and return value labels are passed through TLS variables
294 /// __dfsan_arg_tls and __dfsan_retval_tls.
298 /// How should calls to uninstrumented functions be handled?
300 /// This function is present in an uninstrumented form but we don't know
301 /// how it should be handled. Print a warning and call the function anyway.
302 /// Don't label the return value.
305 /// This function does not write to (user-accessible) memory, and its return
306 /// value is unlabelled.
309 /// This function does not write to (user-accessible) memory, and the label
310 /// of its return value is the union of the label of its arguments.
313 /// Instead of calling the function, a custom wrapper __dfsw_F is called,
314 /// where F is the name of the function. This function may wrap the
315 /// original function or provide its own implementation. This is similar to
316 /// the IA_Args ABI, except that IA_Args uses a struct return type to
317 /// pass the return value shadow in a register, while WK_Custom uses an
318 /// extra pointer argument to return the shadow. This allows the wrapped
319 /// form of the function type to be expressed in C.
325 IntegerType
*ShadowTy
;
326 PointerType
*ShadowPtrTy
;
327 IntegerType
*IntptrTy
;
328 ConstantInt
*ZeroShadow
;
329 ConstantInt
*ShadowPtrMask
;
330 ConstantInt
*ShadowPtrMul
;
333 void *(*GetArgTLSPtr
)();
334 void *(*GetRetvalTLSPtr
)();
335 FunctionType
*GetArgTLSTy
;
336 FunctionType
*GetRetvalTLSTy
;
338 Constant
*GetRetvalTLS
;
339 Constant
*ExternalShadowMask
;
340 FunctionType
*DFSanUnionFnTy
;
341 FunctionType
*DFSanUnionLoadFnTy
;
342 FunctionType
*DFSanUnimplementedFnTy
;
343 FunctionType
*DFSanSetLabelFnTy
;
344 FunctionType
*DFSanNonzeroLabelFnTy
;
345 FunctionType
*DFSanVarargWrapperFnTy
;
346 FunctionCallee DFSanUnionFn
;
347 FunctionCallee DFSanCheckedUnionFn
;
348 FunctionCallee DFSanUnionLoadFn
;
349 FunctionCallee DFSanUnimplementedFn
;
350 FunctionCallee DFSanSetLabelFn
;
351 FunctionCallee DFSanNonzeroLabelFn
;
352 FunctionCallee DFSanVarargWrapperFn
;
353 MDNode
*ColdCallWeights
;
354 DFSanABIList ABIList
;
355 DenseMap
<Value
*, Function
*> UnwrappedFnMap
;
356 AttrBuilder ReadOnlyNoneAttrs
;
357 bool DFSanRuntimeShadowMask
= false;
359 Value
*getShadowAddress(Value
*Addr
, Instruction
*Pos
);
360 bool isInstrumented(const Function
*F
);
361 bool isInstrumented(const GlobalAlias
*GA
);
362 FunctionType
*getArgsFunctionType(FunctionType
*T
);
363 FunctionType
*getTrampolineFunctionType(FunctionType
*T
);
364 TransformedFunction
getCustomFunctionType(FunctionType
*T
);
365 InstrumentedABI
getInstrumentedABI();
366 WrapperKind
getWrapperKind(Function
*F
);
367 void addGlobalNamePrefix(GlobalValue
*GV
);
368 Function
*buildWrapperFunction(Function
*F
, StringRef NewFName
,
369 GlobalValue::LinkageTypes NewFLink
,
370 FunctionType
*NewFT
);
371 Constant
*getOrBuildTrampolineFunction(FunctionType
*FT
, StringRef FName
);
377 const std::vector
<std::string
> &ABIListFiles
= std::vector
<std::string
>(),
378 void *(*getArgTLS
)() = nullptr, void *(*getRetValTLS
)() = nullptr);
380 bool doInitialization(Module
&M
) override
;
381 bool runOnModule(Module
&M
) override
;
384 struct DFSanFunction
{
385 DataFlowSanitizer
&DFS
;
388 DataFlowSanitizer::InstrumentedABI IA
;
390 Value
*ArgTLSPtr
= nullptr;
391 Value
*RetvalTLSPtr
= nullptr;
392 AllocaInst
*LabelReturnAlloca
= nullptr;
393 DenseMap
<Value
*, Value
*> ValShadowMap
;
394 DenseMap
<AllocaInst
*, AllocaInst
*> AllocaShadowMap
;
395 std::vector
<std::pair
<PHINode
*, PHINode
*>> PHIFixups
;
396 DenseSet
<Instruction
*> SkipInsts
;
397 std::vector
<Value
*> NonZeroChecks
;
400 struct CachedCombinedShadow
{
404 DenseMap
<std::pair
<Value
*, Value
*>, CachedCombinedShadow
>
405 CachedCombinedShadows
;
406 DenseMap
<Value
*, std::set
<Value
*>> ShadowElements
;
408 DFSanFunction(DataFlowSanitizer
&DFS
, Function
*F
, bool IsNativeABI
)
409 : DFS(DFS
), F(F
), IA(DFS
.getInstrumentedABI()), IsNativeABI(IsNativeABI
) {
411 // FIXME: Need to track down the register allocator issue which causes poor
412 // performance in pathological cases with large numbers of basic blocks.
413 AvoidNewBlocks
= F
->size() > 1000;
416 Value
*getArgTLSPtr();
417 Value
*getArgTLS(unsigned Index
, Instruction
*Pos
);
418 Value
*getRetvalTLS();
419 Value
*getShadow(Value
*V
);
420 void setShadow(Instruction
*I
, Value
*Shadow
);
421 Value
*combineShadows(Value
*V1
, Value
*V2
, Instruction
*Pos
);
422 Value
*combineOperandShadows(Instruction
*Inst
);
423 Value
*loadShadow(Value
*ShadowAddr
, uint64_t Size
, uint64_t Align
,
425 void storeShadow(Value
*Addr
, uint64_t Size
, uint64_t Align
, Value
*Shadow
,
429 class DFSanVisitor
: public InstVisitor
<DFSanVisitor
> {
433 DFSanVisitor(DFSanFunction
&DFSF
) : DFSF(DFSF
) {}
435 const DataLayout
&getDataLayout() const {
436 return DFSF
.F
->getParent()->getDataLayout();
439 void visitOperandShadowInst(Instruction
&I
);
440 void visitBinaryOperator(BinaryOperator
&BO
);
441 void visitCastInst(CastInst
&CI
);
442 void visitCmpInst(CmpInst
&CI
);
443 void visitGetElementPtrInst(GetElementPtrInst
&GEPI
);
444 void visitLoadInst(LoadInst
&LI
);
445 void visitStoreInst(StoreInst
&SI
);
446 void visitReturnInst(ReturnInst
&RI
);
447 void visitCallSite(CallSite CS
);
448 void visitPHINode(PHINode
&PN
);
449 void visitExtractElementInst(ExtractElementInst
&I
);
450 void visitInsertElementInst(InsertElementInst
&I
);
451 void visitShuffleVectorInst(ShuffleVectorInst
&I
);
452 void visitExtractValueInst(ExtractValueInst
&I
);
453 void visitInsertValueInst(InsertValueInst
&I
);
454 void visitAllocaInst(AllocaInst
&I
);
455 void visitSelectInst(SelectInst
&I
);
456 void visitMemSetInst(MemSetInst
&I
);
457 void visitMemTransferInst(MemTransferInst
&I
);
460 } // end anonymous namespace
462 char DataFlowSanitizer::ID
;
464 INITIALIZE_PASS(DataFlowSanitizer
, "dfsan",
465 "DataFlowSanitizer: dynamic data flow analysis.", false, false)
468 llvm::createDataFlowSanitizerPass(const std::vector
<std::string
> &ABIListFiles
,
469 void *(*getArgTLS
)(),
470 void *(*getRetValTLS
)()) {
471 return new DataFlowSanitizer(ABIListFiles
, getArgTLS
, getRetValTLS
);
474 DataFlowSanitizer::DataFlowSanitizer(
475 const std::vector
<std::string
> &ABIListFiles
, void *(*getArgTLS
)(),
476 void *(*getRetValTLS
)())
477 : ModulePass(ID
), GetArgTLSPtr(getArgTLS
), GetRetvalTLSPtr(getRetValTLS
) {
478 std::vector
<std::string
> AllABIListFiles(std::move(ABIListFiles
));
479 AllABIListFiles
.insert(AllABIListFiles
.end(), ClABIListFiles
.begin(),
480 ClABIListFiles
.end());
481 ABIList
.set(SpecialCaseList::createOrDie(AllABIListFiles
));
484 FunctionType
*DataFlowSanitizer::getArgsFunctionType(FunctionType
*T
) {
485 SmallVector
<Type
*, 4> ArgTypes(T
->param_begin(), T
->param_end());
486 ArgTypes
.append(T
->getNumParams(), ShadowTy
);
488 ArgTypes
.push_back(ShadowPtrTy
);
489 Type
*RetType
= T
->getReturnType();
490 if (!RetType
->isVoidTy())
491 RetType
= StructType::get(RetType
, ShadowTy
);
492 return FunctionType::get(RetType
, ArgTypes
, T
->isVarArg());
495 FunctionType
*DataFlowSanitizer::getTrampolineFunctionType(FunctionType
*T
) {
496 assert(!T
->isVarArg());
497 SmallVector
<Type
*, 4> ArgTypes
;
498 ArgTypes
.push_back(T
->getPointerTo());
499 ArgTypes
.append(T
->param_begin(), T
->param_end());
500 ArgTypes
.append(T
->getNumParams(), ShadowTy
);
501 Type
*RetType
= T
->getReturnType();
502 if (!RetType
->isVoidTy())
503 ArgTypes
.push_back(ShadowPtrTy
);
504 return FunctionType::get(T
->getReturnType(), ArgTypes
, false);
507 TransformedFunction
DataFlowSanitizer::getCustomFunctionType(FunctionType
*T
) {
508 SmallVector
<Type
*, 4> ArgTypes
;
510 // Some parameters of the custom function being constructed are
511 // parameters of T. Record the mapping from parameters of T to
512 // parameters of the custom function, so that parameter attributes
513 // at call sites can be updated.
514 std::vector
<unsigned> ArgumentIndexMapping
;
515 for (unsigned i
= 0, ie
= T
->getNumParams(); i
!= ie
; ++i
) {
516 Type
* param_type
= T
->getParamType(i
);
518 if (isa
<PointerType
>(param_type
) && (FT
= dyn_cast
<FunctionType
>(
519 cast
<PointerType
>(param_type
)->getElementType()))) {
520 ArgumentIndexMapping
.push_back(ArgTypes
.size());
521 ArgTypes
.push_back(getTrampolineFunctionType(FT
)->getPointerTo());
522 ArgTypes
.push_back(Type::getInt8PtrTy(*Ctx
));
524 ArgumentIndexMapping
.push_back(ArgTypes
.size());
525 ArgTypes
.push_back(param_type
);
528 for (unsigned i
= 0, e
= T
->getNumParams(); i
!= e
; ++i
)
529 ArgTypes
.push_back(ShadowTy
);
531 ArgTypes
.push_back(ShadowPtrTy
);
532 Type
*RetType
= T
->getReturnType();
533 if (!RetType
->isVoidTy())
534 ArgTypes
.push_back(ShadowPtrTy
);
535 return TransformedFunction(
536 T
, FunctionType::get(T
->getReturnType(), ArgTypes
, T
->isVarArg()),
537 ArgumentIndexMapping
);
540 bool DataFlowSanitizer::doInitialization(Module
&M
) {
541 Triple
TargetTriple(M
.getTargetTriple());
542 bool IsX86_64
= TargetTriple
.getArch() == Triple::x86_64
;
543 bool IsMIPS64
= TargetTriple
.isMIPS64();
544 bool IsAArch64
= TargetTriple
.getArch() == Triple::aarch64
||
545 TargetTriple
.getArch() == Triple::aarch64_be
;
547 const DataLayout
&DL
= M
.getDataLayout();
550 Ctx
= &M
.getContext();
551 ShadowTy
= IntegerType::get(*Ctx
, ShadowWidth
);
552 ShadowPtrTy
= PointerType::getUnqual(ShadowTy
);
553 IntptrTy
= DL
.getIntPtrType(*Ctx
);
554 ZeroShadow
= ConstantInt::getSigned(ShadowTy
, 0);
555 ShadowPtrMul
= ConstantInt::getSigned(IntptrTy
, ShadowWidth
/ 8);
557 ShadowPtrMask
= ConstantInt::getSigned(IntptrTy
, ~0x700000000000LL
);
559 ShadowPtrMask
= ConstantInt::getSigned(IntptrTy
, ~0xF000000000LL
);
560 // AArch64 supports multiple VMAs and the shadow mask is set at runtime.
562 DFSanRuntimeShadowMask
= true;
564 report_fatal_error("unsupported triple");
566 Type
*DFSanUnionArgs
[2] = { ShadowTy
, ShadowTy
};
568 FunctionType::get(ShadowTy
, DFSanUnionArgs
, /*isVarArg=*/ false);
569 Type
*DFSanUnionLoadArgs
[2] = { ShadowPtrTy
, IntptrTy
};
571 FunctionType::get(ShadowTy
, DFSanUnionLoadArgs
, /*isVarArg=*/ false);
572 DFSanUnimplementedFnTy
= FunctionType::get(
573 Type::getVoidTy(*Ctx
), Type::getInt8PtrTy(*Ctx
), /*isVarArg=*/false);
574 Type
*DFSanSetLabelArgs
[3] = { ShadowTy
, Type::getInt8PtrTy(*Ctx
), IntptrTy
};
575 DFSanSetLabelFnTy
= FunctionType::get(Type::getVoidTy(*Ctx
),
576 DFSanSetLabelArgs
, /*isVarArg=*/false);
577 DFSanNonzeroLabelFnTy
= FunctionType::get(
578 Type::getVoidTy(*Ctx
), None
, /*isVarArg=*/false);
579 DFSanVarargWrapperFnTy
= FunctionType::get(
580 Type::getVoidTy(*Ctx
), Type::getInt8PtrTy(*Ctx
), /*isVarArg=*/false);
583 Type
*ArgTLSTy
= ArrayType::get(ShadowTy
, 64);
585 GetArgTLSTy
= FunctionType::get(PointerType::getUnqual(ArgTLSTy
), false);
586 GetArgTLS
= ConstantExpr::getIntToPtr(
587 ConstantInt::get(IntptrTy
, uintptr_t(GetArgTLSPtr
)),
588 PointerType::getUnqual(GetArgTLSTy
));
590 if (GetRetvalTLSPtr
) {
592 GetRetvalTLSTy
= FunctionType::get(PointerType::getUnqual(ShadowTy
), false);
593 GetRetvalTLS
= ConstantExpr::getIntToPtr(
594 ConstantInt::get(IntptrTy
, uintptr_t(GetRetvalTLSPtr
)),
595 PointerType::getUnqual(GetRetvalTLSTy
));
598 ColdCallWeights
= MDBuilder(*Ctx
).createBranchWeights(1, 1000);
602 bool DataFlowSanitizer::isInstrumented(const Function
*F
) {
603 return !ABIList
.isIn(*F
, "uninstrumented");
606 bool DataFlowSanitizer::isInstrumented(const GlobalAlias
*GA
) {
607 return !ABIList
.isIn(*GA
, "uninstrumented");
610 DataFlowSanitizer::InstrumentedABI
DataFlowSanitizer::getInstrumentedABI() {
611 return ClArgsABI
? IA_Args
: IA_TLS
;
614 DataFlowSanitizer::WrapperKind
DataFlowSanitizer::getWrapperKind(Function
*F
) {
615 if (ABIList
.isIn(*F
, "functional"))
616 return WK_Functional
;
617 if (ABIList
.isIn(*F
, "discard"))
619 if (ABIList
.isIn(*F
, "custom"))
625 void DataFlowSanitizer::addGlobalNamePrefix(GlobalValue
*GV
) {
626 std::string GVName
= GV
->getName(), Prefix
= "dfs$";
627 GV
->setName(Prefix
+ GVName
);
629 // Try to change the name of the function in module inline asm. We only do
630 // this for specific asm directives, currently only ".symver", to try to avoid
631 // corrupting asm which happens to contain the symbol name as a substring.
632 // Note that the substitution for .symver assumes that the versioned symbol
633 // also has an instrumented name.
634 std::string Asm
= GV
->getParent()->getModuleInlineAsm();
635 std::string SearchStr
= ".symver " + GVName
+ ",";
636 size_t Pos
= Asm
.find(SearchStr
);
637 if (Pos
!= std::string::npos
) {
638 Asm
.replace(Pos
, SearchStr
.size(),
639 ".symver " + Prefix
+ GVName
+ "," + Prefix
);
640 GV
->getParent()->setModuleInlineAsm(Asm
);
645 DataFlowSanitizer::buildWrapperFunction(Function
*F
, StringRef NewFName
,
646 GlobalValue::LinkageTypes NewFLink
,
647 FunctionType
*NewFT
) {
648 FunctionType
*FT
= F
->getFunctionType();
649 Function
*NewF
= Function::Create(NewFT
, NewFLink
, F
->getAddressSpace(),
650 NewFName
, F
->getParent());
651 NewF
->copyAttributesFrom(F
);
652 NewF
->removeAttributes(
653 AttributeList::ReturnIndex
,
654 AttributeFuncs::typeIncompatible(NewFT
->getReturnType()));
656 BasicBlock
*BB
= BasicBlock::Create(*Ctx
, "entry", NewF
);
658 NewF
->removeAttributes(AttributeList::FunctionIndex
,
659 AttrBuilder().addAttribute("split-stack"));
660 CallInst::Create(DFSanVarargWrapperFn
,
661 IRBuilder
<>(BB
).CreateGlobalStringPtr(F
->getName()), "",
663 new UnreachableInst(*Ctx
, BB
);
665 std::vector
<Value
*> Args
;
666 unsigned n
= FT
->getNumParams();
667 for (Function::arg_iterator ai
= NewF
->arg_begin(); n
!= 0; ++ai
, --n
)
668 Args
.push_back(&*ai
);
669 CallInst
*CI
= CallInst::Create(F
, Args
, "", BB
);
670 if (FT
->getReturnType()->isVoidTy())
671 ReturnInst::Create(*Ctx
, BB
);
673 ReturnInst::Create(*Ctx
, CI
, BB
);
679 Constant
*DataFlowSanitizer::getOrBuildTrampolineFunction(FunctionType
*FT
,
681 FunctionType
*FTT
= getTrampolineFunctionType(FT
);
682 FunctionCallee C
= Mod
->getOrInsertFunction(FName
, FTT
);
683 Function
*F
= dyn_cast
<Function
>(C
.getCallee());
684 if (F
&& F
->isDeclaration()) {
685 F
->setLinkage(GlobalValue::LinkOnceODRLinkage
);
686 BasicBlock
*BB
= BasicBlock::Create(*Ctx
, "entry", F
);
687 std::vector
<Value
*> Args
;
688 Function::arg_iterator AI
= F
->arg_begin(); ++AI
;
689 for (unsigned N
= FT
->getNumParams(); N
!= 0; ++AI
, --N
)
690 Args
.push_back(&*AI
);
691 CallInst
*CI
= CallInst::Create(FT
, &*F
->arg_begin(), Args
, "", BB
);
693 if (FT
->getReturnType()->isVoidTy())
694 RI
= ReturnInst::Create(*Ctx
, BB
);
696 RI
= ReturnInst::Create(*Ctx
, CI
, BB
);
698 DFSanFunction
DFSF(*this, F
, /*IsNativeABI=*/true);
699 Function::arg_iterator ValAI
= F
->arg_begin(), ShadowAI
= AI
; ++ValAI
;
700 for (unsigned N
= FT
->getNumParams(); N
!= 0; ++ValAI
, ++ShadowAI
, --N
)
701 DFSF
.ValShadowMap
[&*ValAI
] = &*ShadowAI
;
702 DFSanVisitor(DFSF
).visitCallInst(*CI
);
703 if (!FT
->getReturnType()->isVoidTy())
704 new StoreInst(DFSF
.getShadow(RI
->getReturnValue()),
705 &*std::prev(F
->arg_end()), RI
);
708 return cast
<Constant
>(C
.getCallee());
711 bool DataFlowSanitizer::runOnModule(Module
&M
) {
712 if (ABIList
.isIn(M
, "skip"))
716 Type
*ArgTLSTy
= ArrayType::get(ShadowTy
, 64);
717 ArgTLS
= Mod
->getOrInsertGlobal("__dfsan_arg_tls", ArgTLSTy
);
718 if (GlobalVariable
*G
= dyn_cast
<GlobalVariable
>(ArgTLS
))
719 G
->setThreadLocalMode(GlobalVariable::InitialExecTLSModel
);
721 if (!GetRetvalTLSPtr
) {
722 RetvalTLS
= Mod
->getOrInsertGlobal("__dfsan_retval_tls", ShadowTy
);
723 if (GlobalVariable
*G
= dyn_cast
<GlobalVariable
>(RetvalTLS
))
724 G
->setThreadLocalMode(GlobalVariable::InitialExecTLSModel
);
728 Mod
->getOrInsertGlobal(kDFSanExternShadowPtrMask
, IntptrTy
);
732 AL
= AL
.addAttribute(M
.getContext(), AttributeList::FunctionIndex
,
733 Attribute::NoUnwind
);
734 AL
= AL
.addAttribute(M
.getContext(), AttributeList::FunctionIndex
,
735 Attribute::ReadNone
);
736 AL
= AL
.addAttribute(M
.getContext(), AttributeList::ReturnIndex
,
738 AL
= AL
.addParamAttribute(M
.getContext(), 0, Attribute::ZExt
);
739 AL
= AL
.addParamAttribute(M
.getContext(), 1, Attribute::ZExt
);
741 Mod
->getOrInsertFunction("__dfsan_union", DFSanUnionFnTy
, AL
);
746 AL
= AL
.addAttribute(M
.getContext(), AttributeList::FunctionIndex
,
747 Attribute::NoUnwind
);
748 AL
= AL
.addAttribute(M
.getContext(), AttributeList::FunctionIndex
,
749 Attribute::ReadNone
);
750 AL
= AL
.addAttribute(M
.getContext(), AttributeList::ReturnIndex
,
752 AL
= AL
.addParamAttribute(M
.getContext(), 0, Attribute::ZExt
);
753 AL
= AL
.addParamAttribute(M
.getContext(), 1, Attribute::ZExt
);
754 DFSanCheckedUnionFn
=
755 Mod
->getOrInsertFunction("dfsan_union", DFSanUnionFnTy
, AL
);
759 AL
= AL
.addAttribute(M
.getContext(), AttributeList::FunctionIndex
,
760 Attribute::NoUnwind
);
761 AL
= AL
.addAttribute(M
.getContext(), AttributeList::FunctionIndex
,
762 Attribute::ReadOnly
);
763 AL
= AL
.addAttribute(M
.getContext(), AttributeList::ReturnIndex
,
766 Mod
->getOrInsertFunction("__dfsan_union_load", DFSanUnionLoadFnTy
, AL
);
768 DFSanUnimplementedFn
=
769 Mod
->getOrInsertFunction("__dfsan_unimplemented", DFSanUnimplementedFnTy
);
772 AL
= AL
.addParamAttribute(M
.getContext(), 0, Attribute::ZExt
);
774 Mod
->getOrInsertFunction("__dfsan_set_label", DFSanSetLabelFnTy
, AL
);
776 DFSanNonzeroLabelFn
=
777 Mod
->getOrInsertFunction("__dfsan_nonzero_label", DFSanNonzeroLabelFnTy
);
778 DFSanVarargWrapperFn
= Mod
->getOrInsertFunction("__dfsan_vararg_wrapper",
779 DFSanVarargWrapperFnTy
);
781 std::vector
<Function
*> FnsToInstrument
;
782 SmallPtrSet
<Function
*, 2> FnsWithNativeABI
;
783 for (Function
&i
: M
) {
784 if (!i
.isIntrinsic() &&
785 &i
!= DFSanUnionFn
.getCallee()->stripPointerCasts() &&
786 &i
!= DFSanCheckedUnionFn
.getCallee()->stripPointerCasts() &&
787 &i
!= DFSanUnionLoadFn
.getCallee()->stripPointerCasts() &&
788 &i
!= DFSanUnimplementedFn
.getCallee()->stripPointerCasts() &&
789 &i
!= DFSanSetLabelFn
.getCallee()->stripPointerCasts() &&
790 &i
!= DFSanNonzeroLabelFn
.getCallee()->stripPointerCasts() &&
791 &i
!= DFSanVarargWrapperFn
.getCallee()->stripPointerCasts())
792 FnsToInstrument
.push_back(&i
);
795 // Give function aliases prefixes when necessary, and build wrappers where the
796 // instrumentedness is inconsistent.
797 for (Module::alias_iterator i
= M
.alias_begin(), e
= M
.alias_end(); i
!= e
;) {
798 GlobalAlias
*GA
= &*i
;
800 // Don't stop on weak. We assume people aren't playing games with the
801 // instrumentedness of overridden weak aliases.
802 if (auto F
= dyn_cast
<Function
>(GA
->getBaseObject())) {
803 bool GAInst
= isInstrumented(GA
), FInst
= isInstrumented(F
);
804 if (GAInst
&& FInst
) {
805 addGlobalNamePrefix(GA
);
806 } else if (GAInst
!= FInst
) {
807 // Non-instrumented alias of an instrumented function, or vice versa.
808 // Replace the alias with a native-ABI wrapper of the aliasee. The pass
809 // below will take care of instrumenting it.
811 buildWrapperFunction(F
, "", GA
->getLinkage(), F
->getFunctionType());
812 GA
->replaceAllUsesWith(ConstantExpr::getBitCast(NewF
, GA
->getType()));
814 GA
->eraseFromParent();
815 FnsToInstrument
.push_back(NewF
);
820 ReadOnlyNoneAttrs
.addAttribute(Attribute::ReadOnly
)
821 .addAttribute(Attribute::ReadNone
);
823 // First, change the ABI of every function in the module. ABI-listed
824 // functions keep their original ABI and get a wrapper function.
825 for (std::vector
<Function
*>::iterator i
= FnsToInstrument
.begin(),
826 e
= FnsToInstrument
.end();
829 FunctionType
*FT
= F
.getFunctionType();
831 bool IsZeroArgsVoidRet
= (FT
->getNumParams() == 0 && !FT
->isVarArg() &&
832 FT
->getReturnType()->isVoidTy());
834 if (isInstrumented(&F
)) {
835 // Instrumented functions get a 'dfs$' prefix. This allows us to more
836 // easily identify cases of mismatching ABIs.
837 if (getInstrumentedABI() == IA_Args
&& !IsZeroArgsVoidRet
) {
838 FunctionType
*NewFT
= getArgsFunctionType(FT
);
839 Function
*NewF
= Function::Create(NewFT
, F
.getLinkage(),
840 F
.getAddressSpace(), "", &M
);
841 NewF
->copyAttributesFrom(&F
);
842 NewF
->removeAttributes(
843 AttributeList::ReturnIndex
,
844 AttributeFuncs::typeIncompatible(NewFT
->getReturnType()));
845 for (Function::arg_iterator FArg
= F
.arg_begin(),
846 NewFArg
= NewF
->arg_begin(),
847 FArgEnd
= F
.arg_end();
848 FArg
!= FArgEnd
; ++FArg
, ++NewFArg
) {
849 FArg
->replaceAllUsesWith(&*NewFArg
);
851 NewF
->getBasicBlockList().splice(NewF
->begin(), F
.getBasicBlockList());
853 for (Function::user_iterator UI
= F
.user_begin(), UE
= F
.user_end();
855 BlockAddress
*BA
= dyn_cast
<BlockAddress
>(*UI
);
858 BA
->replaceAllUsesWith(
859 BlockAddress::get(NewF
, BA
->getBasicBlock()));
863 F
.replaceAllUsesWith(
864 ConstantExpr::getBitCast(NewF
, PointerType::getUnqual(FT
)));
868 addGlobalNamePrefix(NewF
);
870 addGlobalNamePrefix(&F
);
872 } else if (!IsZeroArgsVoidRet
|| getWrapperKind(&F
) == WK_Custom
) {
873 // Build a wrapper function for F. The wrapper simply calls F, and is
874 // added to FnsToInstrument so that any instrumentation according to its
875 // WrapperKind is done in the second pass below.
876 FunctionType
*NewFT
= getInstrumentedABI() == IA_Args
877 ? getArgsFunctionType(FT
)
880 // If the function being wrapped has local linkage, then preserve the
881 // function's linkage in the wrapper function.
882 GlobalValue::LinkageTypes wrapperLinkage
=
885 : GlobalValue::LinkOnceODRLinkage
;
887 Function
*NewF
= buildWrapperFunction(
888 &F
, std::string("dfsw$") + std::string(F
.getName()),
889 wrapperLinkage
, NewFT
);
890 if (getInstrumentedABI() == IA_TLS
)
891 NewF
->removeAttributes(AttributeList::FunctionIndex
, ReadOnlyNoneAttrs
);
893 Value
*WrappedFnCst
=
894 ConstantExpr::getBitCast(NewF
, PointerType::getUnqual(FT
));
895 F
.replaceAllUsesWith(WrappedFnCst
);
897 UnwrappedFnMap
[WrappedFnCst
] = &F
;
900 if (!F
.isDeclaration()) {
901 // This function is probably defining an interposition of an
902 // uninstrumented function and hence needs to keep the original ABI.
903 // But any functions it may call need to use the instrumented ABI, so
904 // we instrument it in a mode which preserves the original ABI.
905 FnsWithNativeABI
.insert(&F
);
907 // This code needs to rebuild the iterators, as they may be invalidated
908 // by the push_back, taking care that the new range does not include
909 // any functions added by this code.
910 size_t N
= i
- FnsToInstrument
.begin(),
911 Count
= e
- FnsToInstrument
.begin();
912 FnsToInstrument
.push_back(&F
);
913 i
= FnsToInstrument
.begin() + N
;
914 e
= FnsToInstrument
.begin() + Count
;
916 // Hopefully, nobody will try to indirectly call a vararg
918 } else if (FT
->isVarArg()) {
919 UnwrappedFnMap
[&F
] = &F
;
924 for (Function
*i
: FnsToInstrument
) {
925 if (!i
|| i
->isDeclaration())
928 removeUnreachableBlocks(*i
);
930 DFSanFunction
DFSF(*this, i
, FnsWithNativeABI
.count(i
));
932 // DFSanVisitor may create new basic blocks, which confuses df_iterator.
933 // Build a copy of the list before iterating over it.
934 SmallVector
<BasicBlock
*, 4> BBList(depth_first(&i
->getEntryBlock()));
936 for (BasicBlock
*i
: BBList
) {
937 Instruction
*Inst
= &i
->front();
939 // DFSanVisitor may split the current basic block, changing the current
940 // instruction's next pointer and moving the next instruction to the
941 // tail block from which we should continue.
942 Instruction
*Next
= Inst
->getNextNode();
943 // DFSanVisitor may delete Inst, so keep track of whether it was a
945 bool IsTerminator
= Inst
->isTerminator();
946 if (!DFSF
.SkipInsts
.count(Inst
))
947 DFSanVisitor(DFSF
).visit(Inst
);
954 // We will not necessarily be able to compute the shadow for every phi node
955 // until we have visited every block. Therefore, the code that handles phi
956 // nodes adds them to the PHIFixups list so that they can be properly
958 for (std::vector
<std::pair
<PHINode
*, PHINode
*>>::iterator
959 i
= DFSF
.PHIFixups
.begin(),
960 e
= DFSF
.PHIFixups
.end();
962 for (unsigned val
= 0, n
= i
->first
->getNumIncomingValues(); val
!= n
;
964 i
->second
->setIncomingValue(
965 val
, DFSF
.getShadow(i
->first
->getIncomingValue(val
)));
969 // -dfsan-debug-nonzero-labels will split the CFG in all kinds of crazy
970 // places (i.e. instructions in basic blocks we haven't even begun visiting
971 // yet). To make our life easier, do this work in a pass after the main
973 if (ClDebugNonzeroLabels
) {
974 for (Value
*V
: DFSF
.NonZeroChecks
) {
976 if (Instruction
*I
= dyn_cast
<Instruction
>(V
))
977 Pos
= I
->getNextNode();
979 Pos
= &DFSF
.F
->getEntryBlock().front();
980 while (isa
<PHINode
>(Pos
) || isa
<AllocaInst
>(Pos
))
981 Pos
= Pos
->getNextNode();
982 IRBuilder
<> IRB(Pos
);
983 Value
*Ne
= IRB
.CreateICmpNE(V
, DFSF
.DFS
.ZeroShadow
);
984 BranchInst
*BI
= cast
<BranchInst
>(SplitBlockAndInsertIfThen(
985 Ne
, Pos
, /*Unreachable=*/false, ColdCallWeights
));
986 IRBuilder
<> ThenIRB(BI
);
987 ThenIRB
.CreateCall(DFSF
.DFS
.DFSanNonzeroLabelFn
, {});
995 Value
*DFSanFunction::getArgTLSPtr() {
999 return ArgTLSPtr
= DFS
.ArgTLS
;
1001 IRBuilder
<> IRB(&F
->getEntryBlock().front());
1002 return ArgTLSPtr
= IRB
.CreateCall(DFS
.GetArgTLSTy
, DFS
.GetArgTLS
, {});
1005 Value
*DFSanFunction::getRetvalTLS() {
1007 return RetvalTLSPtr
;
1009 return RetvalTLSPtr
= DFS
.RetvalTLS
;
1011 IRBuilder
<> IRB(&F
->getEntryBlock().front());
1012 return RetvalTLSPtr
=
1013 IRB
.CreateCall(DFS
.GetRetvalTLSTy
, DFS
.GetRetvalTLS
, {});
1016 Value
*DFSanFunction::getArgTLS(unsigned Idx
, Instruction
*Pos
) {
1017 IRBuilder
<> IRB(Pos
);
1018 return IRB
.CreateConstGEP2_64(ArrayType::get(DFS
.ShadowTy
, 64),
1019 getArgTLSPtr(), 0, Idx
);
1022 Value
*DFSanFunction::getShadow(Value
*V
) {
1023 if (!isa
<Argument
>(V
) && !isa
<Instruction
>(V
))
1024 return DFS
.ZeroShadow
;
1025 Value
*&Shadow
= ValShadowMap
[V
];
1027 if (Argument
*A
= dyn_cast
<Argument
>(V
)) {
1029 return DFS
.ZeroShadow
;
1031 case DataFlowSanitizer::IA_TLS
: {
1032 Value
*ArgTLSPtr
= getArgTLSPtr();
1033 Instruction
*ArgTLSPos
=
1034 DFS
.ArgTLS
? &*F
->getEntryBlock().begin()
1035 : cast
<Instruction
>(ArgTLSPtr
)->getNextNode();
1036 IRBuilder
<> IRB(ArgTLSPos
);
1038 IRB
.CreateLoad(DFS
.ShadowTy
, getArgTLS(A
->getArgNo(), ArgTLSPos
));
1041 case DataFlowSanitizer::IA_Args
: {
1042 unsigned ArgIdx
= A
->getArgNo() + F
->arg_size() / 2;
1043 Function::arg_iterator i
= F
->arg_begin();
1047 assert(Shadow
->getType() == DFS
.ShadowTy
);
1051 NonZeroChecks
.push_back(Shadow
);
1053 Shadow
= DFS
.ZeroShadow
;
1059 void DFSanFunction::setShadow(Instruction
*I
, Value
*Shadow
) {
1060 assert(!ValShadowMap
.count(I
));
1061 assert(Shadow
->getType() == DFS
.ShadowTy
);
1062 ValShadowMap
[I
] = Shadow
;
1065 Value
*DataFlowSanitizer::getShadowAddress(Value
*Addr
, Instruction
*Pos
) {
1066 assert(Addr
!= RetvalTLS
&& "Reinstrumenting?");
1067 IRBuilder
<> IRB(Pos
);
1068 Value
*ShadowPtrMaskValue
;
1069 if (DFSanRuntimeShadowMask
)
1070 ShadowPtrMaskValue
= IRB
.CreateLoad(IntptrTy
, ExternalShadowMask
);
1072 ShadowPtrMaskValue
= ShadowPtrMask
;
1073 return IRB
.CreateIntToPtr(
1075 IRB
.CreateAnd(IRB
.CreatePtrToInt(Addr
, IntptrTy
),
1076 IRB
.CreatePtrToInt(ShadowPtrMaskValue
, IntptrTy
)),
1081 // Generates IR to compute the union of the two given shadows, inserting it
1082 // before Pos. Returns the computed union Value.
1083 Value
*DFSanFunction::combineShadows(Value
*V1
, Value
*V2
, Instruction
*Pos
) {
1084 if (V1
== DFS
.ZeroShadow
)
1086 if (V2
== DFS
.ZeroShadow
)
1091 auto V1Elems
= ShadowElements
.find(V1
);
1092 auto V2Elems
= ShadowElements
.find(V2
);
1093 if (V1Elems
!= ShadowElements
.end() && V2Elems
!= ShadowElements
.end()) {
1094 if (std::includes(V1Elems
->second
.begin(), V1Elems
->second
.end(),
1095 V2Elems
->second
.begin(), V2Elems
->second
.end())) {
1097 } else if (std::includes(V2Elems
->second
.begin(), V2Elems
->second
.end(),
1098 V1Elems
->second
.begin(), V1Elems
->second
.end())) {
1101 } else if (V1Elems
!= ShadowElements
.end()) {
1102 if (V1Elems
->second
.count(V2
))
1104 } else if (V2Elems
!= ShadowElements
.end()) {
1105 if (V2Elems
->second
.count(V1
))
1109 auto Key
= std::make_pair(V1
, V2
);
1111 std::swap(Key
.first
, Key
.second
);
1112 CachedCombinedShadow
&CCS
= CachedCombinedShadows
[Key
];
1113 if (CCS
.Block
&& DT
.dominates(CCS
.Block
, Pos
->getParent()))
1116 IRBuilder
<> IRB(Pos
);
1117 if (AvoidNewBlocks
) {
1118 CallInst
*Call
= IRB
.CreateCall(DFS
.DFSanCheckedUnionFn
, {V1
, V2
});
1119 Call
->addAttribute(AttributeList::ReturnIndex
, Attribute::ZExt
);
1120 Call
->addParamAttr(0, Attribute::ZExt
);
1121 Call
->addParamAttr(1, Attribute::ZExt
);
1123 CCS
.Block
= Pos
->getParent();
1126 BasicBlock
*Head
= Pos
->getParent();
1127 Value
*Ne
= IRB
.CreateICmpNE(V1
, V2
);
1128 BranchInst
*BI
= cast
<BranchInst
>(SplitBlockAndInsertIfThen(
1129 Ne
, Pos
, /*Unreachable=*/false, DFS
.ColdCallWeights
, &DT
));
1130 IRBuilder
<> ThenIRB(BI
);
1131 CallInst
*Call
= ThenIRB
.CreateCall(DFS
.DFSanUnionFn
, {V1
, V2
});
1132 Call
->addAttribute(AttributeList::ReturnIndex
, Attribute::ZExt
);
1133 Call
->addParamAttr(0, Attribute::ZExt
);
1134 Call
->addParamAttr(1, Attribute::ZExt
);
1136 BasicBlock
*Tail
= BI
->getSuccessor(0);
1137 PHINode
*Phi
= PHINode::Create(DFS
.ShadowTy
, 2, "", &Tail
->front());
1138 Phi
->addIncoming(Call
, Call
->getParent());
1139 Phi
->addIncoming(V1
, Head
);
1145 std::set
<Value
*> UnionElems
;
1146 if (V1Elems
!= ShadowElements
.end()) {
1147 UnionElems
= V1Elems
->second
;
1149 UnionElems
.insert(V1
);
1151 if (V2Elems
!= ShadowElements
.end()) {
1152 UnionElems
.insert(V2Elems
->second
.begin(), V2Elems
->second
.end());
1154 UnionElems
.insert(V2
);
1156 ShadowElements
[CCS
.Shadow
] = std::move(UnionElems
);
1161 // A convenience function which folds the shadows of each of the operands
1162 // of the provided instruction Inst, inserting the IR before Inst. Returns
1163 // the computed union Value.
1164 Value
*DFSanFunction::combineOperandShadows(Instruction
*Inst
) {
1165 if (Inst
->getNumOperands() == 0)
1166 return DFS
.ZeroShadow
;
1168 Value
*Shadow
= getShadow(Inst
->getOperand(0));
1169 for (unsigned i
= 1, n
= Inst
->getNumOperands(); i
!= n
; ++i
) {
1170 Shadow
= combineShadows(Shadow
, getShadow(Inst
->getOperand(i
)), Inst
);
1175 void DFSanVisitor::visitOperandShadowInst(Instruction
&I
) {
1176 Value
*CombinedShadow
= DFSF
.combineOperandShadows(&I
);
1177 DFSF
.setShadow(&I
, CombinedShadow
);
1180 // Generates IR to load shadow corresponding to bytes [Addr, Addr+Size), where
1181 // Addr has alignment Align, and take the union of each of those shadows.
1182 Value
*DFSanFunction::loadShadow(Value
*Addr
, uint64_t Size
, uint64_t Align
,
1184 if (AllocaInst
*AI
= dyn_cast
<AllocaInst
>(Addr
)) {
1185 const auto i
= AllocaShadowMap
.find(AI
);
1186 if (i
!= AllocaShadowMap
.end()) {
1187 IRBuilder
<> IRB(Pos
);
1188 return IRB
.CreateLoad(DFS
.ShadowTy
, i
->second
);
1192 uint64_t ShadowAlign
= Align
* DFS
.ShadowWidth
/ 8;
1193 SmallVector
<Value
*, 2> Objs
;
1194 GetUnderlyingObjects(Addr
, Objs
, Pos
->getModule()->getDataLayout());
1195 bool AllConstants
= true;
1196 for (Value
*Obj
: Objs
) {
1197 if (isa
<Function
>(Obj
) || isa
<BlockAddress
>(Obj
))
1199 if (isa
<GlobalVariable
>(Obj
) && cast
<GlobalVariable
>(Obj
)->isConstant())
1202 AllConstants
= false;
1206 return DFS
.ZeroShadow
;
1208 Value
*ShadowAddr
= DFS
.getShadowAddress(Addr
, Pos
);
1211 return DFS
.ZeroShadow
;
1213 LoadInst
*LI
= new LoadInst(DFS
.ShadowTy
, ShadowAddr
, "", Pos
);
1214 LI
->setAlignment(ShadowAlign
);
1218 IRBuilder
<> IRB(Pos
);
1219 Value
*ShadowAddr1
= IRB
.CreateGEP(DFS
.ShadowTy
, ShadowAddr
,
1220 ConstantInt::get(DFS
.IntptrTy
, 1));
1221 return combineShadows(
1222 IRB
.CreateAlignedLoad(DFS
.ShadowTy
, ShadowAddr
, ShadowAlign
),
1223 IRB
.CreateAlignedLoad(DFS
.ShadowTy
, ShadowAddr1
, ShadowAlign
), Pos
);
1226 if (!AvoidNewBlocks
&& Size
% (64 / DFS
.ShadowWidth
) == 0) {
1227 // Fast path for the common case where each byte has identical shadow: load
1228 // shadow 64 bits at a time, fall out to a __dfsan_union_load call if any
1229 // shadow is non-equal.
1230 BasicBlock
*FallbackBB
= BasicBlock::Create(*DFS
.Ctx
, "", F
);
1231 IRBuilder
<> FallbackIRB(FallbackBB
);
1232 CallInst
*FallbackCall
= FallbackIRB
.CreateCall(
1233 DFS
.DFSanUnionLoadFn
,
1234 {ShadowAddr
, ConstantInt::get(DFS
.IntptrTy
, Size
)});
1235 FallbackCall
->addAttribute(AttributeList::ReturnIndex
, Attribute::ZExt
);
1237 // Compare each of the shadows stored in the loaded 64 bits to each other,
1238 // by computing (WideShadow rotl ShadowWidth) == WideShadow.
1239 IRBuilder
<> IRB(Pos
);
1241 IRB
.CreateBitCast(ShadowAddr
, Type::getInt64PtrTy(*DFS
.Ctx
));
1243 IRB
.CreateAlignedLoad(IRB
.getInt64Ty(), WideAddr
, ShadowAlign
);
1244 Value
*TruncShadow
= IRB
.CreateTrunc(WideShadow
, DFS
.ShadowTy
);
1245 Value
*ShlShadow
= IRB
.CreateShl(WideShadow
, DFS
.ShadowWidth
);
1246 Value
*ShrShadow
= IRB
.CreateLShr(WideShadow
, 64 - DFS
.ShadowWidth
);
1247 Value
*RotShadow
= IRB
.CreateOr(ShlShadow
, ShrShadow
);
1248 Value
*ShadowsEq
= IRB
.CreateICmpEQ(WideShadow
, RotShadow
);
1250 BasicBlock
*Head
= Pos
->getParent();
1251 BasicBlock
*Tail
= Head
->splitBasicBlock(Pos
->getIterator());
1253 if (DomTreeNode
*OldNode
= DT
.getNode(Head
)) {
1254 std::vector
<DomTreeNode
*> Children(OldNode
->begin(), OldNode
->end());
1256 DomTreeNode
*NewNode
= DT
.addNewBlock(Tail
, Head
);
1257 for (auto Child
: Children
)
1258 DT
.changeImmediateDominator(Child
, NewNode
);
1261 // In the following code LastBr will refer to the previous basic block's
1262 // conditional branch instruction, whose true successor is fixed up to point
1263 // to the next block during the loop below or to the tail after the final
1265 BranchInst
*LastBr
= BranchInst::Create(FallbackBB
, FallbackBB
, ShadowsEq
);
1266 ReplaceInstWithInst(Head
->getTerminator(), LastBr
);
1267 DT
.addNewBlock(FallbackBB
, Head
);
1269 for (uint64_t Ofs
= 64 / DFS
.ShadowWidth
; Ofs
!= Size
;
1270 Ofs
+= 64 / DFS
.ShadowWidth
) {
1271 BasicBlock
*NextBB
= BasicBlock::Create(*DFS
.Ctx
, "", F
);
1272 DT
.addNewBlock(NextBB
, LastBr
->getParent());
1273 IRBuilder
<> NextIRB(NextBB
);
1274 WideAddr
= NextIRB
.CreateGEP(Type::getInt64Ty(*DFS
.Ctx
), WideAddr
,
1275 ConstantInt::get(DFS
.IntptrTy
, 1));
1276 Value
*NextWideShadow
= NextIRB
.CreateAlignedLoad(NextIRB
.getInt64Ty(),
1277 WideAddr
, ShadowAlign
);
1278 ShadowsEq
= NextIRB
.CreateICmpEQ(WideShadow
, NextWideShadow
);
1279 LastBr
->setSuccessor(0, NextBB
);
1280 LastBr
= NextIRB
.CreateCondBr(ShadowsEq
, FallbackBB
, FallbackBB
);
1283 LastBr
->setSuccessor(0, Tail
);
1284 FallbackIRB
.CreateBr(Tail
);
1285 PHINode
*Shadow
= PHINode::Create(DFS
.ShadowTy
, 2, "", &Tail
->front());
1286 Shadow
->addIncoming(FallbackCall
, FallbackBB
);
1287 Shadow
->addIncoming(TruncShadow
, LastBr
->getParent());
1291 IRBuilder
<> IRB(Pos
);
1292 CallInst
*FallbackCall
= IRB
.CreateCall(
1293 DFS
.DFSanUnionLoadFn
, {ShadowAddr
, ConstantInt::get(DFS
.IntptrTy
, Size
)});
1294 FallbackCall
->addAttribute(AttributeList::ReturnIndex
, Attribute::ZExt
);
1295 return FallbackCall
;
1298 void DFSanVisitor::visitLoadInst(LoadInst
&LI
) {
1299 auto &DL
= LI
.getModule()->getDataLayout();
1300 uint64_t Size
= DL
.getTypeStoreSize(LI
.getType());
1302 DFSF
.setShadow(&LI
, DFSF
.DFS
.ZeroShadow
);
1307 if (ClPreserveAlignment
) {
1308 Align
= LI
.getAlignment();
1310 Align
= DL
.getABITypeAlignment(LI
.getType());
1314 IRBuilder
<> IRB(&LI
);
1315 Value
*Shadow
= DFSF
.loadShadow(LI
.getPointerOperand(), Size
, Align
, &LI
);
1316 if (ClCombinePointerLabelsOnLoad
) {
1317 Value
*PtrShadow
= DFSF
.getShadow(LI
.getPointerOperand());
1318 Shadow
= DFSF
.combineShadows(Shadow
, PtrShadow
, &LI
);
1320 if (Shadow
!= DFSF
.DFS
.ZeroShadow
)
1321 DFSF
.NonZeroChecks
.push_back(Shadow
);
1323 DFSF
.setShadow(&LI
, Shadow
);
1326 void DFSanFunction::storeShadow(Value
*Addr
, uint64_t Size
, uint64_t Align
,
1327 Value
*Shadow
, Instruction
*Pos
) {
1328 if (AllocaInst
*AI
= dyn_cast
<AllocaInst
>(Addr
)) {
1329 const auto i
= AllocaShadowMap
.find(AI
);
1330 if (i
!= AllocaShadowMap
.end()) {
1331 IRBuilder
<> IRB(Pos
);
1332 IRB
.CreateStore(Shadow
, i
->second
);
1337 uint64_t ShadowAlign
= Align
* DFS
.ShadowWidth
/ 8;
1338 IRBuilder
<> IRB(Pos
);
1339 Value
*ShadowAddr
= DFS
.getShadowAddress(Addr
, Pos
);
1340 if (Shadow
== DFS
.ZeroShadow
) {
1341 IntegerType
*ShadowTy
= IntegerType::get(*DFS
.Ctx
, Size
* DFS
.ShadowWidth
);
1342 Value
*ExtZeroShadow
= ConstantInt::get(ShadowTy
, 0);
1343 Value
*ExtShadowAddr
=
1344 IRB
.CreateBitCast(ShadowAddr
, PointerType::getUnqual(ShadowTy
));
1345 IRB
.CreateAlignedStore(ExtZeroShadow
, ExtShadowAddr
, ShadowAlign
);
1349 const unsigned ShadowVecSize
= 128 / DFS
.ShadowWidth
;
1350 uint64_t Offset
= 0;
1351 if (Size
>= ShadowVecSize
) {
1352 VectorType
*ShadowVecTy
= VectorType::get(DFS
.ShadowTy
, ShadowVecSize
);
1353 Value
*ShadowVec
= UndefValue::get(ShadowVecTy
);
1354 for (unsigned i
= 0; i
!= ShadowVecSize
; ++i
) {
1355 ShadowVec
= IRB
.CreateInsertElement(
1356 ShadowVec
, Shadow
, ConstantInt::get(Type::getInt32Ty(*DFS
.Ctx
), i
));
1358 Value
*ShadowVecAddr
=
1359 IRB
.CreateBitCast(ShadowAddr
, PointerType::getUnqual(ShadowVecTy
));
1361 Value
*CurShadowVecAddr
=
1362 IRB
.CreateConstGEP1_32(ShadowVecTy
, ShadowVecAddr
, Offset
);
1363 IRB
.CreateAlignedStore(ShadowVec
, CurShadowVecAddr
, ShadowAlign
);
1364 Size
-= ShadowVecSize
;
1366 } while (Size
>= ShadowVecSize
);
1367 Offset
*= ShadowVecSize
;
1370 Value
*CurShadowAddr
=
1371 IRB
.CreateConstGEP1_32(DFS
.ShadowTy
, ShadowAddr
, Offset
);
1372 IRB
.CreateAlignedStore(Shadow
, CurShadowAddr
, ShadowAlign
);
1378 void DFSanVisitor::visitStoreInst(StoreInst
&SI
) {
1379 auto &DL
= SI
.getModule()->getDataLayout();
1380 uint64_t Size
= DL
.getTypeStoreSize(SI
.getValueOperand()->getType());
1385 if (ClPreserveAlignment
) {
1386 Align
= SI
.getAlignment();
1388 Align
= DL
.getABITypeAlignment(SI
.getValueOperand()->getType());
1393 Value
* Shadow
= DFSF
.getShadow(SI
.getValueOperand());
1394 if (ClCombinePointerLabelsOnStore
) {
1395 Value
*PtrShadow
= DFSF
.getShadow(SI
.getPointerOperand());
1396 Shadow
= DFSF
.combineShadows(Shadow
, PtrShadow
, &SI
);
1398 DFSF
.storeShadow(SI
.getPointerOperand(), Size
, Align
, Shadow
, &SI
);
1401 void DFSanVisitor::visitBinaryOperator(BinaryOperator
&BO
) {
1402 visitOperandShadowInst(BO
);
1405 void DFSanVisitor::visitCastInst(CastInst
&CI
) { visitOperandShadowInst(CI
); }
1407 void DFSanVisitor::visitCmpInst(CmpInst
&CI
) { visitOperandShadowInst(CI
); }
1409 void DFSanVisitor::visitGetElementPtrInst(GetElementPtrInst
&GEPI
) {
1410 visitOperandShadowInst(GEPI
);
1413 void DFSanVisitor::visitExtractElementInst(ExtractElementInst
&I
) {
1414 visitOperandShadowInst(I
);
1417 void DFSanVisitor::visitInsertElementInst(InsertElementInst
&I
) {
1418 visitOperandShadowInst(I
);
1421 void DFSanVisitor::visitShuffleVectorInst(ShuffleVectorInst
&I
) {
1422 visitOperandShadowInst(I
);
1425 void DFSanVisitor::visitExtractValueInst(ExtractValueInst
&I
) {
1426 visitOperandShadowInst(I
);
1429 void DFSanVisitor::visitInsertValueInst(InsertValueInst
&I
) {
1430 visitOperandShadowInst(I
);
1433 void DFSanVisitor::visitAllocaInst(AllocaInst
&I
) {
1434 bool AllLoadsStores
= true;
1435 for (User
*U
: I
.users()) {
1436 if (isa
<LoadInst
>(U
))
1439 if (StoreInst
*SI
= dyn_cast
<StoreInst
>(U
)) {
1440 if (SI
->getPointerOperand() == &I
)
1444 AllLoadsStores
= false;
1447 if (AllLoadsStores
) {
1448 IRBuilder
<> IRB(&I
);
1449 DFSF
.AllocaShadowMap
[&I
] = IRB
.CreateAlloca(DFSF
.DFS
.ShadowTy
);
1451 DFSF
.setShadow(&I
, DFSF
.DFS
.ZeroShadow
);
1454 void DFSanVisitor::visitSelectInst(SelectInst
&I
) {
1455 Value
*CondShadow
= DFSF
.getShadow(I
.getCondition());
1456 Value
*TrueShadow
= DFSF
.getShadow(I
.getTrueValue());
1457 Value
*FalseShadow
= DFSF
.getShadow(I
.getFalseValue());
1459 if (isa
<VectorType
>(I
.getCondition()->getType())) {
1462 DFSF
.combineShadows(
1463 CondShadow
, DFSF
.combineShadows(TrueShadow
, FalseShadow
, &I
), &I
));
1466 if (TrueShadow
== FalseShadow
) {
1467 ShadowSel
= TrueShadow
;
1470 SelectInst::Create(I
.getCondition(), TrueShadow
, FalseShadow
, "", &I
);
1472 DFSF
.setShadow(&I
, DFSF
.combineShadows(CondShadow
, ShadowSel
, &I
));
1476 void DFSanVisitor::visitMemSetInst(MemSetInst
&I
) {
1477 IRBuilder
<> IRB(&I
);
1478 Value
*ValShadow
= DFSF
.getShadow(I
.getValue());
1479 IRB
.CreateCall(DFSF
.DFS
.DFSanSetLabelFn
,
1480 {ValShadow
, IRB
.CreateBitCast(I
.getDest(), Type::getInt8PtrTy(
1482 IRB
.CreateZExtOrTrunc(I
.getLength(), DFSF
.DFS
.IntptrTy
)});
1485 void DFSanVisitor::visitMemTransferInst(MemTransferInst
&I
) {
1486 IRBuilder
<> IRB(&I
);
1487 Value
*DestShadow
= DFSF
.DFS
.getShadowAddress(I
.getDest(), &I
);
1488 Value
*SrcShadow
= DFSF
.DFS
.getShadowAddress(I
.getSource(), &I
);
1489 Value
*LenShadow
= IRB
.CreateMul(
1491 ConstantInt::get(I
.getLength()->getType(), DFSF
.DFS
.ShadowWidth
/ 8));
1492 Type
*Int8Ptr
= Type::getInt8PtrTy(*DFSF
.DFS
.Ctx
);
1493 DestShadow
= IRB
.CreateBitCast(DestShadow
, Int8Ptr
);
1494 SrcShadow
= IRB
.CreateBitCast(SrcShadow
, Int8Ptr
);
1495 auto *MTI
= cast
<MemTransferInst
>(
1496 IRB
.CreateCall(I
.getFunctionType(), I
.getCalledValue(),
1497 {DestShadow
, SrcShadow
, LenShadow
, I
.getVolatileCst()}));
1498 if (ClPreserveAlignment
) {
1499 MTI
->setDestAlignment(I
.getDestAlignment() * (DFSF
.DFS
.ShadowWidth
/ 8));
1500 MTI
->setSourceAlignment(I
.getSourceAlignment() * (DFSF
.DFS
.ShadowWidth
/ 8));
1502 MTI
->setDestAlignment(DFSF
.DFS
.ShadowWidth
/ 8);
1503 MTI
->setSourceAlignment(DFSF
.DFS
.ShadowWidth
/ 8);
1507 void DFSanVisitor::visitReturnInst(ReturnInst
&RI
) {
1508 if (!DFSF
.IsNativeABI
&& RI
.getReturnValue()) {
1510 case DataFlowSanitizer::IA_TLS
: {
1511 Value
*S
= DFSF
.getShadow(RI
.getReturnValue());
1512 IRBuilder
<> IRB(&RI
);
1513 IRB
.CreateStore(S
, DFSF
.getRetvalTLS());
1516 case DataFlowSanitizer::IA_Args
: {
1517 IRBuilder
<> IRB(&RI
);
1518 Type
*RT
= DFSF
.F
->getFunctionType()->getReturnType();
1520 IRB
.CreateInsertValue(UndefValue::get(RT
), RI
.getReturnValue(), 0);
1522 IRB
.CreateInsertValue(InsVal
, DFSF
.getShadow(RI
.getReturnValue()), 1);
1523 RI
.setOperand(0, InsShadow
);
1530 void DFSanVisitor::visitCallSite(CallSite CS
) {
1531 Function
*F
= CS
.getCalledFunction();
1532 if ((F
&& F
->isIntrinsic()) || isa
<InlineAsm
>(CS
.getCalledValue())) {
1533 visitOperandShadowInst(*CS
.getInstruction());
1537 // Calls to this function are synthesized in wrappers, and we shouldn't
1539 if (F
== DFSF
.DFS
.DFSanVarargWrapperFn
.getCallee()->stripPointerCasts())
1542 IRBuilder
<> IRB(CS
.getInstruction());
1544 DenseMap
<Value
*, Function
*>::iterator i
=
1545 DFSF
.DFS
.UnwrappedFnMap
.find(CS
.getCalledValue());
1546 if (i
!= DFSF
.DFS
.UnwrappedFnMap
.end()) {
1547 Function
*F
= i
->second
;
1548 switch (DFSF
.DFS
.getWrapperKind(F
)) {
1549 case DataFlowSanitizer::WK_Warning
:
1550 CS
.setCalledFunction(F
);
1551 IRB
.CreateCall(DFSF
.DFS
.DFSanUnimplementedFn
,
1552 IRB
.CreateGlobalStringPtr(F
->getName()));
1553 DFSF
.setShadow(CS
.getInstruction(), DFSF
.DFS
.ZeroShadow
);
1555 case DataFlowSanitizer::WK_Discard
:
1556 CS
.setCalledFunction(F
);
1557 DFSF
.setShadow(CS
.getInstruction(), DFSF
.DFS
.ZeroShadow
);
1559 case DataFlowSanitizer::WK_Functional
:
1560 CS
.setCalledFunction(F
);
1561 visitOperandShadowInst(*CS
.getInstruction());
1563 case DataFlowSanitizer::WK_Custom
:
1564 // Don't try to handle invokes of custom functions, it's too complicated.
1565 // Instead, invoke the dfsw$ wrapper, which will in turn call the __dfsw_
1567 if (CallInst
*CI
= dyn_cast
<CallInst
>(CS
.getInstruction())) {
1568 FunctionType
*FT
= F
->getFunctionType();
1569 TransformedFunction CustomFn
= DFSF
.DFS
.getCustomFunctionType(FT
);
1570 std::string CustomFName
= "__dfsw_";
1571 CustomFName
+= F
->getName();
1572 FunctionCallee CustomF
= DFSF
.DFS
.Mod
->getOrInsertFunction(
1573 CustomFName
, CustomFn
.TransformedType
);
1574 if (Function
*CustomFn
= dyn_cast
<Function
>(CustomF
.getCallee())) {
1575 CustomFn
->copyAttributesFrom(F
);
1577 // Custom functions returning non-void will write to the return label.
1578 if (!FT
->getReturnType()->isVoidTy()) {
1579 CustomFn
->removeAttributes(AttributeList::FunctionIndex
,
1580 DFSF
.DFS
.ReadOnlyNoneAttrs
);
1584 std::vector
<Value
*> Args
;
1586 CallSite::arg_iterator i
= CS
.arg_begin();
1587 for (unsigned n
= FT
->getNumParams(); n
!= 0; ++i
, --n
) {
1588 Type
*T
= (*i
)->getType();
1589 FunctionType
*ParamFT
;
1590 if (isa
<PointerType
>(T
) &&
1591 (ParamFT
= dyn_cast
<FunctionType
>(
1592 cast
<PointerType
>(T
)->getElementType()))) {
1593 std::string TName
= "dfst";
1594 TName
+= utostr(FT
->getNumParams() - n
);
1596 TName
+= F
->getName();
1597 Constant
*T
= DFSF
.DFS
.getOrBuildTrampolineFunction(ParamFT
, TName
);
1600 IRB
.CreateBitCast(*i
, Type::getInt8PtrTy(*DFSF
.DFS
.Ctx
)));
1607 const unsigned ShadowArgStart
= Args
.size();
1608 for (unsigned n
= FT
->getNumParams(); n
!= 0; ++i
, --n
)
1609 Args
.push_back(DFSF
.getShadow(*i
));
1611 if (FT
->isVarArg()) {
1612 auto *LabelVATy
= ArrayType::get(DFSF
.DFS
.ShadowTy
,
1613 CS
.arg_size() - FT
->getNumParams());
1614 auto *LabelVAAlloca
= new AllocaInst(
1615 LabelVATy
, getDataLayout().getAllocaAddrSpace(),
1616 "labelva", &DFSF
.F
->getEntryBlock().front());
1618 for (unsigned n
= 0; i
!= CS
.arg_end(); ++i
, ++n
) {
1619 auto LabelVAPtr
= IRB
.CreateStructGEP(LabelVATy
, LabelVAAlloca
, n
);
1620 IRB
.CreateStore(DFSF
.getShadow(*i
), LabelVAPtr
);
1623 Args
.push_back(IRB
.CreateStructGEP(LabelVATy
, LabelVAAlloca
, 0));
1626 if (!FT
->getReturnType()->isVoidTy()) {
1627 if (!DFSF
.LabelReturnAlloca
) {
1628 DFSF
.LabelReturnAlloca
=
1629 new AllocaInst(DFSF
.DFS
.ShadowTy
,
1630 getDataLayout().getAllocaAddrSpace(),
1631 "labelreturn", &DFSF
.F
->getEntryBlock().front());
1633 Args
.push_back(DFSF
.LabelReturnAlloca
);
1636 for (i
= CS
.arg_begin() + FT
->getNumParams(); i
!= CS
.arg_end(); ++i
)
1639 CallInst
*CustomCI
= IRB
.CreateCall(CustomF
, Args
);
1640 CustomCI
->setCallingConv(CI
->getCallingConv());
1641 CustomCI
->setAttributes(TransformFunctionAttributes(CustomFn
,
1642 CI
->getContext(), CI
->getAttributes()));
1644 // Update the parameter attributes of the custom call instruction to
1645 // zero extend the shadow parameters. This is required for targets
1646 // which consider ShadowTy an illegal type.
1647 for (unsigned n
= 0; n
< FT
->getNumParams(); n
++) {
1648 const unsigned ArgNo
= ShadowArgStart
+ n
;
1649 if (CustomCI
->getArgOperand(ArgNo
)->getType() == DFSF
.DFS
.ShadowTy
)
1650 CustomCI
->addParamAttr(ArgNo
, Attribute::ZExt
);
1653 if (!FT
->getReturnType()->isVoidTy()) {
1654 LoadInst
*LabelLoad
=
1655 IRB
.CreateLoad(DFSF
.DFS
.ShadowTy
, DFSF
.LabelReturnAlloca
);
1656 DFSF
.setShadow(CustomCI
, LabelLoad
);
1659 CI
->replaceAllUsesWith(CustomCI
);
1660 CI
->eraseFromParent();
1667 FunctionType
*FT
= cast
<FunctionType
>(
1668 CS
.getCalledValue()->getType()->getPointerElementType());
1669 if (DFSF
.DFS
.getInstrumentedABI() == DataFlowSanitizer::IA_TLS
) {
1670 for (unsigned i
= 0, n
= FT
->getNumParams(); i
!= n
; ++i
) {
1671 IRB
.CreateStore(DFSF
.getShadow(CS
.getArgument(i
)),
1672 DFSF
.getArgTLS(i
, CS
.getInstruction()));
1676 Instruction
*Next
= nullptr;
1677 if (!CS
.getType()->isVoidTy()) {
1678 if (InvokeInst
*II
= dyn_cast
<InvokeInst
>(CS
.getInstruction())) {
1679 if (II
->getNormalDest()->getSinglePredecessor()) {
1680 Next
= &II
->getNormalDest()->front();
1683 SplitEdge(II
->getParent(), II
->getNormalDest(), &DFSF
.DT
);
1684 Next
= &NewBB
->front();
1687 assert(CS
->getIterator() != CS
->getParent()->end());
1688 Next
= CS
->getNextNode();
1691 if (DFSF
.DFS
.getInstrumentedABI() == DataFlowSanitizer::IA_TLS
) {
1692 IRBuilder
<> NextIRB(Next
);
1693 LoadInst
*LI
= NextIRB
.CreateLoad(DFSF
.DFS
.ShadowTy
, DFSF
.getRetvalTLS());
1694 DFSF
.SkipInsts
.insert(LI
);
1695 DFSF
.setShadow(CS
.getInstruction(), LI
);
1696 DFSF
.NonZeroChecks
.push_back(LI
);
1700 // Do all instrumentation for IA_Args down here to defer tampering with the
1701 // CFG in a way that SplitEdge may be able to detect.
1702 if (DFSF
.DFS
.getInstrumentedABI() == DataFlowSanitizer::IA_Args
) {
1703 FunctionType
*NewFT
= DFSF
.DFS
.getArgsFunctionType(FT
);
1705 IRB
.CreateBitCast(CS
.getCalledValue(), PointerType::getUnqual(NewFT
));
1706 std::vector
<Value
*> Args
;
1708 CallSite::arg_iterator i
= CS
.arg_begin(), e
= CS
.arg_end();
1709 for (unsigned n
= FT
->getNumParams(); n
!= 0; ++i
, --n
)
1713 for (unsigned n
= FT
->getNumParams(); n
!= 0; ++i
, --n
)
1714 Args
.push_back(DFSF
.getShadow(*i
));
1716 if (FT
->isVarArg()) {
1717 unsigned VarArgSize
= CS
.arg_size() - FT
->getNumParams();
1718 ArrayType
*VarArgArrayTy
= ArrayType::get(DFSF
.DFS
.ShadowTy
, VarArgSize
);
1719 AllocaInst
*VarArgShadow
=
1720 new AllocaInst(VarArgArrayTy
, getDataLayout().getAllocaAddrSpace(),
1721 "", &DFSF
.F
->getEntryBlock().front());
1722 Args
.push_back(IRB
.CreateConstGEP2_32(VarArgArrayTy
, VarArgShadow
, 0, 0));
1723 for (unsigned n
= 0; i
!= e
; ++i
, ++n
) {
1726 IRB
.CreateConstGEP2_32(VarArgArrayTy
, VarArgShadow
, 0, n
));
1732 if (InvokeInst
*II
= dyn_cast
<InvokeInst
>(CS
.getInstruction())) {
1733 NewCS
= IRB
.CreateInvoke(NewFT
, Func
, II
->getNormalDest(),
1734 II
->getUnwindDest(), Args
);
1736 NewCS
= IRB
.CreateCall(NewFT
, Func
, Args
);
1738 NewCS
.setCallingConv(CS
.getCallingConv());
1739 NewCS
.setAttributes(CS
.getAttributes().removeAttributes(
1740 *DFSF
.DFS
.Ctx
, AttributeList::ReturnIndex
,
1741 AttributeFuncs::typeIncompatible(NewCS
.getInstruction()->getType())));
1744 ExtractValueInst
*ExVal
=
1745 ExtractValueInst::Create(NewCS
.getInstruction(), 0, "", Next
);
1746 DFSF
.SkipInsts
.insert(ExVal
);
1747 ExtractValueInst
*ExShadow
=
1748 ExtractValueInst::Create(NewCS
.getInstruction(), 1, "", Next
);
1749 DFSF
.SkipInsts
.insert(ExShadow
);
1750 DFSF
.setShadow(ExVal
, ExShadow
);
1751 DFSF
.NonZeroChecks
.push_back(ExShadow
);
1753 CS
.getInstruction()->replaceAllUsesWith(ExVal
);
1756 CS
.getInstruction()->eraseFromParent();
1760 void DFSanVisitor::visitPHINode(PHINode
&PN
) {
1762 PHINode::Create(DFSF
.DFS
.ShadowTy
, PN
.getNumIncomingValues(), "", &PN
);
1764 // Give the shadow phi node valid predecessors to fool SplitEdge into working.
1765 Value
*UndefShadow
= UndefValue::get(DFSF
.DFS
.ShadowTy
);
1766 for (PHINode::block_iterator i
= PN
.block_begin(), e
= PN
.block_end(); i
!= e
;
1768 ShadowPN
->addIncoming(UndefShadow
, *i
);
1771 DFSF
.PHIFixups
.push_back(std::make_pair(&PN
, ShadowPN
));
1772 DFSF
.setShadow(&PN
, ShadowPN
);