@@ -817,6 +817,22 @@ MemorySanitizer::getOrInsertMsanMetadataFunction(Module &M, StringRef Name,
817
817
std::forward<ArgsTy>(Args)...);
818
818
}
819
819
820
+ StringRef getWarningFnName (bool TrackOrigins, bool Recover, bool EmbedFaultingInst) {
821
+ StringRef warningFnName [2 ][2 ][2 ]
822
+ = {
823
+ {
824
+ {" __msan_warning_noreturn" , " __msan_warning_noreturn_instname" },
825
+ {" __msan_warning" , " __msan_warning_instname" }
826
+ },
827
+ {
828
+ {" __msan_warning_with_origin_noreturn" , " __msan_warning_with_origin_noreturn_instname" },
829
+ {" __msan_warning_with_origin" , " __msan_warning_with_origin_instname" },
830
+ }
831
+ };
832
+
833
+ return warningFnName[TrackOrigins][Recover][EmbedFaultingInst];
834
+ }
835
+
820
836
// / Create KMSAN API callbacks.
821
837
void MemorySanitizer::createKernelApi (Module &M, const TargetLibraryInfo &TLI) {
822
838
IRBuilder<> IRB (*C);
@@ -831,11 +847,9 @@ void MemorySanitizer::createKernelApi(Module &M, const TargetLibraryInfo &TLI) {
831
847
VAArgOverflowSizeTLS = nullptr ;
832
848
833
849
SmallVector<Type *, 4 > ArgsTy = {IRB.getInt32Ty ()};
834
- StringRef FnName = " __msan_warning " ;
835
- if (ClEmbedFaultingInst != MSanEmbedFaultingInstructionMode::None) {
850
+ StringRef FnName = getWarningFnName ( /* TrackOrigins= */ false , /* Recover= */ true , ClEmbedFaultingInst != MSanEmbedFaultingInstructionMode::None) ;
851
+ if (ClEmbedFaultingInst != MSanEmbedFaultingInstructionMode::None)
836
852
ArgsTy.push_back (IRB.getPtrTy ());
837
- FnName = " __msan_warning_instname" ;
838
- }
839
853
WarningFn = M.getOrInsertFunction (
840
854
FnName, FunctionType::get (IRB.getVoidTy (), ArgsTy, false ),
841
855
TLI.getAttrList (C, {0 }, /* Signed=*/ false ));
@@ -893,27 +907,18 @@ void MemorySanitizer::createUserspaceApi(Module &M,
893
907
// Create the callback.
894
908
// FIXME: this function should have "Cold" calling conv,
895
909
// which is not yet implemented.
910
+ StringRef WarningFnName = getWarningFnName (TrackOrigins, Recover, ClEmbedFaultingInst != MSanEmbedFaultingInstructionMode::None);
911
+ SmallVector<Type *, 4 > ArgsTy = {};
896
912
if (TrackOrigins) {
897
- SmallVector<Type *, 4 > ArgsTy = {IRB.getInt32Ty ()};
898
- StringRef WarningFnName = Recover ? " __msan_warning_with_origin"
899
- : " __msan_warning_with_origin_noreturn" ;
900
- if (ClEmbedFaultingInst != MSanEmbedFaultingInstructionMode::None) {
913
+ ArgsTy.push_back (IRB.getInt32Ty ());
914
+ if (ClEmbedFaultingInst != MSanEmbedFaultingInstructionMode::None)
901
915
ArgsTy.push_back (IRB.getPtrTy ());
902
- WarningFnName = Recover ? " __msan_warning_with_origin_instname"
903
- : " __msan_warning_with_origin_noreturn_instname" ;
904
- }
905
916
WarningFn = M.getOrInsertFunction (
906
917
WarningFnName, FunctionType::get (IRB.getVoidTy (), ArgsTy, false ),
907
918
TLI.getAttrList (C, {0 }, /* Signed=*/ false ));
908
919
} else {
909
- SmallVector<Type *, 4 > ArgsTy = {};
910
- StringRef WarningFnName =
911
- Recover ? " __msan_warning" : " __msan_warning_noreturn" ;
912
- if (ClEmbedFaultingInst != MSanEmbedFaultingInstructionMode::None) {
920
+ if (ClEmbedFaultingInst != MSanEmbedFaultingInstructionMode::None)
913
921
ArgsTy.push_back (IRB.getPtrTy ());
914
- WarningFnName = Recover ? " __msan_warning_instname"
915
- : " __msan_warning_noreturn_instname" ;
916
- }
917
922
WarningFn = M.getOrInsertFunction (
918
923
WarningFnName, FunctionType::get (IRB.getVoidTy (), ArgsTy, false ));
919
924
}
0 commit comments