Skip to content

Commit d314f93

Browse files
committed
[LLVM][rtsan] Add LLVM nonblocking attribute for realtime sanitizer
1 parent 3f6eb13 commit d314f93

File tree

7 files changed

+22
-2
lines changed

7 files changed

+22
-2
lines changed

llvm/include/llvm/Bitcode/LLVMBitCodes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -758,6 +758,7 @@ enum AttributeKindCodes {
758758
ATTR_KIND_SANITIZE_NUMERICAL_STABILITY = 93,
759759
ATTR_KIND_INITIALIZES = 94,
760760
ATTR_KIND_HYBRID_PATCHABLE = 95,
761+
ATTR_KIND_NONBLOCKING = 96,
761762
};
762763

763764
enum ComdatSelectionKindCodes {

llvm/include/llvm/IR/Attributes.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,9 @@ def ReadNone : EnumAttr<"readnone", [ParamAttr]>;
239239
/// Function only reads from memory.
240240
def ReadOnly : EnumAttr<"readonly", [ParamAttr]>;
241241

242+
/// Function is marked to be non-blocking
243+
def NonBlocking : EnumAttr<"nonblocking", [FnAttr]>;
244+
242245
/// Return value is always equal to this argument.
243246
def Returned : EnumAttr<"returned", [ParamAttr]>;
244247

llvm/lib/Bitcode/Reader/BitcodeReader.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2109,6 +2109,8 @@ static Attribute::AttrKind getAttrFromCode(uint64_t Code) {
21092109
return Attribute::ReadOnly;
21102110
case bitc::ATTR_KIND_RETURNED:
21112111
return Attribute::Returned;
2112+
case bitc::ATTR_KIND_NONBLOCKING:
2113+
return Attribute::NonBlocking;
21122114
case bitc::ATTR_KIND_RETURNS_TWICE:
21132115
return Attribute::ReturnsTwice;
21142116
case bitc::ATTR_KIND_S_EXT:

llvm/lib/Bitcode/Writer/BitcodeWriter.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -805,6 +805,8 @@ static uint64_t getAttrKindEncoding(Attribute::AttrKind Kind) {
805805
return bitc::ATTR_KIND_OPTIMIZE_FOR_SIZE;
806806
case Attribute::OptimizeNone:
807807
return bitc::ATTR_KIND_OPTIMIZE_NONE;
808+
case Attribute::NonBlocking:
809+
return bitc::ATTR_KIND_NONBLOCKING;
808810
case Attribute::ReadNone:
809811
return bitc::ATTR_KIND_READ_NONE;
810812
case Attribute::ReadOnly:

llvm/lib/Transforms/Utils/CodeExtractor.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -946,6 +946,7 @@ Function *CodeExtractor::constructFunction(const ValueSet &inputs,
946946
case Attribute::NoUnwind:
947947
case Attribute::NoSanitizeBounds:
948948
case Attribute::NoSanitizeCoverage:
949+
case Attribute::NonBlocking:
949950
case Attribute::NullPointerIsValid:
950951
case Attribute::OptimizeForDebugging:
951952
case Attribute::OptForFuzzing:

llvm/test/Bitcode/attributes.ll

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,12 @@ define void @f86() nosanitize_bounds
505505
ret void;
506506
}
507507

508+
; CHECK: define void @f92() #53
509+
define void @f92() nonblocking
510+
{
511+
ret void;
512+
}
513+
508514
; CHECK: define void @f87() [[FNRETTHUNKEXTERN:#[0-9]+]]
509515
define void @f87() fn_ret_thunk_extern { ret void }
510516

@@ -599,6 +605,7 @@ define void @initializes(ptr initializes((-4, 0), (4, 8)) %a) {
599605
; CHECK: attributes #50 = { disable_sanitizer_instrumentation }
600606
; CHECK: attributes #51 = { uwtable(sync) }
601607
; CHECK: attributes #52 = { nosanitize_bounds }
608+
; CHECK: attributes #53 = { nonblocking }
602609
; CHECK: attributes [[FNRETTHUNKEXTERN]] = { fn_ret_thunk_extern }
603610
; CHECK: attributes [[SKIPPROFILE]] = { skipprofile }
604611
; CHECK: attributes [[OPTDEBUG]] = { optdebug }

llvm/test/Bitcode/compatibility.ll

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1564,7 +1564,7 @@ exit:
15641564
; CHECK: select <2 x i1> <i1 true, i1 false>, <2 x i8> <i8 2, i8 3>, <2 x i8> <i8 3, i8 2>
15651565

15661566
call void @f.nobuiltin() builtin
1567-
; CHECK: call void @f.nobuiltin() #52
1567+
; CHECK: call void @f.nobuiltin() #53
15681568

15691569
call fastcc noalias ptr @f.noalias() noinline
15701570
; CHECK: call fastcc noalias ptr @f.noalias() #12
@@ -1991,6 +1991,9 @@ declare void @f.allockind() allockind("alloc,uninitialized")
19911991
declare void @f.sanitize_numerical_stability() sanitize_numerical_stability
19921992
; CHECK: declare void @f.sanitize_numerical_stability() #51
19931993

1994+
declare void @f.nonblocking() nonblocking
1995+
; CHECK: declare void @f.nonblocking() #52
1996+
19941997
; CHECK: declare nofpclass(snan) float @nofpclass_snan(float nofpclass(snan))
19951998
declare nofpclass(snan) float @nofpclass_snan(float nofpclass(snan))
19961999

@@ -2113,7 +2116,8 @@ define float @nofpclass_callsites(float %arg) {
21132116
; CHECK: attributes #49 = { nosanitize_bounds }
21142117
; CHECK: attributes #50 = { allockind("alloc,uninitialized") }
21152118
; CHECK: attributes #51 = { sanitize_numerical_stability }
2116-
; CHECK: attributes #52 = { builtin }
2119+
; CHECK: attributes #52 = { nonblocking }
2120+
; CHECK: attributes #53 = { builtin }
21172121

21182122
;; Metadata
21192123

0 commit comments

Comments
 (0)