Merge "Remove disable card marks, fix SetPatchLocation." into dalvik-dev
diff --git a/build/Android.common.mk b/build/Android.common.mk
index 0d31237..193afbf 100644
--- a/build/Android.common.mk
+++ b/build/Android.common.mk
@@ -78,11 +78,20 @@
-DDYNAMIC_ANNOTATIONS_ENABLED=1 \
-UNDEBUG
-ART_HOST_CFLAGS := $(art_cflags) -DANDROID_SMP=1
+# start of image reserved address space
+IMG_HOST_BASE_ADDRESS := 0x60000000
+
+ifeq ($(TARGET_ARCH),mips)
+IMG_TARGET_BASE_ADDRESS := 0x30000000
+else
+IMG_TARGET_BASE_ADDRESS := 0x60000000
+endif
+
+ART_HOST_CFLAGS := $(art_cflags) -DANDROID_SMP=1 -DART_BASE_ADDRESS=$(IMG_HOST_BASE_ADDRESS)
# The host GCC isn't necessarily new enough to support -Wthread-safety (GCC 4.4).
ART_HOST_CFLAGS := $(filter-out -Wthread-safety,$(ART_HOST_CFLAGS))
-ART_TARGET_CFLAGS := $(art_cflags) -DART_TARGET
+ART_TARGET_CFLAGS := $(art_cflags) -DART_TARGET -DART_BASE_ADDRESS=$(IMG_TARGET_BASE_ADDRESS)
ifeq ($(TARGET_CPU_SMP),true)
ART_TARGET_CFLAGS += -DANDROID_SMP=1
else
diff --git a/build/Android.oat.mk b/build/Android.oat.mk
index cdb7349..7868204 100644
--- a/build/Android.oat.mk
+++ b/build/Android.oat.mk
@@ -27,10 +27,6 @@
# TODO: for now, override with debug version for better error reporting
OATDUMP := $(OATDUMPD)
-# start of image reserved address space
-IMG_HOST_BASE_ADDRESS := 0x60000000
-IMG_TARGET_BASE_ADDRESS := 0x60000000
-
PRELOADED_CLASSES := frameworks/base/preloaded-classes
########################################################################
diff --git a/src/compiler/Frontend.cc b/src/compiler/Frontend.cc
index c5d5c21..ffeae46 100644
--- a/src/compiler/Frontend.cc
+++ b/src/compiler/Frontend.cc
@@ -858,14 +858,15 @@
(1 << kLoadStoreElimination) |
(1 << kLoadHoisting) |
(1 << kSuppressLoads) |
- (1 << kNullCheckElimination) |
- (1 << kPromoteRegs) |
+ //(1 << kNullCheckElimination) |
+ //(1 << kPromoteRegs) |
(1 << kTrackLiveTemps) |
- (1 << kSkipLargeMethodOptimization) |
- (1 << kSafeOptimizations) |
+ //(1 << kSkipLargeMethodOptimization) |
+ //(1 << kSafeOptimizations) |
(1 << kBBOpt) |
(1 << kMatch) |
- (1 << kPromoteCompilerTemps));
+ //(1 << kPromoteCompilerTemps) |
+ 0);
}
#endif
diff --git a/src/dex2oat.cc b/src/dex2oat.cc
index a8f42af..bbc07a6 100644
--- a/src/dex2oat.cc
+++ b/src/dex2oat.cc
@@ -269,7 +269,6 @@
}
if (!OatWriter::Create(oat_file,
- class_loader,
dex_files,
image_file_location_oat_checksum,
image_file_location_oat_begin,
diff --git a/src/gc/atomic_stack.h b/src/gc/atomic_stack.h
index 3494861..d67d2f2 100644
--- a/src/gc/atomic_stack.h
+++ b/src/gc/atomic_stack.h
@@ -136,11 +136,7 @@
// Size in number of elements.
void Init() {
mem_map_.reset(MemMap::MapAnonymous(name_.c_str(), NULL, capacity_ * sizeof(T), PROT_READ | PROT_WRITE));
- if (mem_map_.get() == NULL) {
- std::string maps;
- ReadFileToString("/proc/self/maps", &maps);
- LOG(FATAL) << "couldn't allocate mark stack\n" << maps;
- }
+ CHECK(mem_map_.get() != NULL) << "couldn't allocate mark stack";
byte* addr = mem_map_->Begin();
CHECK(addr != NULL);
begin_ = reinterpret_cast<T*>(addr);
diff --git a/src/gc/card_table.cc b/src/gc/card_table.cc
index 5a1e9b5..a5531d8 100644
--- a/src/gc/card_table.cc
+++ b/src/gc/card_table.cc
@@ -54,11 +54,7 @@
/* Allocate an extra 256 bytes to allow fixed low-byte of base */
UniquePtr<MemMap> mem_map(MemMap::MapAnonymous("dalvik-card-table", NULL,
capacity + 256, PROT_READ | PROT_WRITE));
- if (mem_map.get() == NULL) {
- std::string maps;
- ReadFileToString("/proc/self/maps", &maps);
- LOG(FATAL) << "couldn't allocate card table\n" << maps;
- }
+ CHECK(mem_map.get() != NULL) << "couldn't allocate card table";
// All zeros is the correct initial value; all clean. Anonymous mmaps are initialized to zero, we
// don't clear the card table to avoid unnecessary pages being allocated
COMPILE_ASSERT(kCardClean == 0, card_clean_must_be_0);
diff --git a/src/heap.cc b/src/heap.cc
index bfc5256..cf13eae 100644
--- a/src/heap.cc
+++ b/src/heap.cc
@@ -87,7 +87,8 @@
const char* oat_file_option = oat_file_option_string.c_str();
arg_vector.push_back(strdup(oat_file_option));
- arg_vector.push_back(strdup("--base=0x60000000"));
+ std::string base_option_string(StringPrintf("--base=0x%x", ART_BASE_ADDRESS));
+ arg_vector.push_back(strdup(base_option_string.c_str()));
std::string command_line(Join(arg_vector, ' '));
LOG(INFO) << command_line;
@@ -232,8 +233,8 @@
growth_limit, capacity,
requested_begin));
alloc_space_ = alloc_space.release();
- alloc_space_->SetFootprintLimit(alloc_space_->Capacity());
CHECK(alloc_space_ != NULL) << "Failed to create alloc space";
+ alloc_space_->SetFootprintLimit(alloc_space_->Capacity());
AddSpace(alloc_space_);
// Spaces are sorted in order of Begin().
diff --git a/src/image_test.cc b/src/image_test.cc
index e2abbac..feb490c 100644
--- a/src/image_test.cc
+++ b/src/image_test.cc
@@ -36,7 +36,7 @@
ScopedObjectAccess soa(Thread::Current());
std::vector<const DexFile*> dex_files;
dex_files.push_back(java_lang_dex_file_);
- bool success_oat = OatWriter::Create(tmp_oat.GetFile(), NULL, dex_files, 0, 0, "", *compiler_.get());
+ bool success_oat = OatWriter::Create(tmp_oat.GetFile(), dex_files, 0, 0, "", *compiler_.get());
ASSERT_TRUE(success_oat);
// Force all system classes into memory
@@ -48,13 +48,15 @@
}
}
- ImageWriter writer(NULL);
ScratchFile tmp_image;
- const uintptr_t requested_image_base = 0x60000000;
- bool success_image = writer.Write(tmp_image.GetFilename(), requested_image_base,
- tmp_oat.GetFilename(), tmp_oat.GetFilename(),
- *compiler_.get());
- ASSERT_TRUE(success_image);
+ const uintptr_t requested_image_base = ART_BASE_ADDRESS;
+ {
+ ImageWriter writer(NULL);
+ bool success_image = writer.Write(tmp_image.GetFilename(), requested_image_base,
+ tmp_oat.GetFilename(), tmp_oat.GetFilename(),
+ *compiler_.get());
+ ASSERT_TRUE(success_image);
+ }
{
UniquePtr<File> file(OS::OpenFile(tmp_image.GetFilename().c_str(), false));
diff --git a/src/mem_map.cc b/src/mem_map.cc
index 653eb3f..f322773 100644
--- a/src/mem_map.cc
+++ b/src/mem_map.cc
@@ -87,8 +87,11 @@
byte* actual = reinterpret_cast<byte*>(mmap(addr, page_aligned_byte_count, prot, flags, fd.get(), 0));
if (actual == MAP_FAILED) {
+ std::string maps;
+ ReadFileToString("/proc/self/maps", &maps);
PLOG(ERROR) << "mmap(" << reinterpret_cast<void*>(addr) << ", " << page_aligned_byte_count
- << ", " << prot << ", " << flags << ", " << fd.get() << ", 0) failed for " << name;
+ << ", " << prot << ", " << flags << ", " << fd.get() << ", 0) failed for " << name
+ << "\n" << maps;
return NULL;
}
return new MemMap(name, actual, byte_count, actual, page_aligned_byte_count, prot);
@@ -110,7 +113,11 @@
fd,
page_aligned_offset));
if (actual == MAP_FAILED) {
- PLOG(ERROR) << "mmap failed";
+ std::string maps;
+ ReadFileToString("/proc/self/maps", &maps);
+ PLOG(ERROR) << "mmap(" << reinterpret_cast<void*>(addr) << ", " << page_aligned_byte_count
+ << ", " << prot << ", " << flags << ", " << fd << ", " << page_aligned_offset
+ << ") failed\n" << maps;
return NULL;
}
return new MemMap("file", actual + page_offset, byte_count, actual, page_aligned_byte_count,
diff --git a/src/oat/runtime/mips/runtime_support_mips.S b/src/oat/runtime/mips/runtime_support_mips.S
index 349e802..bc0aecf 100644
--- a/src/oat/runtime/mips/runtime_support_mips.S
+++ b/src/oat/runtime/mips/runtime_support_mips.S
@@ -22,7 +22,7 @@
/* Deliver the given exception */
.extern artDeliverExceptionFromCode
/* Deliver an exception pending on a thread */
- .extern artDeliverPendingException
+ .extern artDeliverPendingExceptionFromCode
/* Cache alignment for function entry */
.macro ALIGN_FUNCTION_ENTRY
@@ -115,16 +115,17 @@
* exception is Thread::Current()->exception_
*/
.macro DELIVER_PENDING_EXCEPTION
- SETUP_SAVE_ALL_CALLEE_SAVE_FRAME # save callee saves for throw
- move $a0, rSELF # pass Thread::Current
- jal artDeliverPendingExceptionFromCode # artDeliverPendingExceptionFromCode(Thread*, $sp)
- move $a1, $sp # pass $sp
+ SETUP_SAVE_ALL_CALLEE_SAVE_FRAME # save callee saves for throw
+ move $a0, rSELF # pass Thread::Current
+ la $t9, artDeliverPendingExceptionFromCode
+ jr $t9 # artDeliverPendingExceptionFromCode(Thread*, $sp)
+ move $a1, $sp # pass $sp
.endm
.macro RETURN_IF_NO_EXCEPTION
lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
- bnez $t0, 1f # success if no exception is pending
+ bnez $t0, 1f # success if no exception is pending
nop
jr $ra
nop
@@ -254,9 +255,10 @@
art_deliver_exception_from_code:
.cpload $25
SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
- move $a1, rSELF # pass Thread::Current
- jal artDeliverExceptionFromCode # artDeliverExceptionFromCode(Throwable*, Thread*, $sp)
- move $a2, $sp # pass $sp
+ move $a1, rSELF # pass Thread::Current
+ la $t9, artDeliverExceptionFromCode
+ jr $t9 # artDeliverExceptionFromCode(Throwable*, Thread*, $sp)
+ move $a2, $sp # pass $sp
.global art_throw_null_pointer_exception_from_code
.extern artThrowNullPointerExceptionFromCode
@@ -267,9 +269,10 @@
art_throw_null_pointer_exception_from_code:
.cpload $25
SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
- move $a0, rSELF # pass Thread::Current
- jal artThrowNullPointerExceptionFromCode # artThrowNullPointerExceptionFromCode(Thread*, $sp)
- move $a1, $sp # pass $sp
+ move $a0, rSELF # pass Thread::Current
+ la $t9, artThrowNullPointerExceptionFromCode
+ jr $t9 # artThrowNullPointerExceptionFromCode(Thread*, $sp)
+ move $a1, $sp # pass $sp
.global art_throw_div_zero_from_code
.extern artThrowDivZeroFromCode
@@ -281,7 +284,8 @@
.cpload $25
SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
move $a0, rSELF # pass Thread::Current
- jal artThrowDivZeroFromCode # artThrowDivZeroFromCode(Thread*, $sp)
+ la $t9, artThrowDivZeroFromCode
+ jr $t9 # artThrowDivZeroFromCode(Thread*, $sp)
move $a1, $sp # pass $sp
.global art_throw_array_bounds_from_code
@@ -293,9 +297,10 @@
art_throw_array_bounds_from_code:
.cpload $25
SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
- move $a2, rSELF # pass Thread::Current
- jal artThrowArrayBoundsFromCode # artThrowArrayBoundsFromCode(index, limit, Thread*, $sp)
- move $a3, $sp # pass $sp
+ move $a2, rSELF # pass Thread::Current
+ la $t9, artThrowArrayBoundsFromCode
+ jr $t9 # artThrowArrayBoundsFromCode(index, limit, Thread*, $sp)
+ move $a3, $sp # pass $sp
.global art_throw_stack_overflow_from_code
.extern artThrowStackOverflowFromCode
@@ -306,9 +311,10 @@
art_throw_stack_overflow_from_code:
.cpload $25
SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
- move $a0, rSELF # pass Thread::Current
- jal artThrowStackOverflowFromCode # artThrowStackOverflowFromCode(Thread*, $sp)
- move $a1, $sp # pass $sp
+ move $a0, rSELF # pass Thread::Current
+ la $t9, artThrowStackOverflowFromCode
+ jr $t9 # artThrowStackOverflowFromCode(Thread*, $sp)
+ move $a1, $sp # pass $sp
.global art_throw_no_such_method_from_code
.extern artThrowNoSuchMethodFromCode
@@ -319,9 +325,10 @@
art_throw_no_such_method_from_code:
.cpload $25
SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
- move $a1, rSELF # pass Thread::Current
- jal artThrowNoSuchMethodFromCode # artThrowNoSuchMethodFromCode(method_idx, Thread*, $sp)
- move $a2, $sp # pass $sp
+ move $a1, rSELF # pass Thread::Current
+ la $t9, artThrowNoSuchMethodFromCode
+ jr $t9 # artThrowNoSuchMethodFromCode(method_idx, Thread*, $sp)
+ move $a2, $sp # pass $sp
/*
* All generated callsites for interface invokes and invocation slow paths will load arguments
@@ -349,8 +356,10 @@
move $t0, $sp # save $sp
addiu $sp, $sp, -16 # make space for extra args
move $a3, rSELF # pass Thread::Current
+ sw $gp, 12($sp) # save $gp
jal \cxx_name # (method_idx, this, caller, Thread*, $sp)
sw $t0, 16($sp) # pass $sp
+ lw $gp, 12($sp) # restore $gp
addiu $sp, $sp, 16 # release out args
move $a0, $v0 # save target Method*
move $t9, $v1 # save $v0->code_
@@ -866,12 +875,12 @@
move $a2, $ra # pass $ra
jal artTraceMethodEntryFromCode # (Method*, Thread*, LR)
move $a1, rSELF # pass Thread::Current
- move $t0, $v0 # $t0 holds reference to code
+ move $t9, $v0 # $t9 holds reference to code
lw $a0, 0($sp)
lw $a1, 4($sp)
lw $a2, 8($sp)
lw $a3, 12($sp)
- jalr $t0 # call method
+ jalr $t9 # call method
addiu $sp, $sp, 16
/* intentional fallthrough */
diff --git a/src/oat_test.cc b/src/oat_test.cc
index bb6305a..52217b2 100644
--- a/src/oat_test.cc
+++ b/src/oat_test.cc
@@ -80,7 +80,6 @@
ScopedObjectAccess soa(Thread::Current());
ScratchFile tmp;
bool success = OatWriter::Create(tmp.GetFile(),
- class_loader,
class_linker->GetBootClassPath(),
42U,
4096U,
diff --git a/src/oat_writer.cc b/src/oat_writer.cc
index e26e3cc..382139e 100644
--- a/src/oat_writer.cc
+++ b/src/oat_writer.cc
@@ -31,7 +31,6 @@
namespace art {
bool OatWriter::Create(File* file,
- jobject class_loader,
const std::vector<const DexFile*>& dex_files,
uint32_t image_file_location_oat_checksum,
uint32_t image_file_location_oat_begin,
@@ -41,7 +40,6 @@
image_file_location_oat_checksum,
image_file_location_oat_begin,
image_file_location,
- class_loader,
compiler);
return oat_writer.Write(file);
}
@@ -50,10 +48,8 @@
uint32_t image_file_location_oat_checksum,
uint32_t image_file_location_oat_begin,
const std::string& image_file_location,
- jobject class_loader,
const Compiler& compiler) {
compiler_ = &compiler;
- class_loader_ = class_loader;
image_file_location_oat_checksum_ = image_file_location_oat_checksum;
image_file_location_oat_begin_ = image_file_location_oat_begin;
image_file_location_ = image_file_location;
@@ -403,7 +399,7 @@
// Unchecked as we hold mutator_lock_ on entry.
ScopedObjectAccessUnchecked soa(Thread::Current());
AbstractMethod* method = linker->ResolveMethod(*dex_file, method_idx, dex_cache,
- soa.Decode<ClassLoader*>(class_loader_), NULL, type);
+ NULL, NULL, type);
CHECK(method != NULL);
method->SetFrameSizeInBytes(frame_size_in_bytes);
method->SetCoreSpillMask(core_spill_mask);
diff --git a/src/oat_writer.h b/src/oat_writer.h
index 09db96b..c5114fc 100644
--- a/src/oat_writer.h
+++ b/src/oat_writer.h
@@ -64,7 +64,6 @@
public:
// Write an oat file. Returns true on success, false on failure.
static bool Create(File* file,
- jobject class_loader,
const std::vector<const DexFile*>& dex_files,
uint32_t image_file_location_oat_checksum,
uint32_t image_file_location_oat_begin,
@@ -77,7 +76,6 @@
uint32_t image_file_location_oat_checksum,
uint32_t image_file_location_oat_begin,
const std::string& image_file_location,
- jobject class_loader,
const Compiler& compiler) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
~OatWriter();
@@ -152,9 +150,6 @@
const Compiler* compiler_;
- // TODO: remove the ClassLoader when the code storage moves out of Method
- jobject class_loader_;
-
// note OatFile does not take ownership of the DexFiles
const std::vector<const DexFile*>* dex_files_;