Merge "Fix SEGV when allocation does not fail in stack trace building" into dalvik-dev
diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc
index bd1bd67..bc47a8d 100644
--- a/src/compiler_llvm/method_compiler.cc
+++ b/src/compiler_llvm/method_compiler.cc
@@ -1757,7 +1757,15 @@
void MethodCompiler::EmitInsn_FNeg(uint32_t dex_pc,
Instruction const* insn,
JType op_jty) {
- // UNIMPLEMENTED(WARNING);
+
+ Instruction::DecodedInstruction dec_insn(insn);
+
+ DCHECK(op_jty == kFloat || op_jty == kDouble) << op_jty;
+
+ llvm::Value* src_value = EmitLoadDalvikReg(dec_insn.vB_, op_jty, kAccurate);
+ llvm::Value* result_value = irb_.CreateFNeg(src_value);
+ EmitStoreDalvikReg(dec_insn.vA_, op_jty, kAccurate, result_value);
+
irb_.CreateBr(GetNextBasicBlock(dex_pc));
}
@@ -1766,7 +1774,17 @@
Instruction const* insn,
JType src_jty,
JType dest_jty) {
- // UNIMPLEMENTED(WARNING);
+
+ Instruction::DecodedInstruction dec_insn(insn);
+
+ DCHECK(src_jty == kInt || src_jty == kLong) << src_jty;
+ DCHECK(dest_jty == kFloat || dest_jty == kDouble) << dest_jty;
+
+ llvm::Value* src_value = EmitLoadDalvikReg(dec_insn.vB_, src_jty, kAccurate);
+ llvm::Type* dest_type = irb_.getJType(dest_jty, kAccurate);
+ llvm::Value* dest_value = irb_.CreateSIToFP(src_value, dest_type);
+ EmitStoreDalvikReg(dec_insn.vA_, dest_jty, kAccurate, dest_value);
+
irb_.CreateBr(GetNextBasicBlock(dex_pc));
}
@@ -1775,14 +1793,30 @@
Instruction const* insn,
JType src_jty,
JType dest_jty) {
- // UNIMPLEMENTED(WARNING);
+
+ Instruction::DecodedInstruction dec_insn(insn);
+
+ DCHECK(src_jty == kFloat || src_jty == kDouble) << src_jty;
+ DCHECK(dest_jty == kInt || dest_jty == kLong) << dest_jty;
+
+ llvm::Value* src_value = EmitLoadDalvikReg(dec_insn.vB_, src_jty, kAccurate);
+ llvm::Type* dest_type = irb_.getJType(dest_jty, kAccurate);
+ llvm::Value* dest_value = irb_.CreateFPToSI(src_value, dest_type);
+ EmitStoreDalvikReg(dec_insn.vA_, dest_jty, kAccurate, dest_value);
+
irb_.CreateBr(GetNextBasicBlock(dex_pc));
}
void MethodCompiler::EmitInsn_FExt(uint32_t dex_pc,
Instruction const* insn) {
- // UNIMPLEMENTED(WARNING);
+
+ Instruction::DecodedInstruction dec_insn(insn);
+
+ llvm::Value* src_value = EmitLoadDalvikReg(dec_insn.vB_, kFloat, kAccurate);
+ llvm::Value* result_value = irb_.CreateFPExt(src_value, irb_.getJDoubleTy());
+ EmitStoreDalvikReg(dec_insn.vA_, kDouble, kAccurate, result_value);
+
irb_.CreateBr(GetNextBasicBlock(dex_pc));
}
diff --git a/src/object.cc b/src/object.cc
index 97634d5..27b85b0 100644
--- a/src/object.cc
+++ b/src/object.cc
@@ -393,7 +393,8 @@
}
void Method::SetInferredRegCategoryMap(const InferredRegCategoryMap* map) {
- const InferredRegCategoryMap* existing_map = GetInferredRegCategoryMap();
+ const InferredRegCategoryMap* existing_map = GetFieldPtr<const InferredRegCategoryMap*>(
+ OFFSET_OF_OBJECT_MEMBER(Method, gc_map_), false);
DCHECK(existing_map == NULL) << PrettyMethod(this);
DCHECK(map != NULL) << PrettyMethod(this);
@@ -406,7 +407,7 @@
void Method::ResetInferredRegCategoryMap() {
delete GetInferredRegCategoryMap();
SetFieldPtr<const InferredRegCategoryMap*>(
- OFFSET_OF_OBJECT_MEMBER(Method, gc_map_), NULL, false);
+ OFFSET_OF_OBJECT_MEMBER(Method, gc_map_), NULL, false);
}
#endif