diff options
-rw-r--r-- | compiler/elf_writer_quick.cc | 5 | ||||
-rw-r--r-- | disassembler/Android.mk | 2 | ||||
-rw-r--r-- | disassembler/disassembler_mips64.cc | 11 | ||||
-rw-r--r-- | runtime/arch/mips64/instruction_set_features_mips64.cc | 1 | ||||
-rw-r--r-- | runtime/arch/x86/instruction_set_features_x86.cc | 1 | ||||
-rw-r--r-- | runtime/debugger.cc | 49 | ||||
-rw-r--r-- | runtime/debugger.h | 6 | ||||
-rw-r--r-- | runtime/jdwp/jdwp_handler.cc | 16 | ||||
-rw-r--r-- | tools/dexfuzz/Android.mk | 5 | ||||
-rw-r--r-- | tools/dexfuzz/src/dexfuzz/executors/Device.java | 14 |
10 files changed, 72 insertions, 38 deletions
diff --git a/compiler/elf_writer_quick.cc b/compiler/elf_writer_quick.cc index 3ce19ab0df..24cb364d08 100644 --- a/compiler/elf_writer_quick.cc +++ b/compiler/elf_writer_quick.cc @@ -490,14 +490,11 @@ static void FillInCFIInformation(OatWriter* oat_writer, int code_factor_bits_ = 0; int isa = -1; switch (oat_writer->GetOatHeader().GetInstructionSet()) { + case kArm: // arm actually means thumb2. case kThumb2: code_factor_bits_ = 1; // 16-bit instuctions isa = 1; // DW_ISA_ARM_thumb. break; - case kArm: - code_factor_bits_ = 1; // 16-bit instructions - isa = 2; // DW_ISA_ARM_arm. - break; case kArm64: case kMips: case kMips64: diff --git a/disassembler/Android.mk b/disassembler/Android.mk index c9aa8c8f11..1cfd45acdc 100644 --- a/disassembler/Android.mk +++ b/disassembler/Android.mk @@ -81,6 +81,8 @@ define build-libart-disassembler endif LOCAL_C_INCLUDES += $(ART_C_INCLUDES) art/runtime + LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH) + LOCAL_MULTILIB := both LOCAL_ADDITIONAL_DEPENDENCIES := art/build/Android.common_build.mk LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.mk diff --git a/disassembler/disassembler_mips64.cc b/disassembler/disassembler_mips64.cc index 1b6e6bec5e..f1c7d8e0df 100644 --- a/disassembler/disassembler_mips64.cc +++ b/disassembler/disassembler_mips64.cc @@ -185,7 +185,7 @@ static uint32_t ReadU32(const uint8_t* ptr) { return ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24); } -static void DumpMips64(std::ostream& os, const uint8_t* instr_ptr) { +size_t DisassemblerMips64::Dump(std::ostream& os, const uint8_t* instr_ptr) { uint32_t instruction = ReadU32(instr_ptr); uint32_t rs = (instruction >> 21) & 0x1f; // I-type, R-type. @@ -272,19 +272,16 @@ static void DumpMips64(std::ostream& os, const uint8_t* instr_ptr) { } } - os << StringPrintf("%p: %08x\t%-7s ", instr_ptr, instruction, opcode.c_str()) + os << FormatInstructionPointer(instr_ptr) + << StringPrintf(": %08x\t%-7s ", instruction, opcode.c_str()) << args.str() << '\n'; -} - -size_t DisassemblerMips64::Dump(std::ostream& os, const uint8_t* begin) { - DumpMips64(os, begin); return 4; } void DisassemblerMips64::Dump(std::ostream& os, const uint8_t* begin, const uint8_t* end) { for (const uint8_t* cur = begin; cur < end; cur += 4) { - DumpMips64(os, cur); + Dump(os, cur); } } diff --git a/runtime/arch/mips64/instruction_set_features_mips64.cc b/runtime/arch/mips64/instruction_set_features_mips64.cc index 8c48a084bf..5c0c91422b 100644 --- a/runtime/arch/mips64/instruction_set_features_mips64.cc +++ b/runtime/arch/mips64/instruction_set_features_mips64.cc @@ -27,7 +27,6 @@ namespace art { const Mips64InstructionSetFeatures* Mips64InstructionSetFeatures::FromVariant( const std::string& variant, std::string* error_msg ATTRIBUTE_UNUSED) { if (variant != "default" && variant != "mips64r6") { - std::ostringstream os; LOG(WARNING) << "Unexpected CPU variant for Mips64 using defaults: " << variant; } bool smp = true; // Conservative default. diff --git a/runtime/arch/x86/instruction_set_features_x86.cc b/runtime/arch/x86/instruction_set_features_x86.cc index 8227633c97..ef399992b6 100644 --- a/runtime/arch/x86/instruction_set_features_x86.cc +++ b/runtime/arch/x86/instruction_set_features_x86.cc @@ -63,7 +63,6 @@ const X86InstructionSetFeatures* X86InstructionSetFeatures::FromVariant( bool known_variant = FindVariantInArray(x86_known_variants, arraysize(x86_known_variants), variant); if (!known_variant && variant != "default") { - std::ostringstream os; LOG(WARNING) << "Unexpected CPU variant for X86 using defaults: " << variant; } diff --git a/runtime/debugger.cc b/runtime/debugger.cc index 3f67f9e72d..6759c4d9c3 100644 --- a/runtime/debugger.cc +++ b/runtime/debugger.cc @@ -1283,18 +1283,37 @@ JDWP::JdwpError Dbg::SetArrayElements(JDWP::ObjectId array_id, int offset, int c return JDWP::ERR_NONE; } -JDWP::ObjectId Dbg::CreateString(const std::string& str) { - return gRegistry->Add(mirror::String::AllocFromModifiedUtf8(Thread::Current(), str.c_str())); +JDWP::JdwpError Dbg::CreateString(const std::string& str, JDWP::ObjectId* new_string_id) { + Thread* self = Thread::Current(); + mirror::String* new_string = mirror::String::AllocFromModifiedUtf8(self, str.c_str()); + if (new_string == nullptr) { + DCHECK(self->IsExceptionPending()); + self->ClearException(); + LOG(ERROR) << "Could not allocate string"; + *new_string_id = 0; + return JDWP::ERR_OUT_OF_MEMORY; + } + *new_string_id = gRegistry->Add(new_string); + return JDWP::ERR_NONE; } -JDWP::JdwpError Dbg::CreateObject(JDWP::RefTypeId class_id, JDWP::ObjectId* new_object) { +JDWP::JdwpError Dbg::CreateObject(JDWP::RefTypeId class_id, JDWP::ObjectId* new_object_id) { JDWP::JdwpError error; mirror::Class* c = DecodeClass(class_id, &error); if (c == nullptr) { - *new_object = 0; + *new_object_id = 0; return error; } - *new_object = gRegistry->Add(c->AllocObject(Thread::Current())); + Thread* self = Thread::Current(); + mirror::Object* new_object = c->AllocObject(self); + if (new_object == nullptr) { + DCHECK(self->IsExceptionPending()); + self->ClearException(); + LOG(ERROR) << "Could not allocate object of type " << PrettyDescriptor(c); + *new_object_id = 0; + return JDWP::ERR_OUT_OF_MEMORY; + } + *new_object_id = gRegistry->Add(new_object); return JDWP::ERR_NONE; } @@ -1302,16 +1321,26 @@ JDWP::JdwpError Dbg::CreateObject(JDWP::RefTypeId class_id, JDWP::ObjectId* new_ * Used by Eclipse's "Display" view to evaluate "new byte[5]" to get "(byte[]) [0, 0, 0, 0, 0]". */ JDWP::JdwpError Dbg::CreateArrayObject(JDWP::RefTypeId array_class_id, uint32_t length, - JDWP::ObjectId* new_array) { + JDWP::ObjectId* new_array_id) { JDWP::JdwpError error; mirror::Class* c = DecodeClass(array_class_id, &error); if (c == nullptr) { - *new_array = 0; + *new_array_id = 0; return error; } - *new_array = gRegistry->Add(mirror::Array::Alloc<true>(Thread::Current(), c, length, - c->GetComponentSizeShift(), - Runtime::Current()->GetHeap()->GetCurrentAllocator())); + Thread* self = Thread::Current(); + gc::Heap* heap = Runtime::Current()->GetHeap(); + mirror::Array* new_array = mirror::Array::Alloc<true>(self, c, length, + c->GetComponentSizeShift(), + heap->GetCurrentAllocator()); + if (new_array == nullptr) { + DCHECK(self->IsExceptionPending()); + self->ClearException(); + LOG(ERROR) << "Could not allocate array of type " << PrettyDescriptor(c); + *new_array_id = 0; + return JDWP::ERR_OUT_OF_MEMORY; + } + *new_array_id = gRegistry->Add(new_array); return JDWP::ERR_NONE; } diff --git a/runtime/debugger.h b/runtime/debugger.h index 62eda62318..5898784c43 100644 --- a/runtime/debugger.h +++ b/runtime/debugger.h @@ -313,12 +313,12 @@ class Dbg { JDWP::Request* request) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - static JDWP::ObjectId CreateString(const std::string& str) + static JDWP::JdwpError CreateString(const std::string& str, JDWP::ObjectId* new_string_id) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - static JDWP::JdwpError CreateObject(JDWP::RefTypeId class_id, JDWP::ObjectId* new_object) + static JDWP::JdwpError CreateObject(JDWP::RefTypeId class_id, JDWP::ObjectId* new_object_id) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); static JDWP::JdwpError CreateArrayObject(JDWP::RefTypeId array_class_id, uint32_t length, - JDWP::ObjectId* new_array) + JDWP::ObjectId* new_array_id) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); // diff --git a/runtime/jdwp/jdwp_handler.cc b/runtime/jdwp/jdwp_handler.cc index add1394f2d..0d161bc100 100644 --- a/runtime/jdwp/jdwp_handler.cc +++ b/runtime/jdwp/jdwp_handler.cc @@ -315,11 +315,12 @@ static JdwpError VM_Exit(JdwpState* state, Request* request, ExpandBuf*) static JdwpError VM_CreateString(JdwpState*, Request* request, ExpandBuf* pReply) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { std::string str(request->ReadUtf8String()); - ObjectId stringId = Dbg::CreateString(str); - if (stringId == 0) { - return ERR_OUT_OF_MEMORY; + ObjectId string_id; + JdwpError status = Dbg::CreateString(str, &string_id); + if (status != ERR_NONE) { + return status; } - expandBufAddObjectId(pReply, stringId); + expandBufAddObjectId(pReply, string_id); return ERR_NONE; } @@ -711,9 +712,6 @@ static JdwpError CT_NewInstance(JdwpState* state, Request* request, ExpandBuf* p if (status != ERR_NONE) { return status; } - if (object_id == 0) { - return ERR_OUT_OF_MEMORY; - } return RequestInvoke(state, request, pReply, thread_id, object_id, class_id, method_id, true); } @@ -730,9 +728,6 @@ static JdwpError AT_newInstance(JdwpState*, Request* request, ExpandBuf* pReply) if (status != ERR_NONE) { return status; } - if (object_id == 0) { - return ERR_OUT_OF_MEMORY; - } expandBufAdd1(pReply, JT_ARRAY); expandBufAddObjectId(pReply, object_id); return ERR_NONE; @@ -1657,6 +1652,7 @@ size_t JdwpState::ProcessRequest(Request* request, ExpandBuf* pReply) { if (result == ERR_NONE) { request->CheckConsumed(); } + self->AssertNoPendingException(); break; } } diff --git a/tools/dexfuzz/Android.mk b/tools/dexfuzz/Android.mk index 1e4b4f53ce..1580bc37fb 100644 --- a/tools/dexfuzz/Android.mk +++ b/tools/dexfuzz/Android.mk @@ -31,7 +31,10 @@ LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := EXECUTABLES LOCAL_MODULE := dexfuzz include $(BUILD_SYSTEM)/base_rules.mk -$(LOCAL_BUILT_MODULE): $(LOCAL_PATH)/dexfuzz $(ACP) $(HOST_CORE_IMG_OUTS) +$(LOCAL_BUILT_MODULE): $(LOCAL_PATH)/dexfuzz $(ACP) @echo "Copy: $(PRIVATE_MODULE) ($@)" $(copy-file-to-new-target) $(hide) chmod 755 $@ + +# --- dexfuzz script with core image dependencies ---------------- +fuzzer: $(LOCAL_BUILT_MODULE) $(HOST_CORE_IMG_OUTS) diff --git a/tools/dexfuzz/src/dexfuzz/executors/Device.java b/tools/dexfuzz/src/dexfuzz/executors/Device.java index 736aaad596..4a53957782 100644 --- a/tools/dexfuzz/src/dexfuzz/executors/Device.java +++ b/tools/dexfuzz/src/dexfuzz/executors/Device.java @@ -17,6 +17,7 @@ package dexfuzz.executors; import java.io.IOException; +import java.io.File; import java.util.Map; import dexfuzz.ExecutionResult; @@ -67,6 +68,10 @@ public class Device { return envVars.get(key); } + private String getHostCoreImagePath() { + return androidHostOut + "/framework/core.art"; + } + private void setup() { programPushed = false; @@ -74,6 +79,13 @@ public class Device { androidProductOut = checkForEnvVar(envVars, "ANDROID_PRODUCT_OUT"); androidHostOut = checkForEnvVar(envVars, "ANDROID_HOST_OUT"); + if (Options.executeOnHost) { + File coreImage = new File(getHostCoreImagePath()); + if (!coreImage.exists()) { + Log.errorAndQuit("Host core image not found at " + coreImage.getPath() + + ". Did you forget to build it?"); + } + } if (!isHost) { // Create temporary consumers for the initial test. StreamConsumer outputConsumer = new StreamConsumer(); @@ -144,7 +156,7 @@ public class Device { * Get any extra flags required to execute ART on the host. */ public String getHostExecutionFlags() { - return String.format("-Xnorelocate -Ximage:%s/framework/core.art", androidHostOut); + return String.format("-Xnorelocate -Ximage:%s", getHostCoreImagePath()); } public String getAndroidHostOut() { |