From cf6c3d96fb1a7230cbdd8ebc77af30ba35b9e35a Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Wed, 6 Feb 2013 15:37:34 -0800 Subject: [PATCH] librustc: Attempt to put out burning tree by fixing translation of unary negation in boolean constants. rs=burningtree --- src/librustc/lib/llvm.rs | 33 +++++++++++++++++------------ src/librustc/middle/trans/consts.rs | 13 +++++++++++- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/src/librustc/lib/llvm.rs b/src/librustc/lib/llvm.rs index 50f4fe43efd..2e3967021c1 100644 --- a/src/librustc/lib/llvm.rs +++ b/src/librustc/lib/llvm.rs @@ -445,14 +445,19 @@ pub unsafe fn LLVMConstStructInContext(C: ContextRef, Count: c_uint, Packed: Bool) -> ValueRef; - pub unsafe fn LLVMConstString(Str: *c_char, Length: c_uint, - DontNullTerminate: Bool) -> ValueRef; - pub unsafe fn LLVMConstArray(ElementTy: TypeRef, ConstantVals: *ValueRef, - Length: c_uint) -> ValueRef; + pub unsafe fn LLVMConstString(Str: *c_char, + Length: c_uint, + DontNullTerminate: Bool) + -> ValueRef; + pub unsafe fn LLVMConstArray(ElementTy: TypeRef, + ConstantVals: *ValueRef, + Length: c_uint) + -> ValueRef; pub unsafe fn LLVMConstStruct(ConstantVals: *ValueRef, - Count: c_uint, Packed: Bool) -> ValueRef; + Count: c_uint, + Packed: Bool) -> ValueRef; pub unsafe fn LLVMConstVector(ScalarConstantVals: *ValueRef, - Size: c_uint) -> ValueRef; + Size: c_uint) -> ValueRef; /* Constant expressions */ pub unsafe fn LLVMAlignOf(Ty: TypeRef) -> ValueRef; @@ -463,8 +468,8 @@ pub unsafe fn LLVMConstVector(ScalarConstantVals: *ValueRef, pub unsafe fn LLVMConstFNeg(ConstantVal: ValueRef) -> ValueRef; pub unsafe fn LLVMConstNot(ConstantVal: ValueRef) -> ValueRef; pub unsafe fn LLVMConstAdd(LHSConstant: ValueRef, - RHSConstant: ValueRef) - -> ValueRef; + RHSConstant: ValueRef) + -> ValueRef; pub unsafe fn LLVMConstNSWAdd(LHSConstant: ValueRef, RHSConstant: ValueRef) -> ValueRef; @@ -475,14 +480,14 @@ pub unsafe fn LLVMConstFAdd(LHSConstant: ValueRef, RHSConstant: ValueRef) -> ValueRef; pub unsafe fn LLVMConstSub(LHSConstant: ValueRef, - RHSConstant: ValueRef) - -> ValueRef; + RHSConstant: ValueRef) + -> ValueRef; pub unsafe fn LLVMConstNSWSub(LHSConstant: ValueRef, - RHSConstant: ValueRef) - -> ValueRef; + RHSConstant: ValueRef) + -> ValueRef; pub unsafe fn LLVMConstNUWSub(LHSConstant: ValueRef, - RHSConstant: ValueRef) - -> ValueRef; + RHSConstant: ValueRef) + -> ValueRef; pub unsafe fn LLVMConstFSub(LHSConstant: ValueRef, RHSConstant: ValueRef) -> ValueRef; diff --git a/src/librustc/middle/trans/consts.rs b/src/librustc/middle/trans/consts.rs index 12340101d9e..34f1f1f2314 100644 --- a/src/librustc/middle/trans/consts.rs +++ b/src/librustc/middle/trans/consts.rs @@ -204,7 +204,18 @@ pub fn const_expr(cx: @crate_ctxt, e: @ast::expr) -> ValueRef { ast::box(_) | ast::uniq(_) | ast::deref => const_deref(cx, te), - ast::not => llvm::LLVMConstNot(te), + ast::not => { + match ty::get(ty).sty { + ty::ty_bool => { + // Somewhat questionable, but I believe this is + // correct. + let te = llvm::LLVMConstTrunc(te, T_i1()); + let te = llvm::LLVMConstNot(te); + llvm::LLVMConstZExt(te, T_bool()) + } + _ => llvm::LLVMConstNot(te), + } + } ast::neg => { if is_float { llvm::LLVMConstFNeg(te) } else { llvm::LLVMConstNeg(te) } -- GitLab