Skip to content

Commit

Permalink
rdar://11542750 - llvm.trap should be marked no return.
Browse files Browse the repository at this point in the history
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157551 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
lattner committed May 27, 2012
1 parent 8e33712 commit 8620890
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 8 deletions.
4 changes: 2 additions & 2 deletions docs/LangRef.html
Original file line number Diff line number Diff line change
Expand Up @@ -8386,7 +8386,7 @@ <h4>

<h5>Syntax:</h5>
<pre>
declare void @llvm.trap()
declare void @llvm.trap() noreturn nounwind
</pre>

<h5>Overview:</h5>
Expand All @@ -8411,7 +8411,7 @@ <h4>

<h5>Syntax:</h5>
<pre>
declare void @llvm.debugtrap()
declare void @llvm.debugtrap() nounwind
</pre>

<h5>Overview:</h5>
Expand Down
4 changes: 3 additions & 1 deletion include/llvm/Intrinsics.td
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ class NoCapture<int argNo> : IntrinsicProperty {
int ArgNo = argNo;
}

def IntrNoReturn : IntrinsicProperty;

//===----------------------------------------------------------------------===//
// Types used by intrinsics.
//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -400,7 +402,7 @@ def int_invariant_end : Intrinsic<[],
//
def int_flt_rounds : Intrinsic<[llvm_i32_ty]>,
GCCBuiltin<"__builtin_flt_rounds">;
def int_trap : Intrinsic<[]>,
def int_trap : Intrinsic<[], [], [IntrNoReturn]>,
GCCBuiltin<"__builtin_trap">;
def int_debugtrap : Intrinsic<[]>,
GCCBuiltin<"__builtin_debugtrap">;
Expand Down
10 changes: 10 additions & 0 deletions test/Feature/intrinsics.ll
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
; RUN: llvm-as < %s | llvm-dis > %t1.ll
; RUN: llvm-as %t1.ll -o - | llvm-dis > %t2.ll
; RUN: diff %t1.ll %t2.ll
; RUN: FileCheck %s < %t1.ll

declare i1 @llvm.isunordered.f32(float, float)

Expand Down Expand Up @@ -58,3 +59,12 @@ define void @libm() {
}

; FIXME: test ALL the intrinsics in this file.

; rdar://11542750
; CHECK: declare void @llvm.trap() noreturn nounwind
declare void @llvm.trap()

define void @trap() {
call void @llvm.trap()
ret void
}
5 changes: 4 additions & 1 deletion utils/TableGen/CodeGenIntrinsics.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,10 @@ namespace llvm {

/// canThrow - True if the intrinsic can throw.
bool canThrow;


/// isNoReturn - True if the intrinsic is no-return.
bool isNoReturn;

enum ArgAttribute {
NoCapture
};
Expand Down
3 changes: 3 additions & 0 deletions utils/TableGen/CodeGenTarget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,7 @@ CodeGenIntrinsic::CodeGenIntrinsic(Record *R) {
isOverloaded = false;
isCommutative = false;
canThrow = false;
isNoReturn = false;

if (DefName.size() <= 4 ||
std::string(DefName.begin(), DefName.begin() + 4) != "int_")
Expand Down Expand Up @@ -511,6 +512,8 @@ CodeGenIntrinsic::CodeGenIntrinsic(Record *R) {
isCommutative = true;
else if (Property->getName() == "Throws")
canThrow = true;
else if (Property->getName() == "IntrNoReturn")
isNoReturn = true;
else if (Property->isSubClassOf("NoCapture")) {
unsigned ArgNo = Property->getValueAsInt("ArgNo");
ArgumentAttributes.push_back(std::make_pair(ArgNo, NoCapture));
Expand Down
25 changes: 21 additions & 4 deletions utils/TableGen/IntrinsicEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -451,6 +451,9 @@ namespace {
if (L->canThrow != R->canThrow)
return R->canThrow;

if (L->isNoReturn != R->isNoReturn)
return R->isNoReturn;

// Try to order by readonly/readnone attribute.
ModRefKind LK = getModRefKind(*L);
ModRefKind RK = getModRefKind(*R);
Expand Down Expand Up @@ -549,16 +552,30 @@ EmitAttributes(const std::vector<CodeGenIntrinsic> &Ints, raw_ostream &OS) {

ModRefKind modRef = getModRefKind(intrinsic);

if (!intrinsic.canThrow || modRef) {
if (!intrinsic.canThrow || modRef || intrinsic.isNoReturn) {
OS << " AWI[" << numAttrs++ << "] = AttributeWithIndex::get(~0, ";
bool Emitted = false;
if (!intrinsic.canThrow) {
OS << "Attribute::NoUnwind";
if (modRef) OS << '|';
Emitted = true;
}

if (intrinsic.isNoReturn) {
if (Emitted) OS << '|';
OS << "Attribute::NoReturn";
Emitted = true;
}

switch (modRef) {
case MRK_none: break;
case MRK_readonly: OS << "Attribute::ReadOnly"; break;
case MRK_readnone: OS << "Attribute::ReadNone"; break;
case MRK_readonly:
if (Emitted) OS << '|';
OS << "Attribute::ReadOnly";
break;
case MRK_readnone:
if (Emitted) OS << '|';
OS << "Attribute::ReadNone";
break;
}
OS << ");\n";
}
Expand Down

0 comments on commit 8620890

Please sign in to comment.