llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-llvm-transforms Author: Vitaly Buka (vitalybuka) <details> <summary>Changes</summary> Reserve maximal availibe priority to runtime. We need to run code in sanitizer runtime after all C++ constructors. https://clang.llvm.org/docs/AttributeReference.html#constructor --- Full diff: https://github.com/llvm/llvm-project/pull/101772.diff 2 Files Affected: - (modified) llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp (+24) - (modified) llvm/test/Instrumentation/AddressSanitizer/instrument_late_initializer.ll (+1-1) ``````````diff diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp index 9fb1df7ab2b79..734cbd0515ea8 100644 --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -133,6 +133,7 @@ const char kAsanModuleDtorName[] = "asan.module_dtor"; static const uint64_t kAsanCtorAndDtorPriority = 1; // On Emscripten, the system needs more than one priorities for constructors. static const uint64_t kAsanEmscriptenCtorAndDtorPriority = 50; +static const uint64_t kMaxCtorAndDtorPriority = 65535; const char kAsanReportErrorTemplate[] = "__asan_report_"; const char kAsanRegisterGlobalsName[] = "__asan_register_globals"; const char kAsanUnregisterGlobalsName[] = "__asan_unregister_globals"; @@ -1993,6 +1994,29 @@ void ModuleAddressSanitizer::createInitializerPoisonCalls( poisonOneInitializer(*F, ModuleName); } } + assert(ClInitializers); + updateGlobalCtors(M, [](Constant *C) -> Constant * { + ConstantStruct *CS = dyn_cast<ConstantStruct>(C); + if (!CS) + return C; + auto *Priority = cast<ConstantInt>(CS->getOperand(0)); + if (Priority->getLimitedValue() != kMaxCtorAndDtorPriority) + return C; + // As optimization, runtime needs to execute callback just after all + // constructors. We going to set priority to the max allowed value. However, + // the default constructor priorily is already max, so as-is we will not be + // able to guaranty desired order. So reduce the priority by one to reserve + // max value for the constructor in runtime. + StructType *EltTy = cast<StructType>(CS->getType()); + Constant *CSVals[3] = { + ConstantInt::getSigned(Priority->getType(), + kMaxCtorAndDtorPriority - 1), + CS->getOperand(1), + CS->getOperand(2), + }; + return cast<ConstantStruct>( + ConstantStruct::get(EltTy, ArrayRef(CSVals, EltTy->getNumElements()))); + }); } const GlobalVariable * diff --git a/llvm/test/Instrumentation/AddressSanitizer/instrument_late_initializer.ll b/llvm/test/Instrumentation/AddressSanitizer/instrument_late_initializer.ll index 45d526a42c9f7..2225ccb217208 100644 --- a/llvm/test/Instrumentation/AddressSanitizer/instrument_late_initializer.ll +++ b/llvm/test/Instrumentation/AddressSanitizer/instrument_late_initializer.ll @@ -9,7 +9,7 @@ target triple = "x86_64-unknown-linux-gnu" @g = internal global i32 0, align 4, sanitize_address_dyninit ; With dynamic initializer. ;. -; CHECK: @llvm.global_ctors = appending global [2 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @__late_ctor, ptr null }, { i32, ptr, ptr } { i32 1, ptr @asan.module_ctor, ptr @asan.module_ctor }] +; CHECK: @llvm.global_ctors = appending global [2 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65534, ptr @__late_ctor, ptr null }, { i32, ptr, ptr } { i32 1, ptr @asan.module_ctor, ptr @asan.module_ctor }] ;. ; NOINIT: @llvm.global_ctors = appending global [2 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @__late_ctor, ptr null }, { i32, ptr, ptr } { i32 1, ptr @asan.module_ctor, ptr @asan.module_ctor }] ;. `````````` </details> https://github.com/llvm/llvm-project/pull/101772 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits