mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 21:32:10 +00:00
rdar://11542750 - llvm.trap should be marked no return.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157551 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8e33712013
commit
86208903cb
@ -8386,7 +8386,7 @@ LLVM</a>.</p>
|
||||
|
||||
<h5>Syntax:</h5>
|
||||
<pre>
|
||||
declare void @llvm.trap()
|
||||
declare void @llvm.trap() noreturn nounwind
|
||||
</pre>
|
||||
|
||||
<h5>Overview:</h5>
|
||||
@ -8411,7 +8411,7 @@ LLVM</a>.</p>
|
||||
|
||||
<h5>Syntax:</h5>
|
||||
<pre>
|
||||
declare void @llvm.debugtrap()
|
||||
declare void @llvm.debugtrap() nounwind
|
||||
</pre>
|
||||
|
||||
<h5>Overview:</h5>
|
||||
|
@ -55,6 +55,8 @@ class NoCapture<int argNo> : IntrinsicProperty {
|
||||
int ArgNo = argNo;
|
||||
}
|
||||
|
||||
def IntrNoReturn : IntrinsicProperty;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Types used by intrinsics.
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -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">;
|
||||
|
@ -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)
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
};
|
||||
|
@ -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_")
|
||||
@ -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));
|
||||
|
@ -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);
|
||||
@ -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";
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user