From 47c9e23d81ad472dd91a7abf541155521bd9ebe6 Mon Sep 17 00:00:00 2001
From: Jesper Wilhelmsson
Date: Wed, 30 Apr 2014 02:41:00 +0200
Subject: [PATCH 01/76] 8026396: Remove information duplication in the
collector policy
Cleaned up the usage of flags in collector policy.
Reviewed-by: sjohanss, jcoomes
---
.../src/share/vm/memory/collectorPolicy.cpp | 57 ++++++-------------
1 file changed, 18 insertions(+), 39 deletions(-)
diff --git a/hotspot/src/share/vm/memory/collectorPolicy.cpp b/hotspot/src/share/vm/memory/collectorPolicy.cpp
index 6d822a4b9e9..7d6246ec0c6 100644
--- a/hotspot/src/share/vm/memory/collectorPolicy.cpp
+++ b/hotspot/src/share/vm/memory/collectorPolicy.cpp
@@ -444,70 +444,51 @@ void GenCollectorPolicy::initialize_flags() {
void GenCollectorPolicy::initialize_size_info() {
CollectorPolicy::initialize_size_info();
- // _space_alignment is used for alignment within a generation.
- // There is additional alignment done down stream for some
- // collectors that sometimes causes unwanted rounding up of
- // generations sizes.
+ _initial_gen0_size = NewSize;
+ _max_gen0_size = MaxNewSize;
+ _initial_gen1_size = OldSize;
// Determine maximum size of gen0
- size_t max_new_size = 0;
- if (!FLAG_IS_DEFAULT(MaxNewSize)) {
- max_new_size = MaxNewSize;
- } else {
- max_new_size = scale_by_NewRatio_aligned(_max_heap_byte_size);
+ if (FLAG_IS_DEFAULT(MaxNewSize)) {
+ _max_gen0_size = scale_by_NewRatio_aligned(_max_heap_byte_size);
// Bound the maximum size by NewSize below (since it historically
// would have been NewSize and because the NewRatio calculation could
// yield a size that is too small) and bound it by MaxNewSize above.
// Ergonomics plays here by previously calculating the desired
// NewSize and MaxNewSize.
- max_new_size = MIN2(MAX2(max_new_size, NewSize), MaxNewSize);
+ _max_gen0_size = MIN2(MAX2(_max_gen0_size, _initial_gen0_size), MaxNewSize);
}
- assert(max_new_size > 0, "All paths should set max_new_size");
// Given the maximum gen0 size, determine the initial and
// minimum gen0 sizes.
if (_max_heap_byte_size == _initial_heap_byte_size) {
- // The maxium and initial heap sizes are the same so the generation's
+ // The maximum and initial heap sizes are the same so the generation's
// initial size must be the same as it maximum size. Use NewSize as the
// size if set on command line.
- size_t fixed_young_size = FLAG_IS_CMDLINE(NewSize) ? NewSize : max_new_size;
-
- _initial_gen0_size = fixed_young_size;
- _max_gen0_size = fixed_young_size;
+ _max_gen0_size = FLAG_IS_CMDLINE(NewSize) ? NewSize : _max_gen0_size;
+ _initial_gen0_size = _max_gen0_size;
// Also update the minimum size if min == initial == max.
if (_max_heap_byte_size == _min_heap_byte_size) {
- _min_gen0_size = fixed_young_size;
+ _min_gen0_size = _max_gen0_size;
}
} else {
- size_t desired_new_size = 0;
if (FLAG_IS_CMDLINE(NewSize)) {
// If NewSize is set on the command line, we should use it as
// the initial size, but make sure it is within the heap bounds.
- desired_new_size =
- MIN2(max_new_size, bound_minus_alignment(NewSize, _initial_heap_byte_size));
- _min_gen0_size = bound_minus_alignment(desired_new_size, _min_heap_byte_size);
+ _initial_gen0_size =
+ MIN2(_max_gen0_size, bound_minus_alignment(NewSize, _initial_heap_byte_size));
+ _min_gen0_size = bound_minus_alignment(_initial_gen0_size, _min_heap_byte_size);
} else {
// For the case where NewSize is not set on the command line, use
// NewRatio to size the initial generation size. Use the current
// NewSize as the floor, because if NewRatio is overly large, the resulting
// size can be too small.
- desired_new_size =
- MIN2(max_new_size, MAX2(scale_by_NewRatio_aligned(_initial_heap_byte_size), NewSize));
+ _initial_gen0_size =
+ MIN2(_max_gen0_size, MAX2(scale_by_NewRatio_aligned(_initial_heap_byte_size), NewSize));
}
- _initial_gen0_size = desired_new_size;
- _max_gen0_size = max_new_size;
- }
-
- // Write back to flags if necessary.
- if (NewSize != _initial_gen0_size) {
- FLAG_SET_ERGO(uintx, NewSize, _initial_gen0_size);
- }
-
- if (MaxNewSize != _max_gen0_size) {
- FLAG_SET_ERGO(uintx, MaxNewSize, _max_gen0_size);
}
if (PrintGCDetails && Verbose) {
@@ -534,7 +515,6 @@ void GenCollectorPolicy::initialize_size_info() {
_min_gen1_size = _gen_alignment;
_initial_gen1_size = MIN2(_max_gen1_size, MAX2(_initial_heap_byte_size - _initial_gen0_size, _min_gen1_size));
// _max_gen1_size has already been made consistent above
- FLAG_SET_ERGO(uintx, OldSize, _initial_gen1_size);
} else {
// OldSize has been explicitly set on the command line. Use it
// for the initial size but make sure the minimum allow a young
@@ -543,16 +523,15 @@ void GenCollectorPolicy::initialize_size_info() {
// with other command line flags, issue a warning.
// The generation minimums and the overall heap minimum should
// be within one generation alignment.
- if (OldSize > _max_gen1_size) {
+ if (_initial_gen1_size > _max_gen1_size) {
warning("Inconsistency between maximum heap size and maximum "
"generation sizes: using maximum heap = " SIZE_FORMAT
" -XX:OldSize flag is being ignored",
_max_heap_byte_size);
- FLAG_SET_ERGO(uintx, OldSize, _max_gen1_size);
+ _initial_gen1_size = _max_gen1_size;
}
- _min_gen1_size = MIN2(OldSize, _min_heap_byte_size - _min_gen0_size);
- _initial_gen1_size = OldSize;
+ _min_gen1_size = MIN2(_initial_gen1_size, _min_heap_byte_size - _min_gen0_size);
}
// The initial generation sizes should match the initial heap size,
From ded8b863dd70dc15944905d0d0925453dc46f43d Mon Sep 17 00:00:00 2001
From: Jesper Wilhelmsson
Date: Fri, 2 May 2014 02:11:34 +0200
Subject: [PATCH 02/76] 8042298: Remove the names gen0 and gen1 from the GC
code
Renamed gen0 and gen1 to young and old throughout the GC code.
Reviewed-by: sjohanss, jcoomes
---
.../cmsAdaptiveSizePolicy.cpp | 11 +-
.../cmsCollectorPolicy.cpp | 10 +-
.../concurrentMarkSweepGeneration.cpp | 4 +-
.../concurrentMarkSweepGeneration.hpp | 5 +-
.../gc_implementation/g1/g1CollectedHeap.cpp | 2 +-
.../g1/g1CollectorPolicy.cpp | 56 ++--
.../g1/g1CollectorPolicy.hpp | 30 +--
.../parallelScavenge/adjoiningGenerations.cpp | 16 +-
.../parallelScavenge/generationSizer.cpp | 4 +-
.../parallelScavenge/parallelScavengeHeap.cpp | 4 +-
.../parallelScavenge/psMarkSweep.cpp | 4 +-
.../parallelScavenge/psParallelCompact.cpp | 4 +-
.../parallelScavenge/psScavenge.cpp | 4 +-
.../src/share/vm/memory/collectorPolicy.cpp | 242 +++++++++---------
.../src/share/vm/memory/collectorPolicy.hpp | 28 +-
.../src/share/vm/memory/genCollectedHeap.cpp | 4 +-
.../src/share/vm/memory/tenuredGeneration.hpp | 5 +-
hotspot/src/share/vm/runtime/arguments.cpp | 4 +
hotspot/src/share/vm/runtime/globals.hpp | 14 +-
19 files changed, 225 insertions(+), 226 deletions(-)
diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.cpp
index 44239d9b7e7..3b3814ff9c9 100644
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.cpp
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.cpp
@@ -1341,13 +1341,14 @@ bool CMSAdaptiveSizePolicy::get_and_clear_first_after_collection() {
bool CMSAdaptiveSizePolicy::print_adaptive_size_policy_on(
outputStream* st) const {
- if (!UseAdaptiveSizePolicy) return false;
+ if (!UseAdaptiveSizePolicy) {
+ return false;
+ }
GenCollectedHeap* gch = GenCollectedHeap::heap();
- Generation* gen0 = gch->get_gen(0);
- DefNewGeneration* def_new = gen0->as_DefNewGeneration();
- return
- AdaptiveSizePolicy::print_adaptive_size_policy_on(
+ Generation* young = gch->get_gen(0);
+ DefNewGeneration* def_new = young->as_DefNewGeneration();
+ return AdaptiveSizePolicy::print_adaptive_size_policy_on(
st,
def_new->tenuring_threshold());
}
diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.cpp
index a236a10efb3..19d49f039a3 100644
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.cpp
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.cpp
@@ -60,21 +60,21 @@ void ConcurrentMarkSweepPolicy::initialize_generations() {
if (UseParNewGC) {
if (UseAdaptiveSizePolicy) {
_generations[0] = new GenerationSpec(Generation::ASParNew,
- _initial_gen0_size, _max_gen0_size);
+ _initial_young_size, _max_young_size);
} else {
_generations[0] = new GenerationSpec(Generation::ParNew,
- _initial_gen0_size, _max_gen0_size);
+ _initial_young_size, _max_young_size);
}
} else {
_generations[0] = new GenerationSpec(Generation::DefNew,
- _initial_gen0_size, _max_gen0_size);
+ _initial_young_size, _max_young_size);
}
if (UseAdaptiveSizePolicy) {
_generations[1] = new GenerationSpec(Generation::ASConcurrentMarkSweep,
- _initial_gen1_size, _max_gen1_size);
+ _initial_old_size, _max_old_size);
} else {
_generations[1] = new GenerationSpec(Generation::ConcurrentMarkSweep,
- _initial_gen1_size, _max_gen1_size);
+ _initial_old_size, _max_old_size);
}
if (_generations[0] == NULL || _generations[1] == NULL) {
diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp
index dba6f8ca7d7..8cd65e36dca 100644
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp
@@ -1138,8 +1138,8 @@ static inline size_t percent_of_space(Space* space, HeapWord* addr)
void CMSCollector::icms_update_allocation_limits()
{
- Generation* gen0 = GenCollectedHeap::heap()->get_gen(0);
- EdenSpace* eden = gen0->as_DefNewGeneration()->eden();
+ Generation* young = GenCollectedHeap::heap()->get_gen(0);
+ EdenSpace* eden = young->as_DefNewGeneration()->eden();
const unsigned int duty_cycle = stats().icms_update_duty_cycle();
if (CMSTraceIncrementalPacing) {
diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp
index 6cf2f4270b6..09740b6d57c 100644
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp
@@ -1193,10 +1193,9 @@ class ConcurrentMarkSweepGeneration: public CardGeneration {
// Does a "full" (forced) collection invoked on this generation collect
// all younger generations as well? Note that the second conjunct is a
// hack to allow the collection of the younger gen first if the flag is
- // set. This is better than using th policy's should_collect_gen0_first()
- // since that causes us to do an extra unnecessary pair of restart-&-stop-world.
+ // set.
virtual bool full_collects_younger_generations() const {
- return UseCMSCompactAtFullCollection && !CollectGen0First;
+ return UseCMSCompactAtFullCollection && !ScavengeBeforeFullGC;
}
void space_iterate(SpaceClosure* blk, bool usedOnly = false);
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
index 83f819b3919..a1dbb6f1b18 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
@@ -3622,7 +3622,7 @@ void G1CollectedHeap::gc_threads_do(ThreadClosure* tc) const {
void G1CollectedHeap::print_tracing_info() const {
// We'll overload this to mean "trace GC pause statistics."
- if (TraceGen0Time || TraceGen1Time) {
+ if (TraceYoungGenTime || TraceOldGenTime) {
// The "G1CollectorPolicy" is keeping track of these stats, so delegate
// to that.
g1_policy()->print_tracing_info();
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp
index 89b6f3fa616..1c805c634b3 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp
@@ -809,7 +809,7 @@ void G1CollectorPolicy::record_full_collection_end() {
double full_gc_time_sec = end_sec - _full_collection_start_sec;
double full_gc_time_ms = full_gc_time_sec * 1000.0;
- _trace_gen1_time_data.record_full_collection(full_gc_time_ms);
+ _trace_old_gen_time_data.record_full_collection(full_gc_time_ms);
update_recent_gc_times(end_sec, full_gc_time_ms);
@@ -851,7 +851,7 @@ void G1CollectorPolicy::record_collection_pause_start(double start_time_sec) {
_g1->used(), _g1->recalculate_used()));
double s_w_t_ms = (start_time_sec - _stop_world_start) * 1000.0;
- _trace_gen0_time_data.record_start_collection(s_w_t_ms);
+ _trace_young_gen_time_data.record_start_collection(s_w_t_ms);
_stop_world_start = 0.0;
record_heap_size_info_at_start(false /* full */);
@@ -906,7 +906,7 @@ void G1CollectorPolicy::record_concurrent_mark_cleanup_completed() {
void G1CollectorPolicy::record_concurrent_pause() {
if (_stop_world_start > 0.0) {
double yield_ms = (os::elapsedTime() - _stop_world_start) * 1000.0;
- _trace_gen0_time_data.record_yield_time(yield_ms);
+ _trace_young_gen_time_data.record_yield_time(yield_ms);
}
}
@@ -993,7 +993,7 @@ void G1CollectorPolicy::record_collection_pause_end(double pause_time_ms, Evacua
evacuation_info.set_bytes_copied(_bytes_copied_during_gc);
if (update_stats) {
- _trace_gen0_time_data.record_end_collection(pause_time_ms, phase_times());
+ _trace_young_gen_time_data.record_end_collection(pause_time_ms, phase_times());
// this is where we update the allocation rate of the application
double app_time_ms =
(phase_times()->cur_collection_start_sec() * 1000.0 - _prev_collection_pause_end_ms);
@@ -1415,8 +1415,8 @@ size_t G1CollectorPolicy::expansion_amount() {
}
void G1CollectorPolicy::print_tracing_info() const {
- _trace_gen0_time_data.print();
- _trace_gen1_time_data.print();
+ _trace_young_gen_time_data.print();
+ _trace_old_gen_time_data.print();
}
void G1CollectorPolicy::print_yg_surv_rate_info() const {
@@ -1973,9 +1973,9 @@ void G1CollectorPolicy::finalize_cset(double target_pause_time_ms, EvacuationInf
_last_gc_was_young = gcs_are_young() ? true : false;
if (_last_gc_was_young) {
- _trace_gen0_time_data.increment_young_collection_count();
+ _trace_young_gen_time_data.increment_young_collection_count();
} else {
- _trace_gen0_time_data.increment_mixed_collection_count();
+ _trace_young_gen_time_data.increment_mixed_collection_count();
}
// The young list is laid with the survivor regions from the previous
@@ -2156,20 +2156,20 @@ void G1CollectorPolicy::finalize_cset(double target_pause_time_ms, EvacuationInf
evacuation_info.set_collectionset_regions(cset_region_length());
}
-void TraceGen0TimeData::record_start_collection(double time_to_stop_the_world_ms) {
- if(TraceGen0Time) {
+void TraceYoungGenTimeData::record_start_collection(double time_to_stop_the_world_ms) {
+ if(TraceYoungGenTime) {
_all_stop_world_times_ms.add(time_to_stop_the_world_ms);
}
}
-void TraceGen0TimeData::record_yield_time(double yield_time_ms) {
- if(TraceGen0Time) {
+void TraceYoungGenTimeData::record_yield_time(double yield_time_ms) {
+ if(TraceYoungGenTime) {
_all_yield_times_ms.add(yield_time_ms);
}
}
-void TraceGen0TimeData::record_end_collection(double pause_time_ms, G1GCPhaseTimes* phase_times) {
- if(TraceGen0Time) {
+void TraceYoungGenTimeData::record_end_collection(double pause_time_ms, G1GCPhaseTimes* phase_times) {
+ if(TraceYoungGenTime) {
_total.add(pause_time_ms);
_other.add(pause_time_ms - phase_times->accounted_time_ms());
_root_region_scan_wait.add(phase_times->root_region_scan_wait_time_ms());
@@ -2194,34 +2194,34 @@ void TraceGen0TimeData::record_end_collection(double pause_time_ms, G1GCPhaseTim
}
}
-void TraceGen0TimeData::increment_young_collection_count() {
- if(TraceGen0Time) {
+void TraceYoungGenTimeData::increment_young_collection_count() {
+ if(TraceYoungGenTime) {
++_young_pause_num;
}
}
-void TraceGen0TimeData::increment_mixed_collection_count() {
- if(TraceGen0Time) {
+void TraceYoungGenTimeData::increment_mixed_collection_count() {
+ if(TraceYoungGenTime) {
++_mixed_pause_num;
}
}
-void TraceGen0TimeData::print_summary(const char* str,
- const NumberSeq* seq) const {
+void TraceYoungGenTimeData::print_summary(const char* str,
+ const NumberSeq* seq) const {
double sum = seq->sum();
gclog_or_tty->print_cr("%-27s = %8.2lf s (avg = %8.2lf ms)",
str, sum / 1000.0, seq->avg());
}
-void TraceGen0TimeData::print_summary_sd(const char* str,
- const NumberSeq* seq) const {
+void TraceYoungGenTimeData::print_summary_sd(const char* str,
+ const NumberSeq* seq) const {
print_summary(str, seq);
gclog_or_tty->print_cr("%+45s = %5d, std dev = %8.2lf ms, max = %8.2lf ms)",
"(num", seq->num(), seq->sd(), seq->maximum());
}
-void TraceGen0TimeData::print() const {
- if (!TraceGen0Time) {
+void TraceYoungGenTimeData::print() const {
+ if (!TraceYoungGenTime) {
return;
}
@@ -2258,14 +2258,14 @@ void TraceGen0TimeData::print() const {
print_summary_sd(" Yields", &_all_yield_times_ms);
}
-void TraceGen1TimeData::record_full_collection(double full_gc_time_ms) {
- if (TraceGen1Time) {
+void TraceOldGenTimeData::record_full_collection(double full_gc_time_ms) {
+ if (TraceOldGenTime) {
_all_full_gc_times.add(full_gc_time_ms);
}
}
-void TraceGen1TimeData::print() const {
- if (!TraceGen1Time) {
+void TraceOldGenTimeData::print() const {
+ if (!TraceOldGenTime) {
return;
}
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp
index f2905097190..4f141892e1f 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp
@@ -38,10 +38,10 @@ class HeapRegion;
class CollectionSetChooser;
class G1GCPhaseTimes;
-// TraceGen0Time collects data on _both_ young and mixed evacuation pauses
+// TraceYoungGenTime collects data on _both_ young and mixed evacuation pauses
// (the latter may contain non-young regions - i.e. regions that are
-// technically in Gen1) while TraceGen1Time collects data about full GCs.
-class TraceGen0TimeData : public CHeapObj {
+// technically in old) while TraceOldGenTime collects data about full GCs.
+class TraceYoungGenTimeData : public CHeapObj {
private:
unsigned _young_pause_num;
unsigned _mixed_pause_num;
@@ -66,7 +66,7 @@ class TraceGen0TimeData : public CHeapObj {
void print_summary_sd(const char* str, const NumberSeq* seq) const;
public:
- TraceGen0TimeData() : _young_pause_num(0), _mixed_pause_num(0) {};
+ TraceYoungGenTimeData() : _young_pause_num(0), _mixed_pause_num(0) {};
void record_start_collection(double time_to_stop_the_world_ms);
void record_yield_time(double yield_time_ms);
void record_end_collection(double pause_time_ms, G1GCPhaseTimes* phase_times);
@@ -75,7 +75,7 @@ public:
void print() const;
};
-class TraceGen1TimeData : public CHeapObj {
+class TraceOldGenTimeData : public CHeapObj {
private:
NumberSeq _all_full_gc_times;
@@ -187,8 +187,8 @@ private:
TruncatedSeq* _concurrent_mark_remark_times_ms;
TruncatedSeq* _concurrent_mark_cleanup_times_ms;
- TraceGen0TimeData _trace_gen0_time_data;
- TraceGen1TimeData _trace_gen1_time_data;
+ TraceYoungGenTimeData _trace_young_gen_time_data;
+ TraceOldGenTimeData _trace_old_gen_time_data;
double _stop_world_start;
@@ -202,20 +202,20 @@ private:
// locker is active. This should be >= _young_list_target_length;
uint _young_list_max_length;
- bool _last_gc_was_young;
+ bool _last_gc_was_young;
- bool _during_marking;
- bool _in_marking_window;
- bool _in_marking_window_im;
+ bool _during_marking;
+ bool _in_marking_window;
+ bool _in_marking_window_im;
- SurvRateGroup* _short_lived_surv_rate_group;
- SurvRateGroup* _survivor_surv_rate_group;
+ SurvRateGroup* _short_lived_surv_rate_group;
+ SurvRateGroup* _survivor_surv_rate_group;
// add here any more surv rate groups
- double _gc_overhead_perc;
+ double _gc_overhead_perc;
double _reserve_factor;
- uint _reserve_regions;
+ uint _reserve_regions;
bool during_marking() {
return _during_marking;
diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/adjoiningGenerations.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/adjoiningGenerations.cpp
index 468871ea5fc..4ad67face5e 100644
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/adjoiningGenerations.cpp
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/adjoiningGenerations.cpp
@@ -35,14 +35,14 @@
AdjoiningGenerations::AdjoiningGenerations(ReservedSpace old_young_rs,
GenerationSizer* policy,
size_t alignment) :
- _virtual_spaces(old_young_rs, policy->min_gen1_size(),
- policy->min_gen0_size(), alignment) {
- size_t init_low_byte_size = policy->initial_gen1_size();
- size_t min_low_byte_size = policy->min_gen1_size();
- size_t max_low_byte_size = policy->max_gen1_size();
- size_t init_high_byte_size = policy->initial_gen0_size();
- size_t min_high_byte_size = policy->min_gen0_size();
- size_t max_high_byte_size = policy->max_gen0_size();
+ _virtual_spaces(old_young_rs, policy->min_old_size(),
+ policy->min_young_size(), alignment) {
+ size_t init_low_byte_size = policy->initial_old_size();
+ size_t min_low_byte_size = policy->min_old_size();
+ size_t max_low_byte_size = policy->max_old_size();
+ size_t init_high_byte_size = policy->initial_young_size();
+ size_t min_high_byte_size = policy->min_young_size();
+ size_t max_high_byte_size = policy->max_young_size();
assert(min_low_byte_size <= init_low_byte_size &&
init_low_byte_size <= max_low_byte_size, "Parameter check");
diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.cpp
index fd8b1332c7a..ff4b53057b8 100644
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.cpp
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.cpp
@@ -32,8 +32,8 @@ void GenerationSizer::trace_gen_sizes(const char* const str) {
SIZE_FORMAT "," SIZE_FORMAT " "
SIZE_FORMAT,
str,
- _min_gen1_size / K, _max_gen1_size / K,
- _min_gen0_size / K, _max_gen0_size / K,
+ _min_old_size / K, _max_old_size / K,
+ _min_young_size / K, _max_young_size / K,
_max_heap_byte_size / K);
}
}
diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp
index 5a2f4e79d95..b7d521a4884 100644
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp
@@ -623,11 +623,11 @@ void ParallelScavengeHeap::print_gc_threads_on(outputStream* st) const {
}
void ParallelScavengeHeap::print_tracing_info() const {
- if (TraceGen0Time) {
+ if (TraceYoungGenTime) {
double time = PSScavenge::accumulated_time()->seconds();
tty->print_cr("[Accumulated GC generation 0 time %3.7f secs]", time);
}
- if (TraceGen1Time) {
+ if (TraceOldGenTime) {
double time = UseParallelOldGC ? PSParallelCompact::accumulated_time()->seconds() : PSMarkSweep::accumulated_time()->seconds();
tty->print_cr("[Accumulated GC generation 1 time %3.7f secs]", time);
}
diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp
index 19eaf27aae5..bb829f99602 100644
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp
@@ -174,7 +174,7 @@ bool PSMarkSweep::invoke_no_policy(bool clear_all_softrefs) {
TraceCollectorStats tcs(counters());
TraceMemoryManagerStats tms(true /* Full GC */,gc_cause);
- if (TraceGen1Time) accumulated_time()->start();
+ if (TraceOldGenTime) accumulated_time()->start();
// Let the size policy know we're starting
size_policy->major_collection_begin();
@@ -354,7 +354,7 @@ bool PSMarkSweep::invoke_no_policy(bool clear_all_softrefs) {
// We collected the heap, recalculate the metaspace capacity
MetaspaceGC::compute_new_size();
- if (TraceGen1Time) accumulated_time()->stop();
+ if (TraceOldGenTime) accumulated_time()->stop();
if (PrintGC) {
if (PrintGCDetails) {
diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp
index a9ffe54bd25..cba23adae9f 100644
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp
@@ -2061,7 +2061,7 @@ bool PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) {
TraceCollectorStats tcs(counters());
TraceMemoryManagerStats tms(true /* Full GC */,gc_cause);
- if (TraceGen1Time) accumulated_time()->start();
+ if (TraceOldGenTime) accumulated_time()->start();
// Let the size policy know we're starting
size_policy->major_collection_begin();
@@ -2188,7 +2188,7 @@ bool PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) {
// Resize the metaspace capacity after a collection
MetaspaceGC::compute_new_size();
- if (TraceGen1Time) accumulated_time()->stop();
+ if (TraceOldGenTime) accumulated_time()->stop();
if (PrintGC) {
if (PrintGCDetails) {
diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp
index fd3030462b8..e71122529b1 100644
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp
@@ -336,7 +336,7 @@ bool PSScavenge::invoke_no_policy() {
TraceCollectorStats tcs(counters());
TraceMemoryManagerStats tms(false /* not full GC */,gc_cause);
- if (TraceGen0Time) accumulated_time()->start();
+ if (TraceYoungGenTime) accumulated_time()->start();
// Let the size policy know we're starting
size_policy->minor_collection_begin();
@@ -660,7 +660,7 @@ bool PSScavenge::invoke_no_policy() {
CardTableExtension::verify_all_young_refs_imprecise();
}
- if (TraceGen0Time) accumulated_time()->stop();
+ if (TraceYoungGenTime) accumulated_time()->stop();
if (PrintGC) {
if (PrintGCDetails) {
diff --git a/hotspot/src/share/vm/memory/collectorPolicy.cpp b/hotspot/src/share/vm/memory/collectorPolicy.cpp
index 7d6246ec0c6..de33c9107d7 100644
--- a/hotspot/src/share/vm/memory/collectorPolicy.cpp
+++ b/hotspot/src/share/vm/memory/collectorPolicy.cpp
@@ -196,13 +196,13 @@ size_t CollectorPolicy::compute_heap_alignment() {
// GenCollectorPolicy methods
GenCollectorPolicy::GenCollectorPolicy() :
- _min_gen0_size(0),
- _initial_gen0_size(0),
- _max_gen0_size(0),
+ _min_young_size(0),
+ _initial_young_size(0),
+ _max_young_size(0),
_gen_alignment(0),
- _min_gen1_size(0),
- _initial_gen1_size(0),
- _max_gen1_size(0),
+ _min_old_size(0),
+ _initial_old_size(0),
+ _max_old_size(0),
_generations(NULL)
{}
@@ -236,7 +236,7 @@ size_t GenCollectorPolicy::young_gen_size_lower_bound() {
#ifdef ASSERT
void GenCollectorPolicy::assert_flags() {
CollectorPolicy::assert_flags();
- assert(NewSize >= _min_gen0_size, "Ergonomics decided on a too small young gen size");
+ assert(NewSize >= _min_young_size, "Ergonomics decided on a too small young gen size");
assert(NewSize <= MaxNewSize, "Ergonomics decided on incompatible initial and maximum young gen sizes");
assert(FLAG_IS_DEFAULT(MaxNewSize) || MaxNewSize < MaxHeapSize, "Ergonomics decided on incompatible maximum young gen and heap sizes");
assert(NewSize % _gen_alignment == 0, "NewSize alignment");
@@ -249,28 +249,28 @@ void GenCollectorPolicy::assert_size_info() {
CollectorPolicy::assert_size_info();
// GenCollectorPolicy::initialize_size_info may update the MaxNewSize
assert(MaxNewSize < MaxHeapSize, "Ergonomics decided on incompatible maximum young and heap sizes");
- assert(NewSize == _initial_gen0_size, "Discrepancy between NewSize flag and local storage");
- assert(MaxNewSize == _max_gen0_size, "Discrepancy between MaxNewSize flag and local storage");
- assert(OldSize == _initial_gen1_size, "Discrepancy between OldSize flag and local storage");
- assert(_min_gen0_size <= _initial_gen0_size, "Ergonomics decided on incompatible minimum and initial young gen sizes");
- assert(_initial_gen0_size <= _max_gen0_size, "Ergonomics decided on incompatible initial and maximum young gen sizes");
- assert(_min_gen0_size % _gen_alignment == 0, "_min_gen0_size alignment");
- assert(_initial_gen0_size % _gen_alignment == 0, "_initial_gen0_size alignment");
- assert(_max_gen0_size % _gen_alignment == 0, "_max_gen0_size alignment");
- assert(_min_gen0_size <= bound_minus_alignment(_min_gen0_size, _min_heap_byte_size),
+ assert(NewSize == _initial_young_size, "Discrepancy between NewSize flag and local storage");
+ assert(MaxNewSize == _max_young_size, "Discrepancy between MaxNewSize flag and local storage");
+ assert(OldSize == _initial_old_size, "Discrepancy between OldSize flag and local storage");
+ assert(_min_young_size <= _initial_young_size, "Ergonomics decided on incompatible minimum and initial young gen sizes");
+ assert(_initial_young_size <= _max_young_size, "Ergonomics decided on incompatible initial and maximum young gen sizes");
+ assert(_min_young_size % _gen_alignment == 0, "_min_young_size alignment");
+ assert(_initial_young_size % _gen_alignment == 0, "_initial_young_size alignment");
+ assert(_max_young_size % _gen_alignment == 0, "_max_young_size alignment");
+ assert(_min_young_size <= bound_minus_alignment(_min_young_size, _min_heap_byte_size),
"Ergonomics made minimum young generation larger than minimum heap");
- assert(_initial_gen0_size <= bound_minus_alignment(_initial_gen0_size, _initial_heap_byte_size),
+ assert(_initial_young_size <= bound_minus_alignment(_initial_young_size, _initial_heap_byte_size),
"Ergonomics made initial young generation larger than initial heap");
- assert(_max_gen0_size <= bound_minus_alignment(_max_gen0_size, _max_heap_byte_size),
+ assert(_max_young_size <= bound_minus_alignment(_max_young_size, _max_heap_byte_size),
"Ergonomics made maximum young generation lager than maximum heap");
- assert(_min_gen1_size <= _initial_gen1_size, "Ergonomics decided on incompatible minimum and initial old gen sizes");
- assert(_initial_gen1_size <= _max_gen1_size, "Ergonomics decided on incompatible initial and maximum old gen sizes");
- assert(_max_gen1_size % _gen_alignment == 0, "_max_gen1_size alignment");
- assert(_initial_gen1_size % _gen_alignment == 0, "_initial_gen1_size alignment");
- assert(_max_heap_byte_size <= (_max_gen0_size + _max_gen1_size), "Total maximum heap sizes must be sum of generation maximum sizes");
- assert(_min_gen0_size + _min_gen1_size <= _min_heap_byte_size, "Minimum generation sizes exceed minimum heap size");
- assert(_initial_gen0_size + _initial_gen1_size == _initial_heap_byte_size, "Initial generation sizes should match initial heap size");
- assert(_max_gen0_size + _max_gen1_size == _max_heap_byte_size, "Maximum generation sizes should match maximum heap size");
+ assert(_min_old_size <= _initial_old_size, "Ergonomics decided on incompatible minimum and initial old gen sizes");
+ assert(_initial_old_size <= _max_old_size, "Ergonomics decided on incompatible initial and maximum old gen sizes");
+ assert(_max_old_size % _gen_alignment == 0, "_max_old_size alignment");
+ assert(_initial_old_size % _gen_alignment == 0, "_initial_old_size alignment");
+ assert(_max_heap_byte_size <= (_max_young_size + _max_old_size), "Total maximum heap sizes must be sum of generation maximum sizes");
+ assert(_min_young_size + _min_old_size <= _min_heap_byte_size, "Minimum generation sizes exceed minimum heap size");
+ assert(_initial_young_size + _initial_old_size == _initial_heap_byte_size, "Initial generation sizes should match initial heap size");
+ assert(_max_young_size + _max_old_size == _max_heap_byte_size, "Maximum generation sizes should match maximum heap size");
}
#endif // ASSERT
@@ -323,8 +323,8 @@ void GenCollectorPolicy::initialize_flags() {
// later when setting the initial and minimum young generation size.
NewSize = bounded_new_size;
}
- _min_gen0_size = smallest_new_size;
- _initial_gen0_size = NewSize;
+ _min_young_size = smallest_new_size;
+ _initial_young_size = NewSize;
if (!FLAG_IS_DEFAULT(MaxNewSize)) {
if (MaxNewSize >= MaxHeapSize) {
@@ -338,14 +338,14 @@ void GenCollectorPolicy::initialize_flags() {
FLAG_SET_ERGO(uintx, MaxNewSize, smaller_max_new_size);
if (NewSize > MaxNewSize) {
FLAG_SET_ERGO(uintx, NewSize, MaxNewSize);
- _initial_gen0_size = NewSize;
+ _initial_young_size = NewSize;
}
- } else if (MaxNewSize < _initial_gen0_size) {
- FLAG_SET_ERGO(uintx, MaxNewSize, _initial_gen0_size);
+ } else if (MaxNewSize < _initial_young_size) {
+ FLAG_SET_ERGO(uintx, MaxNewSize, _initial_young_size);
} else if (!is_size_aligned(MaxNewSize, _gen_alignment)) {
FLAG_SET_ERGO(uintx, MaxNewSize, align_size_down(MaxNewSize, _gen_alignment));
}
- _max_gen0_size = MaxNewSize;
+ _max_young_size = MaxNewSize;
}
if (NewSize > MaxNewSize) {
@@ -357,7 +357,7 @@ void GenCollectorPolicy::initialize_flags() {
NewSize/K, MaxNewSize/K, NewSize/K);
}
FLAG_SET_ERGO(uintx, MaxNewSize, NewSize);
- _max_gen0_size = MaxNewSize;
+ _max_young_size = MaxNewSize;
}
if (SurvivorRatio < 1 || NewRatio < 1) {
@@ -393,7 +393,7 @@ void GenCollectorPolicy::initialize_flags() {
double shrink_factor = (double) MaxHeapSize / calculated_size;
uintx smaller_new_size = align_size_down((uintx)(NewSize * shrink_factor), _gen_alignment);
FLAG_SET_ERGO(uintx, NewSize, MAX2(young_gen_size_lower_bound(), smaller_new_size));
- _initial_gen0_size = NewSize;
+ _initial_young_size = NewSize;
// OldSize is already aligned because above we aligned MaxHeapSize to
// _heap_alignment, and we just made sure that NewSize is aligned to
@@ -406,16 +406,16 @@ void GenCollectorPolicy::initialize_flags() {
}
}
- // Update NewSize, if possible, to avoid sizing gen0 to small when only
+ // Update NewSize, if possible, to avoid sizing the young gen too small when only
// OldSize is set on the command line.
if (FLAG_IS_CMDLINE(OldSize) && !FLAG_IS_CMDLINE(NewSize)) {
if (OldSize < _initial_heap_byte_size) {
size_t new_size = _initial_heap_byte_size - OldSize;
- // Need to compare against the flag value for max since _max_gen0_size
+ // Need to compare against the flag value for max since _max_young_size
// might not have been set yet.
- if (new_size >= _min_gen0_size && new_size <= MaxNewSize) {
+ if (new_size >= _min_young_size && new_size <= MaxNewSize) {
FLAG_SET_ERGO(uintx, NewSize, new_size);
- _initial_gen0_size = NewSize;
+ _initial_young_size = NewSize;
}
}
}
@@ -444,77 +444,77 @@ void GenCollectorPolicy::initialize_flags() {
void GenCollectorPolicy::initialize_size_info() {
CollectorPolicy::initialize_size_info();
- _initial_gen0_size = NewSize;
- _max_gen0_size = MaxNewSize;
- _initial_gen1_size = OldSize;
+ _initial_young_size = NewSize;
+ _max_young_size = MaxNewSize;
+ _initial_old_size = OldSize;
- // Determine maximum size of gen0
+ // Determine maximum size of the young generation.
if (FLAG_IS_DEFAULT(MaxNewSize)) {
- _max_gen0_size = scale_by_NewRatio_aligned(_max_heap_byte_size);
+ _max_young_size = scale_by_NewRatio_aligned(_max_heap_byte_size);
// Bound the maximum size by NewSize below (since it historically
// would have been NewSize and because the NewRatio calculation could
// yield a size that is too small) and bound it by MaxNewSize above.
// Ergonomics plays here by previously calculating the desired
// NewSize and MaxNewSize.
- _max_gen0_size = MIN2(MAX2(_max_gen0_size, _initial_gen0_size), MaxNewSize);
+ _max_young_size = MIN2(MAX2(_max_young_size, _initial_young_size), MaxNewSize);
}
- // Given the maximum gen0 size, determine the initial and
- // minimum gen0 sizes.
+ // Given the maximum young size, determine the initial and
+ // minimum young sizes.
if (_max_heap_byte_size == _initial_heap_byte_size) {
// The maximum and initial heap sizes are the same so the generation's
// initial size must be the same as it maximum size. Use NewSize as the
// size if set on command line.
- _max_gen0_size = FLAG_IS_CMDLINE(NewSize) ? NewSize : _max_gen0_size;
- _initial_gen0_size = _max_gen0_size;
+ _max_young_size = FLAG_IS_CMDLINE(NewSize) ? NewSize : _max_young_size;
+ _initial_young_size = _max_young_size;
// Also update the minimum size if min == initial == max.
if (_max_heap_byte_size == _min_heap_byte_size) {
- _min_gen0_size = _max_gen0_size;
+ _min_young_size = _max_young_size;
}
} else {
if (FLAG_IS_CMDLINE(NewSize)) {
// If NewSize is set on the command line, we should use it as
// the initial size, but make sure it is within the heap bounds.
- _initial_gen0_size =
- MIN2(_max_gen0_size, bound_minus_alignment(NewSize, _initial_heap_byte_size));
- _min_gen0_size = bound_minus_alignment(_initial_gen0_size, _min_heap_byte_size);
+ _initial_young_size =
+ MIN2(_max_young_size, bound_minus_alignment(NewSize, _initial_heap_byte_size));
+ _min_young_size = bound_minus_alignment(_initial_young_size, _min_heap_byte_size);
} else {
// For the case where NewSize is not set on the command line, use
// NewRatio to size the initial generation size. Use the current
// NewSize as the floor, because if NewRatio is overly large, the resulting
// size can be too small.
- _initial_gen0_size =
- MIN2(_max_gen0_size, MAX2(scale_by_NewRatio_aligned(_initial_heap_byte_size), NewSize));
+ _initial_young_size =
+ MIN2(_max_young_size, MAX2(scale_by_NewRatio_aligned(_initial_heap_byte_size), NewSize));
}
}
if (PrintGCDetails && Verbose) {
- gclog_or_tty->print_cr("1: Minimum gen0 " SIZE_FORMAT " Initial gen0 "
- SIZE_FORMAT " Maximum gen0 " SIZE_FORMAT,
- _min_gen0_size, _initial_gen0_size, _max_gen0_size);
+ gclog_or_tty->print_cr("1: Minimum young " SIZE_FORMAT " Initial young "
+ SIZE_FORMAT " Maximum young " SIZE_FORMAT,
+ _min_young_size, _initial_young_size, _max_young_size);
}
// At this point the minimum, initial and maximum sizes
- // of the overall heap and of gen0 have been determined.
- // The maximum gen1 size can be determined from the maximum gen0
+ // of the overall heap and of the young generation have been determined.
+ // The maximum old size can be determined from the maximum young
// and maximum heap size since no explicit flags exist
- // for setting the gen1 maximum.
- _max_gen1_size = MAX2(_max_heap_byte_size - _max_gen0_size, _gen_alignment);
+ // for setting the old generation maximum.
+ _max_old_size = MAX2(_max_heap_byte_size - _max_young_size, _gen_alignment);
// If no explicit command line flag has been set for the
- // gen1 size, use what is left for gen1
+ // old generation size, use what is left.
if (!FLAG_IS_CMDLINE(OldSize)) {
// The user has not specified any value but the ergonomics
// may have chosen a value (which may or may not be consistent
// with the overall heap size). In either case make
// the minimum, maximum and initial sizes consistent
- // with the gen0 sizes and the overall heap sizes.
- _min_gen1_size = _gen_alignment;
- _initial_gen1_size = MIN2(_max_gen1_size, MAX2(_initial_heap_byte_size - _initial_gen0_size, _min_gen1_size));
- // _max_gen1_size has already been made consistent above
+ // with the young sizes and the overall heap sizes.
+ _min_old_size = _gen_alignment;
+ _initial_old_size = MIN2(_max_old_size, MAX2(_initial_heap_byte_size - _initial_young_size, _min_old_size));
+ // _max_old_size has already been made consistent above.
} else {
// OldSize has been explicitly set on the command line. Use it
// for the initial size but make sure the minimum allow a young
@@ -523,68 +523,68 @@ void GenCollectorPolicy::initialize_size_info() {
// with other command line flags, issue a warning.
// The generation minimums and the overall heap minimum should
// be within one generation alignment.
- if (_initial_gen1_size > _max_gen1_size) {
+ if (_initial_old_size > _max_old_size) {
warning("Inconsistency between maximum heap size and maximum "
"generation sizes: using maximum heap = " SIZE_FORMAT
" -XX:OldSize flag is being ignored",
_max_heap_byte_size);
- _initial_gen1_size = _max_gen1_size;
+ _initial_old_size = _max_old_size;
}
- _min_gen1_size = MIN2(_initial_gen1_size, _min_heap_byte_size - _min_gen0_size);
+ _min_old_size = MIN2(_initial_old_size, _min_heap_byte_size - _min_young_size);
}
// The initial generation sizes should match the initial heap size,
// if not issue a warning and resize the generations. This behavior
// differs from JDK8 where the generation sizes have higher priority
// than the initial heap size.
- if ((_initial_gen1_size + _initial_gen0_size) != _initial_heap_byte_size) {
+ if ((_initial_old_size + _initial_young_size) != _initial_heap_byte_size) {
warning("Inconsistency between generation sizes and heap size, resizing "
"the generations to fit the heap.");
- size_t desired_gen0_size = _initial_heap_byte_size - _initial_gen1_size;
- if (_initial_heap_byte_size < _initial_gen1_size) {
+ size_t desired_young_size = _initial_heap_byte_size - _initial_old_size;
+ if (_initial_heap_byte_size < _initial_old_size) {
// Old want all memory, use minimum for young and rest for old
- _initial_gen0_size = _min_gen0_size;
- _initial_gen1_size = _initial_heap_byte_size - _min_gen0_size;
- } else if (desired_gen0_size > _max_gen0_size) {
+ _initial_young_size = _min_young_size;
+ _initial_old_size = _initial_heap_byte_size - _min_young_size;
+ } else if (desired_young_size > _max_young_size) {
// Need to increase both young and old generation
- _initial_gen0_size = _max_gen0_size;
- _initial_gen1_size = _initial_heap_byte_size - _max_gen0_size;
- } else if (desired_gen0_size < _min_gen0_size) {
+ _initial_young_size = _max_young_size;
+ _initial_old_size = _initial_heap_byte_size - _max_young_size;
+ } else if (desired_young_size < _min_young_size) {
// Need to decrease both young and old generation
- _initial_gen0_size = _min_gen0_size;
- _initial_gen1_size = _initial_heap_byte_size - _min_gen0_size;
+ _initial_young_size = _min_young_size;
+ _initial_old_size = _initial_heap_byte_size - _min_young_size;
} else {
// The young generation boundaries allow us to only update the
// young generation.
- _initial_gen0_size = desired_gen0_size;
+ _initial_young_size = desired_young_size;
}
if (PrintGCDetails && Verbose) {
- gclog_or_tty->print_cr("2: Minimum gen0 " SIZE_FORMAT " Initial gen0 "
- SIZE_FORMAT " Maximum gen0 " SIZE_FORMAT,
- _min_gen0_size, _initial_gen0_size, _max_gen0_size);
+ gclog_or_tty->print_cr("2: Minimum young " SIZE_FORMAT " Initial young "
+ SIZE_FORMAT " Maximum young " SIZE_FORMAT,
+ _min_young_size, _initial_young_size, _max_young_size);
}
}
- // Write back to flags if necessary
- if (NewSize != _initial_gen0_size) {
- FLAG_SET_ERGO(uintx, NewSize, _initial_gen0_size);
+ // Write back to flags if necessary.
+ if (NewSize != _initial_young_size) {
+ FLAG_SET_ERGO(uintx, NewSize, _initial_young_size);
}
- if (MaxNewSize != _max_gen0_size) {
- FLAG_SET_ERGO(uintx, MaxNewSize, _max_gen0_size);
+ if (MaxNewSize != _max_young_size) {
+ FLAG_SET_ERGO(uintx, MaxNewSize, _max_young_size);
}
- if (OldSize != _initial_gen1_size) {
- FLAG_SET_ERGO(uintx, OldSize, _initial_gen1_size);
+ if (OldSize != _initial_old_size) {
+ FLAG_SET_ERGO(uintx, OldSize, _initial_old_size);
}
if (PrintGCDetails && Verbose) {
- gclog_or_tty->print_cr("Minimum gen1 " SIZE_FORMAT " Initial gen1 "
- SIZE_FORMAT " Maximum gen1 " SIZE_FORMAT,
- _min_gen1_size, _initial_gen1_size, _max_gen1_size);
+ gclog_or_tty->print_cr("Minimum old " SIZE_FORMAT " Initial old "
+ SIZE_FORMAT " Maximum old " SIZE_FORMAT,
+ _min_old_size, _initial_old_size, _max_old_size);
}
DEBUG_ONLY(GenCollectorPolicy::assert_size_info();)
@@ -610,11 +610,11 @@ HeapWord* GenCollectorPolicy::mem_allocate_work(size_t size,
HandleMark hm; // Discard any handles allocated in each iteration.
// First allocation attempt is lock-free.
- Generation *gen0 = gch->get_gen(0);
- assert(gen0->supports_inline_contig_alloc(),
+ Generation *young = gch->get_gen(0);
+ assert(young->supports_inline_contig_alloc(),
"Otherwise, must do alloc within heap lock");
- if (gen0->should_allocate(size, is_tlab)) {
- result = gen0->par_allocate(size, is_tlab);
+ if (young->should_allocate(size, is_tlab)) {
+ result = young->par_allocate(size, is_tlab);
if (result != NULL) {
assert(gch->is_in_reserved(result), "result not in heap");
return result;
@@ -896,8 +896,8 @@ MetaWord* CollectorPolicy::satisfy_failed_metadata_allocation(
bool GenCollectorPolicy::should_try_older_generation_allocation(
size_t word_size) const {
GenCollectedHeap* gch = GenCollectedHeap::heap();
- size_t gen0_capacity = gch->get_gen(0)->capacity_before_gc();
- return (word_size > heap_word_size(gen0_capacity))
+ size_t young_capacity = gch->get_gen(0)->capacity_before_gc();
+ return (word_size > heap_word_size(young_capacity))
|| GC_locker::is_active_and_needs_gc()
|| gch->incremental_collection_failed();
}
@@ -919,11 +919,11 @@ void MarkSweepPolicy::initialize_generations() {
}
if (UseParNewGC) {
- _generations[0] = new GenerationSpec(Generation::ParNew, _initial_gen0_size, _max_gen0_size);
+ _generations[0] = new GenerationSpec(Generation::ParNew, _initial_young_size, _max_young_size);
} else {
- _generations[0] = new GenerationSpec(Generation::DefNew, _initial_gen0_size, _max_gen0_size);
+ _generations[0] = new GenerationSpec(Generation::DefNew, _initial_young_size, _max_young_size);
}
- _generations[1] = new GenerationSpec(Generation::MarkSweepCompact, _initial_gen1_size, _max_gen1_size);
+ _generations[1] = new GenerationSpec(Generation::MarkSweepCompact, _initial_old_size, _max_old_size);
if (_generations[0] == NULL || _generations[1] == NULL) {
vm_exit_during_initialization("Unable to allocate gen spec");
@@ -957,18 +957,18 @@ public:
flag_value = 20 * M;
set_basic_flag_values();
FLAG_SET_CMDLINE(uintx, NewSize, flag_value);
- verify_gen0_min(flag_value);
+ verify_young_min(flag_value);
set_basic_flag_values();
FLAG_SET_CMDLINE(uintx, NewSize, flag_value);
- verify_gen0_initial(flag_value);
+ verify_young_initial(flag_value);
// If NewSize is set on command line, but is larger than the min
// heap size, it should only be used for initial young size.
flag_value = 80 * M;
set_basic_flag_values();
FLAG_SET_CMDLINE(uintx, NewSize, flag_value);
- verify_gen0_initial(flag_value);
+ verify_young_initial(flag_value);
// If NewSize has been ergonomically set, the collector policy
// should use it for min but calculate the initial young size
@@ -976,11 +976,11 @@ public:
flag_value = 20 * M;
set_basic_flag_values();
FLAG_SET_ERGO(uintx, NewSize, flag_value);
- verify_gen0_min(flag_value);
+ verify_young_min(flag_value);
set_basic_flag_values();
FLAG_SET_ERGO(uintx, NewSize, flag_value);
- verify_scaled_gen0_initial(InitialHeapSize);
+ verify_scaled_young_initial(InitialHeapSize);
restore_flags();
}
@@ -995,11 +995,11 @@ public:
flag_value = 20 * M;
set_basic_flag_values();
FLAG_SET_CMDLINE(uintx, OldSize, flag_value);
- verify_gen1_min(flag_value);
+ verify_old_min(flag_value);
set_basic_flag_values();
FLAG_SET_CMDLINE(uintx, OldSize, flag_value);
- verify_gen1_initial(flag_value);
+ verify_old_initial(flag_value);
// If MaxNewSize is large, the maximum OldSize will be less than
// what's requested on the command line and it should be reset
@@ -1010,46 +1010,46 @@ public:
FLAG_SET_CMDLINE(uintx, MaxNewSize, 170*M);
// Calculate what we expect the flag to be.
flag_value = MaxHeapSize - MaxNewSize;
- verify_gen1_initial(flag_value);
+ verify_old_initial(flag_value);
}
- static void verify_gen0_min(size_t expected) {
+ static void verify_young_min(size_t expected) {
MarkSweepPolicy msp;
msp.initialize_all();
- assert(msp.min_gen0_size() <= expected, err_msg("%zu > %zu", msp.min_gen0_size(), expected));
+ assert(msp.min_young_size() <= expected, err_msg("%zu > %zu", msp.min_young_size(), expected));
}
- static void verify_gen0_initial(size_t expected) {
+ static void verify_young_initial(size_t expected) {
MarkSweepPolicy msp;
msp.initialize_all();
- assert(msp.initial_gen0_size() == expected, err_msg("%zu != %zu", msp.initial_gen0_size(), expected));
+ assert(msp.initial_young_size() == expected, err_msg("%zu != %zu", msp.initial_young_size(), expected));
}
- static void verify_scaled_gen0_initial(size_t initial_heap_size) {
+ static void verify_scaled_young_initial(size_t initial_heap_size) {
MarkSweepPolicy msp;
msp.initialize_all();
size_t expected = msp.scale_by_NewRatio_aligned(initial_heap_size);
- assert(msp.initial_gen0_size() == expected, err_msg("%zu != %zu", msp.initial_gen0_size(), expected));
+ assert(msp.initial_young_size() == expected, err_msg("%zu != %zu", msp.initial_young_size(), expected));
assert(FLAG_IS_ERGO(NewSize) && NewSize == expected,
err_msg("NewSize should have been set ergonomically to %zu, but was %zu", expected, NewSize));
}
- static void verify_gen1_min(size_t expected) {
+ static void verify_old_min(size_t expected) {
MarkSweepPolicy msp;
msp.initialize_all();
- assert(msp.min_gen1_size() <= expected, err_msg("%zu > %zu", msp.min_gen1_size(), expected));
+ assert(msp.min_old_size() <= expected, err_msg("%zu > %zu", msp.min_old_size(), expected));
}
- static void verify_gen1_initial(size_t expected) {
+ static void verify_old_initial(size_t expected) {
MarkSweepPolicy msp;
msp.initialize_all();
- assert(msp.initial_gen1_size() == expected, err_msg("%zu != %zu", msp.initial_gen1_size(), expected));
+ assert(msp.initial_old_size() == expected, err_msg("%zu != %zu", msp.initial_old_size(), expected));
}
diff --git a/hotspot/src/share/vm/memory/collectorPolicy.hpp b/hotspot/src/share/vm/memory/collectorPolicy.hpp
index 1fc62b06c43..57f59b2bd92 100644
--- a/hotspot/src/share/vm/memory/collectorPolicy.hpp
+++ b/hotspot/src/share/vm/memory/collectorPolicy.hpp
@@ -219,12 +219,12 @@ class ClearedAllSoftRefs : public StackObj {
class GenCollectorPolicy : public CollectorPolicy {
friend class TestGenCollectorPolicy;
protected:
- size_t _min_gen0_size;
- size_t _initial_gen0_size;
- size_t _max_gen0_size;
- size_t _min_gen1_size;
- size_t _initial_gen1_size;
- size_t _max_gen1_size;
+ size_t _min_young_size;
+ size_t _initial_young_size;
+ size_t _max_young_size;
+ size_t _min_old_size;
+ size_t _initial_old_size;
+ size_t _max_old_size;
// _gen_alignment and _space_alignment will have the same value most of the
// time. When using large pages they can differ.
@@ -260,13 +260,13 @@ friend class TestGenCollectorPolicy;
GenCollectorPolicy();
// Accessors
- size_t min_gen0_size() { return _min_gen0_size; }
- size_t initial_gen0_size() { return _initial_gen0_size; }
- size_t max_gen0_size() { return _max_gen0_size; }
- size_t gen_alignment() { return _gen_alignment; }
- size_t min_gen1_size() { return _min_gen1_size; }
- size_t initial_gen1_size() { return _initial_gen1_size; }
- size_t max_gen1_size() { return _max_gen1_size; }
+ size_t min_young_size() { return _min_young_size; }
+ size_t initial_young_size() { return _initial_young_size; }
+ size_t max_young_size() { return _max_young_size; }
+ size_t gen_alignment() { return _gen_alignment; }
+ size_t min_old_size() { return _min_old_size; }
+ size_t initial_old_size() { return _initial_old_size; }
+ size_t max_old_size() { return _max_old_size; }
int number_of_generations() { return 2; }
@@ -298,7 +298,7 @@ friend class TestGenCollectorPolicy;
size_t init_survivor_size);
virtual void post_heap_initialize() {
- assert(_max_gen0_size == MaxNewSize, "Should be taken care of by initialize_size_info");
+ assert(_max_young_size == MaxNewSize, "Should be taken care of by initialize_size_info");
}
BarrierSet::Name barrier_set_name() { return BarrierSet::CardTableModRef; }
diff --git a/hotspot/src/share/vm/memory/genCollectedHeap.cpp b/hotspot/src/share/vm/memory/genCollectedHeap.cpp
index 0f75d779d2a..a774f4051e6 100644
--- a/hotspot/src/share/vm/memory/genCollectedHeap.cpp
+++ b/hotspot/src/share/vm/memory/genCollectedHeap.cpp
@@ -1119,10 +1119,10 @@ void GenCollectedHeap::print_on_error(outputStream* st) const {
}
void GenCollectedHeap::print_tracing_info() const {
- if (TraceGen0Time) {
+ if (TraceYoungGenTime) {
get_gen(0)->print_summary_info();
}
- if (TraceGen1Time) {
+ if (TraceOldGenTime) {
get_gen(1)->print_summary_info();
}
}
diff --git a/hotspot/src/share/vm/memory/tenuredGeneration.hpp b/hotspot/src/share/vm/memory/tenuredGeneration.hpp
index 94a4330aca1..f9d621db54e 100644
--- a/hotspot/src/share/vm/memory/tenuredGeneration.hpp
+++ b/hotspot/src/share/vm/memory/tenuredGeneration.hpp
@@ -67,10 +67,9 @@ class TenuredGeneration: public OneContigSpaceCardGeneration {
// Does a "full" (forced) collection invoked on this generation collect
// all younger generations as well? Note that this is a
// hack to allow the collection of the younger gen first if the flag is
- // set. This is better than using th policy's should_collect_gen0_first()
- // since that causes us to do an extra unnecessary pair of restart-&-stop-world.
+ // set.
virtual bool full_collects_younger_generations() const {
- return !CollectGen0First;
+ return !ScavengeBeforeFullGC;
}
virtual void gc_prologue(bool full);
diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp
index 91e485e7aed..eeb469a6010 100644
--- a/hotspot/src/share/vm/runtime/arguments.cpp
+++ b/hotspot/src/share/vm/runtime/arguments.cpp
@@ -2187,6 +2187,10 @@ bool Arguments::check_vm_args_consistency() {
}
}
+ if (!(UseParallelGC || UseParallelOldGC) && FLAG_IS_DEFAULT(ScavengeBeforeFullGC)) {
+ FLAG_SET_DEFAULT(ScavengeBeforeFullGC, false);
+ }
+
status = status && verify_percentage(GCHeapFreeLimit, "GCHeapFreeLimit");
status = status && verify_percentage(GCTimeLimit, "GCTimeLimit");
if (GCTimeLimit == 100) {
diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp
index 9952ad96bb7..9321236d7a6 100644
--- a/hotspot/src/share/vm/runtime/globals.hpp
+++ b/hotspot/src/share/vm/runtime/globals.hpp
@@ -1450,8 +1450,7 @@ class CommandLineFlags {
"(ParallelGC only)") \
\
product(bool, ScavengeBeforeFullGC, true, \
- "Scavenge youngest generation before each full GC, " \
- "used with UseParallelGC") \
+ "Scavenge youngest generation before each full GC.") \
\
develop(bool, ScavengeWithObjectsInToSpace, false, \
"Allow scavenges to occur when to-space contains objects") \
@@ -2252,9 +2251,6 @@ class CommandLineFlags {
notproduct(bool, CheckMemoryInitialization, false, \
"Check memory initialization") \
\
- product(bool, CollectGen0First, false, \
- "Collect youngest generation before each full GC") \
- \
diagnostic(bool, BindCMSThreadToCPU, false, \
"Bind CMS Thread to CPU if possible") \
\
@@ -2333,11 +2329,11 @@ class CommandLineFlags {
NOT_LP64(2200*K) LP64_ONLY(4*M), \
"Initial size of the boot class loader data metaspace") \
\
- product(bool, TraceGen0Time, false, \
- "Trace accumulated time for Gen 0 collection") \
+ product(bool, TraceYoungGenTime, false, \
+ "Trace accumulated time for young collection") \
\
- product(bool, TraceGen1Time, false, \
- "Trace accumulated time for Gen 1 collection") \
+ product(bool, TraceOldGenTime, false, \
+ "Trace accumulated time for old collection") \
\
product(bool, PrintTenuringDistribution, false, \
"Print tenuring age information") \
From fc984ddd848e558a9bc281e46b30c7a97cd3942b Mon Sep 17 00:00:00 2001
From: Mikael Vidstedt
Date: Thu, 29 May 2014 16:01:13 -0700
Subject: [PATCH 03/76] 8044071: Print format/argument warnings
Reviewed-by: drchase, dholmes, lfoltan, twisti
---
hotspot/src/cpu/sparc/vm/compiledIC_sparc.cpp | 2 +-
hotspot/src/cpu/sparc/vm/frame_sparc.cpp | 3 ++-
.../src/cpu/sparc/vm/macroAssembler_sparc.cpp | 2 +-
hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp | 21 ++++++++++---------
.../sparc/vm/templateInterpreter_sparc.cpp | 18 ++++++++--------
.../src/cpu/sparc/vm/vtableStubs_sparc.cpp | 4 ++--
.../os_cpu/linux_sparc/vm/os_linux_sparc.cpp | 8 +++----
.../linux_sparc/vm/vm_version_linux_sparc.cpp | 2 +-
8 files changed, 31 insertions(+), 29 deletions(-)
diff --git a/hotspot/src/cpu/sparc/vm/compiledIC_sparc.cpp b/hotspot/src/cpu/sparc/vm/compiledIC_sparc.cpp
index 791331168d2..92d494fc0ca 100644
--- a/hotspot/src/cpu/sparc/vm/compiledIC_sparc.cpp
+++ b/hotspot/src/cpu/sparc/vm/compiledIC_sparc.cpp
@@ -135,7 +135,7 @@ void CompiledStaticCall::set_to_interpreted(methodHandle callee, address entry)
if (TraceICs) {
ResourceMark rm;
tty->print_cr("CompiledStaticCall@" INTPTR_FORMAT ": set_to_interpreted %s",
- instruction_address(),
+ p2i(instruction_address()),
callee->name_and_sig_as_C_string());
}
diff --git a/hotspot/src/cpu/sparc/vm/frame_sparc.cpp b/hotspot/src/cpu/sparc/vm/frame_sparc.cpp
index 29b37f006a5..2feb5eb0925 100644
--- a/hotspot/src/cpu/sparc/vm/frame_sparc.cpp
+++ b/hotspot/src/cpu/sparc/vm/frame_sparc.cpp
@@ -557,7 +557,8 @@ void frame::patch_pc(Thread* thread, address pc) {
// QQQ this assert is invalid (or too strong anyway) sice _pc could
// be original pc and frame could have the deopt pc.
// assert(_pc == *O7_addr() + pc_return_offset, "frame has wrong pc");
- tty->print_cr("patch_pc at address 0x%x [0x%x -> 0x%x] ", O7_addr(), _pc, pc);
+ tty->print_cr("patch_pc at address " INTPTR_FORMAT " [" INTPTR_FORMAT " -> " INTPTR_FORMAT "]",
+ p2i(O7_addr()), p2i(_pc), p2i(pc));
}
_cb = CodeCache::find_blob(pc);
*O7_addr() = pc - pc_return_offset;
diff --git a/hotspot/src/cpu/sparc/vm/macroAssembler_sparc.cpp b/hotspot/src/cpu/sparc/vm/macroAssembler_sparc.cpp
index d7396f68fbe..1f4cf5654c6 100644
--- a/hotspot/src/cpu/sparc/vm/macroAssembler_sparc.cpp
+++ b/hotspot/src/cpu/sparc/vm/macroAssembler_sparc.cpp
@@ -1202,7 +1202,7 @@ void RegistersForDebugging::print(outputStream* s) {
if ( j != last ) s->print(" - f%d", last);
s->print(" = %f", val);
s->fill_to(25);
- s->print_cr(" (0x%x)", val);
+ s->print_cr(" (0x%x)", *(int*)&val);
j = last + 1;
}
s->cr();
diff --git a/hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp b/hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp
index c15c3c0994f..3d2f531402c 100644
--- a/hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp
+++ b/hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp
@@ -78,7 +78,7 @@ void NativeInstruction::verify() {
}
void NativeInstruction::print() {
- tty->print_cr(INTPTR_FORMAT ": 0x%x", addr_at(0), long_at(0));
+ tty->print_cr(INTPTR_FORMAT ": 0x%x", p2i(addr_at(0)), long_at(0));
}
void NativeInstruction::set_long_at(int offset, int i) {
@@ -142,7 +142,7 @@ void NativeCall::verify() {
}
void NativeCall::print() {
- tty->print_cr(INTPTR_FORMAT ": call " INTPTR_FORMAT, instruction_address(), destination());
+ tty->print_cr(INTPTR_FORMAT ": call " INTPTR_FORMAT, p2i(instruction_address()), p2i(destination()));
}
@@ -271,7 +271,7 @@ bool NativeFarCall::is_call_at(address instr) {
}
void NativeFarCall::print() {
- tty->print_cr(INTPTR_FORMAT ": call " INTPTR_FORMAT, instruction_address(), destination());
+ tty->print_cr(INTPTR_FORMAT ": call " INTPTR_FORMAT, p2i(instruction_address()), p2i(destination()));
}
bool NativeFarCall::destination_is_compiled_verified_entry_point() {
@@ -324,7 +324,7 @@ void NativeMovConstReg::verify() {
void NativeMovConstReg::print() {
- tty->print_cr(INTPTR_FORMAT ": mov reg, " INTPTR_FORMAT, instruction_address(), data());
+ tty->print_cr(INTPTR_FORMAT ": mov reg, " INTPTR_FORMAT, p2i(instruction_address()), data());
}
@@ -446,7 +446,7 @@ void NativeMovConstRegPatching::verify() {
void NativeMovConstRegPatching::print() {
- tty->print_cr(INTPTR_FORMAT ": mov reg, " INTPTR_FORMAT, instruction_address(), data());
+ tty->print_cr(INTPTR_FORMAT ": mov reg, 0x%x", p2i(instruction_address()), data());
}
@@ -585,9 +585,10 @@ void NativeMovRegMem::verify() {
void NativeMovRegMem::print() {
if (is_immediate()) {
- tty->print_cr(INTPTR_FORMAT ": mov reg, [reg + %x]", instruction_address(), offset());
+ // offset is a signed 13-bit immediate, so casting it to int will not lose significant bits
+ tty->print_cr(INTPTR_FORMAT ": mov reg, [reg + %d]", p2i(instruction_address()), (int)offset());
} else {
- tty->print_cr(INTPTR_FORMAT ": mov reg, [reg + reg]", instruction_address());
+ tty->print_cr(INTPTR_FORMAT ": mov reg, [reg + reg]", p2i(instruction_address()));
}
}
@@ -730,9 +731,9 @@ void NativeMovRegMemPatching::verify() {
void NativeMovRegMemPatching::print() {
if (is_immediate()) {
- tty->print_cr(INTPTR_FORMAT ": mov reg, [reg + %x]", instruction_address(), offset());
+ tty->print_cr(INTPTR_FORMAT ": mov reg, [reg + %d]", p2i(instruction_address()), offset());
} else {
- tty->print_cr(INTPTR_FORMAT ": mov reg, [reg + reg]", instruction_address());
+ tty->print_cr(INTPTR_FORMAT ": mov reg, [reg + reg]", p2i(instruction_address()));
}
}
@@ -863,7 +864,7 @@ void NativeJump::verify() {
void NativeJump::print() {
- tty->print_cr(INTPTR_FORMAT ": jmpl reg, " INTPTR_FORMAT, instruction_address(), jump_destination());
+ tty->print_cr(INTPTR_FORMAT ": jmpl reg, " INTPTR_FORMAT, p2i(instruction_address()), p2i(jump_destination()));
}
diff --git a/hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp b/hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp
index 3c173f4d70f..c281e3bc005 100644
--- a/hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp
+++ b/hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp
@@ -1722,15 +1722,15 @@ void AbstractInterpreter::layout_activation(Method* method,
if (caller->is_interpreted_frame()) {
tty->print("interpreted ");
}
- tty->print_cr("caller fp=0x%x sp=0x%x", caller->fp(), caller->sp());
- tty->print_cr("save area = 0x%x, 0x%x", caller->sp(), caller->sp() + 16);
- tty->print_cr("save area = 0x%x, 0x%x", caller->fp(), caller->fp() + 16);
- tty->print_cr("interpreter fp=0x%x sp=0x%x", interpreter_frame->fp(), interpreter_frame->sp());
- tty->print_cr("save area = 0x%x, 0x%x", interpreter_frame->sp(), interpreter_frame->sp() + 16);
- tty->print_cr("save area = 0x%x, 0x%x", interpreter_frame->fp(), interpreter_frame->fp() + 16);
- tty->print_cr("Llocals = 0x%x", locals);
- tty->print_cr("Lesp = 0x%x", esp);
- tty->print_cr("Lmonitors = 0x%x", monitors);
+ tty->print_cr("caller fp=" INTPTR_FORMAT " sp=" INTPTR_FORMAT, p2i(caller->fp()), p2i(caller->sp()));
+ tty->print_cr("save area = " INTPTR_FORMAT ", " INTPTR_FORMAT, p2i(caller->sp()), p2i(caller->sp() + 16));
+ tty->print_cr("save area = " INTPTR_FORMAT ", " INTPTR_FORMAT, p2i(caller->fp()), p2i(caller->fp() + 16));
+ tty->print_cr("interpreter fp=" INTPTR_FORMAT ", " INTPTR_FORMAT, p2i(interpreter_frame->fp()), p2i(interpreter_frame->sp()));
+ tty->print_cr("save area = " INTPTR_FORMAT ", " INTPTR_FORMAT, p2i(interpreter_frame->sp()), p2i(interpreter_frame->sp() + 16));
+ tty->print_cr("save area = " INTPTR_FORMAT ", " INTPTR_FORMAT, p2i(interpreter_frame->fp()), p2i(interpreter_frame->fp() + 16));
+ tty->print_cr("Llocals = " INTPTR_FORMAT, p2i(locals));
+ tty->print_cr("Lesp = " INTPTR_FORMAT, p2i(esp));
+ tty->print_cr("Lmonitors = " INTPTR_FORMAT, p2i(monitors));
}
if (method->max_locals() > 0) {
diff --git a/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp b/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp
index cdbb57fbecd..6c0755bab32 100644
--- a/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp
+++ b/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp
@@ -111,7 +111,7 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
if (PrintMiscellaneous && (WizardMode || Verbose)) {
tty->print_cr("vtable #%d at "PTR_FORMAT"[%d] left over: %d",
- vtable_index, s->entry_point(),
+ vtable_index, p2i(s->entry_point()),
(int)(s->code_end() - s->entry_point()),
(int)(s->code_end() - __ pc()));
}
@@ -206,7 +206,7 @@ VtableStub* VtableStubs::create_itable_stub(int itable_index) {
if (PrintMiscellaneous && (WizardMode || Verbose)) {
tty->print_cr("itable #%d at "PTR_FORMAT"[%d] left over: %d",
- itable_index, s->entry_point(),
+ itable_index, p2i(s->entry_point()),
(int)(s->code_end() - s->entry_point()),
(int)(s->code_end() - __ pc()));
}
diff --git a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp
index f8f23122d4d..6e364f4087a 100644
--- a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp
+++ b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp
@@ -234,7 +234,7 @@ void os::print_context(outputStream *st, void *context) {
SIG_REGS(sc).u_regs[CON_G3],
SIG_REGS(sc).u_regs[CON_G4]);
st->print_cr(" G5=" INTPTR_FORMAT " G6=" INTPTR_FORMAT
- " G7=" INTPTR_FORMAT " Y=" INTPTR_FORMAT,
+ " G7=" INTPTR_FORMAT " Y=0x%x",
SIG_REGS(sc).u_regs[CON_G5],
SIG_REGS(sc).u_regs[CON_G6],
SIG_REGS(sc).u_regs[CON_G7],
@@ -285,7 +285,7 @@ void os::print_context(outputStream *st, void *context) {
st->cr();
st->cr();
- st->print_cr("Top of Stack: (sp=" PTR_FORMAT ")", sp);
+ st->print_cr("Top of Stack: (sp=" INTPTR_FORMAT ")", p2i(sp));
print_hex_dump(st, (address)sp, (address)(sp + 32), sizeof(intptr_t));
st->cr();
@@ -293,7 +293,7 @@ void os::print_context(outputStream *st, void *context) {
// point to garbage if entry point in an nmethod is corrupted. Leave
// this at the end, and hope for the best.
address pc = os::Linux::ucontext_get_pc(uc);
- st->print_cr("Instructions: (pc=" PTR_FORMAT ")", pc);
+ st->print_cr("Instructions: (pc=" INTPTR_FORMAT ")", p2i(pc));
print_hex_dump(st, pc - 32, pc + 32, sizeof(char));
}
@@ -453,7 +453,7 @@ inline static bool checkVerifyOops(address pc, address fault, address* stub) {
&& pc < MacroAssembler::_verify_oop_implicit_branch[1] ) {
*stub = MacroAssembler::_verify_oop_implicit_branch[2];
warning("fixed up memory fault in +VerifyOops at address "
- INTPTR_FORMAT, fault);
+ INTPTR_FORMAT, p2i(fault));
return true;
}
return false;
diff --git a/hotspot/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp b/hotspot/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp
index c3d244d987d..70dc8f0e5d8 100644
--- a/hotspot/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp
+++ b/hotspot/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp
@@ -36,7 +36,7 @@ static bool detect_niagara() {
}
while (!feof(fp)) {
- if (fscanf(fp, "cpu\t\t: %100[^\n]", &cpu) == 1) {
+ if (fscanf(fp, "cpu\t\t: %100[^\n]", cpu) == 1) {
if (strstr(cpu, "Niagara") != NULL) {
rv = true;
}
From a3b9ebba8d224e1281e32ed93155d69d6520f300 Mon Sep 17 00:00:00 2001
From: Albert Noll
Date: Fri, 30 May 2014 06:50:38 +0200
Subject: [PATCH 04/76] 8011646: SEGV in compiled code with loop predication
Remove control edge of load node to ensure that castPP removal sets the control edge correctly
Reviewed-by: kvn, roland
---
hotspot/src/share/vm/opto/library_call.cpp | 50 ++++++-------
.../intrinsics/hashcode/TestHashCode.java | 73 +++++++++++++++++++
2 files changed, 98 insertions(+), 25 deletions(-)
create mode 100644 hotspot/test/compiler/intrinsics/hashcode/TestHashCode.java
diff --git a/hotspot/src/share/vm/opto/library_call.cpp b/hotspot/src/share/vm/opto/library_call.cpp
index 5cf1188435a..8489fcf42c0 100644
--- a/hotspot/src/share/vm/opto/library_call.cpp
+++ b/hotspot/src/share/vm/opto/library_call.cpp
@@ -3985,8 +3985,11 @@ LibraryCallKit::generate_method_call(vmIntrinsics::ID method_id, bool is_virtual
}
-//------------------------------inline_native_hashcode--------------------
-// Build special case code for calls to hashCode on an object.
+/**
+ * Build special case code for calls to hashCode on an object. This call may
+ * be virtual (invokevirtual) or bound (invokespecial). For each case we generate
+ * slightly different code.
+ */
bool LibraryCallKit::inline_native_hashcode(bool is_virtual, bool is_static) {
assert(is_static == callee()->is_static(), "correct intrinsic selection");
assert(!(is_virtual && is_static), "either virtual, special, or static");
@@ -3994,11 +3997,9 @@ bool LibraryCallKit::inline_native_hashcode(bool is_virtual, bool is_static) {
enum { _slow_path = 1, _fast_path, _null_path, PATH_LIMIT };
RegionNode* result_reg = new(C) RegionNode(PATH_LIMIT);
- PhiNode* result_val = new(C) PhiNode(result_reg,
- TypeInt::INT);
+ PhiNode* result_val = new(C) PhiNode(result_reg, TypeInt::INT);
PhiNode* result_io = new(C) PhiNode(result_reg, Type::ABIO);
- PhiNode* result_mem = new(C) PhiNode(result_reg, Type::MEMORY,
- TypePtr::BOTTOM);
+ PhiNode* result_mem = new(C) PhiNode(result_reg, Type::MEMORY, TypePtr::BOTTOM);
Node* obj = NULL;
if (!is_static) {
// Check for hashing null object
@@ -4024,12 +4025,6 @@ bool LibraryCallKit::inline_native_hashcode(bool is_virtual, bool is_static) {
return true;
}
- // After null check, get the object's klass.
- Node* obj_klass = load_object_klass(obj);
-
- // This call may be virtual (invokevirtual) or bound (invokespecial).
- // For each case we generate slightly different code.
-
// We only go to the fast case code if we pass a number of guards. The
// paths which do not pass are accumulated in the slow_region.
RegionNode* slow_region = new (C) RegionNode(1);
@@ -4042,19 +4037,24 @@ bool LibraryCallKit::inline_native_hashcode(bool is_virtual, bool is_static) {
// guard for non-virtual calls -- the caller is known to be the native
// Object hashCode().
if (is_virtual) {
+ // After null check, get the object's klass.
+ Node* obj_klass = load_object_klass(obj);
generate_virtual_guard(obj_klass, slow_region);
}
// Get the header out of the object, use LoadMarkNode when available
Node* header_addr = basic_plus_adr(obj, oopDesc::mark_offset_in_bytes());
- Node* header = make_load(control(), header_addr, TypeX_X, TypeX_X->basic_type(), MemNode::unordered);
+ // The control of the load must be NULL. Otherwise, the load can move before
+ // the null check after castPP removal.
+ Node* no_ctrl = NULL;
+ Node* header = make_load(no_ctrl, header_addr, TypeX_X, TypeX_X->basic_type(), MemNode::unordered);
// Test the header to see if it is unlocked.
- Node *lock_mask = _gvn.MakeConX(markOopDesc::biased_lock_mask_in_place);
- Node *lmasked_header = _gvn.transform(new (C) AndXNode(header, lock_mask));
- Node *unlocked_val = _gvn.MakeConX(markOopDesc::unlocked_value);
- Node *chk_unlocked = _gvn.transform(new (C) CmpXNode( lmasked_header, unlocked_val));
- Node *test_unlocked = _gvn.transform(new (C) BoolNode( chk_unlocked, BoolTest::ne));
+ Node* lock_mask = _gvn.MakeConX(markOopDesc::biased_lock_mask_in_place);
+ Node* lmasked_header = _gvn.transform(new (C) AndXNode(header, lock_mask));
+ Node* unlocked_val = _gvn.MakeConX(markOopDesc::unlocked_value);
+ Node* chk_unlocked = _gvn.transform(new (C) CmpXNode( lmasked_header, unlocked_val));
+ Node* test_unlocked = _gvn.transform(new (C) BoolNode( chk_unlocked, BoolTest::ne));
generate_slow_guard(test_unlocked, slow_region);
@@ -4062,19 +4062,19 @@ bool LibraryCallKit::inline_native_hashcode(bool is_virtual, bool is_static) {
// We depend on hash_mask being at most 32 bits and avoid the use of
// hash_mask_in_place because it could be larger than 32 bits in a 64-bit
// vm: see markOop.hpp.
- Node *hash_mask = _gvn.intcon(markOopDesc::hash_mask);
- Node *hash_shift = _gvn.intcon(markOopDesc::hash_shift);
- Node *hshifted_header= _gvn.transform(new (C) URShiftXNode(header, hash_shift));
+ Node* hash_mask = _gvn.intcon(markOopDesc::hash_mask);
+ Node* hash_shift = _gvn.intcon(markOopDesc::hash_shift);
+ Node* hshifted_header= _gvn.transform(new (C) URShiftXNode(header, hash_shift));
// This hack lets the hash bits live anywhere in the mark object now, as long
// as the shift drops the relevant bits into the low 32 bits. Note that
// Java spec says that HashCode is an int so there's no point in capturing
// an 'X'-sized hashcode (32 in 32-bit build or 64 in 64-bit build).
hshifted_header = ConvX2I(hshifted_header);
- Node *hash_val = _gvn.transform(new (C) AndINode(hshifted_header, hash_mask));
+ Node* hash_val = _gvn.transform(new (C) AndINode(hshifted_header, hash_mask));
- Node *no_hash_val = _gvn.intcon(markOopDesc::no_hash);
- Node *chk_assigned = _gvn.transform(new (C) CmpINode( hash_val, no_hash_val));
- Node *test_assigned = _gvn.transform(new (C) BoolNode( chk_assigned, BoolTest::eq));
+ Node* no_hash_val = _gvn.intcon(markOopDesc::no_hash);
+ Node* chk_assigned = _gvn.transform(new (C) CmpINode( hash_val, no_hash_val));
+ Node* test_assigned = _gvn.transform(new (C) BoolNode( chk_assigned, BoolTest::eq));
generate_slow_guard(test_assigned, slow_region);
diff --git a/hotspot/test/compiler/intrinsics/hashcode/TestHashCode.java b/hotspot/test/compiler/intrinsics/hashcode/TestHashCode.java
new file mode 100644
index 00000000000..f7d5450b351
--- /dev/null
+++ b/hotspot/test/compiler/intrinsics/hashcode/TestHashCode.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8011646
+ * @summary SEGV in compiled code with loop predication
+ * @run main/othervm -XX:-TieredCompilation -XX:CompileOnly=TestHashCode.m1,Object.hashCode TestHashCode
+ *
+ */
+
+public class TestHashCode {
+ static class A {
+ int i;
+ }
+
+ static class B extends A {
+ }
+
+ static boolean crash = false;
+
+ static A m2() {
+ if (crash) {
+ return null;
+ }
+ return new A();
+ }
+
+ static int m1(A aa) {
+ int res = 0;
+ for (int i = 0; i < 10; i++) {
+ A a = m2();
+ int j = a.i;
+ if (aa instanceof B) {
+ }
+ res += a.hashCode();
+ }
+ return res;
+ }
+
+ public static void main(String[] args) {
+ A a = new A();
+ for (int i = 0; i < 20000; i++) {
+ m1(a);
+ }
+ crash = true;
+ try {
+ m1(a);
+ } catch (NullPointerException e) {
+ System.out.println("Test passed");
+ }
+ }
+}
From 1ed4c8394859f6c36e165c4f59a6b5c9fbd793ee Mon Sep 17 00:00:00 2001
From: Tobias Hartmann
Date: Fri, 30 May 2014 09:26:48 +0200
Subject: [PATCH 05/76] 8021775: compiler/8009761/Test8009761.java "Failed:
init recursive calls: 51. After deopt 50"
Reimplemented the test using the Whitebox API to deterministically trigger compilation and deoptimization. Now allowing number of recursive calls to vary by 1.
Reviewed-by: twisti, roland, iignatyev
---
hotspot/test/TEST.groups | 1 +
.../test/compiler/8009761/Test8009761.java | 69 +++++++++++++++----
2 files changed, 56 insertions(+), 14 deletions(-)
diff --git a/hotspot/test/TEST.groups b/hotspot/test/TEST.groups
index cd616303ede..8d7427dd313 100644
--- a/hotspot/test/TEST.groups
+++ b/hotspot/test/TEST.groups
@@ -115,6 +115,7 @@ compact3 = \
# Tests that require compact3 API's
#
needs_compact3 = \
+ compiler/8009761/Test8009761.java \
compiler/whitebox/DeoptimizeMethodTest.java \
compiler/whitebox/SetForceInlineMethodTest.java \
compiler/whitebox/SetDontInlineMethodTest.java \
diff --git a/hotspot/test/compiler/8009761/Test8009761.java b/hotspot/test/compiler/8009761/Test8009761.java
index 401458b6b92..39a25748348 100644
--- a/hotspot/test/compiler/8009761/Test8009761.java
+++ b/hotspot/test/compiler/8009761/Test8009761.java
@@ -21,19 +21,27 @@
* questions.
*/
+import com.sun.management.HotSpotDiagnosticMXBean;
+import com.sun.management.VMOption;
+import sun.hotspot.WhiteBox;
+import sun.management.ManagementFactoryHelper;
+
+import java.lang.reflect.Method;
+
/*
* @test
* @bug 8009761
+ * @library /testlibrary /testlibrary/whitebox
* @summary Deoptimization on sparc doesn't set Llast_SP correctly in the interpreter frames it creates
- * @run main/othervm -XX:CompileCommand=exclude,Test8009761::m2 -XX:-UseOnStackReplacement -XX:-BackgroundCompilation -Xss256K Test8009761
- *
+ * @build Test8009761
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=exclude,Test8009761::m2 -XX:-UseOnStackReplacement -XX:-BackgroundCompilation -Xss256K Test8009761
*/
-
public class Test8009761 {
- static class UnloadedClass {
- volatile int i;
- }
+ private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox();
+ private static int COMP_LEVEL_FULL_OPTIMIZATION = 4;
+ private static Method m3 = null;
static Object m1(boolean deopt) {
// When running interpreted, on sparc, the caller's stack is
@@ -142,9 +150,11 @@ public class Test8009761 {
ll508, ll509, ll510, ll511;
if (deopt) {
- UnloadedClass res = new UnloadedClass(); // sufficient to force deopt with c2 but not c1
- res.i = 0; // forces deopt with c1
- return res;
+ // Force deoptimization of m3
+ WHITE_BOX.deoptimizeMethod(m3);
+ if(WHITE_BOX.isMethodCompiled(m3)) {
+ throw new RuntimeException(m3 + " not deoptimized");
+ }
}
return null;
}
@@ -225,6 +235,18 @@ public class Test8009761 {
}
static public void main(String[] args) {
+ // Make sure background compilation is disabled
+ if (backgroundCompilationEnabled()) {
+ throw new RuntimeException("Background compilation enabled");
+ }
+
+ try {
+ // Get Method object for m3
+ m3 = Test8009761.class.getDeclaredMethod("m3", boolean.class, boolean.class);
+ } catch (NoSuchMethodException | SecurityException ex) {
+ throw new RuntimeException("Failed to retrieve method m3");
+ }
+
int c1;
// Call m2 from m3 recursively until stack overflow. Count the number of recursive calls.
try {
@@ -232,10 +254,14 @@ public class Test8009761 {
} catch(StackOverflowError soe) {
}
c1 = count;
+
// Force the compilation of m3() that will inline m1()
- for (int i = 0; i < 20000; i++) {
- m3(false, false);
+ WHITE_BOX.enqueueMethodForCompilation(m3, COMP_LEVEL_FULL_OPTIMIZATION);
+ // Because background compilation is disabled, method should now be compiled
+ if(!WHITE_BOX.isMethodCompiled(m3)) {
+ throw new RuntimeException(m3 + " not compiled");
}
+
count = 0;
// Force deoptimization of m3() in m1(), then return from m1()
// to m3(), call recursively m2(). If deoptimization correctly
@@ -245,11 +271,26 @@ public class Test8009761 {
m3(false, true);
} catch(StackOverflowError soe) {
}
- if (c1 != count) {
- System.out.println("Failed: init recursive calls: " + c1 + ". After deopt " + count);
- System.exit(97);
+ // Allow number of recursive calls to vary by 1
+ if ((c1 < (count - 1)) || (c1 > (count + 1))) {
+ throw new RuntimeException("Failed: init recursive calls: " + c1 + ". After deopt " + count);
} else {
System.out.println("PASSED " + c1);
}
}
+
+ /**
+ * Checks if background compilation (-XX:+BackgroundCompilation) is enabled.
+ * @return True if background compilation is enabled, false otherwise
+ */
+ private static boolean backgroundCompilationEnabled() {
+ HotSpotDiagnosticMXBean diagnostic = ManagementFactoryHelper.getDiagnosticMXBean();
+ VMOption backgroundCompilation;
+ try {
+ backgroundCompilation = diagnostic.getVMOption("BackgroundCompilation");
+ } catch (IllegalArgumentException e) {
+ return false;
+ }
+ return Boolean.valueOf(backgroundCompilation.getValue());
+ }
}
From f99eed3f243221a897dbfd9ae1caf07992a493ec Mon Sep 17 00:00:00 2001
From: Igor Ignatyev
Date: Fri, 30 May 2014 17:20:48 +0400
Subject: [PATCH 06/76] 8038756: new WB API :: get/setVMFlag
Reviewed-by: vlivanov, sla
---
hotspot/src/share/vm/prims/whitebox.cpp | 180 +++++++++++++++++-
hotspot/src/share/vm/runtime/globals.cpp | 24 +--
hotspot/src/share/vm/runtime/globals.hpp | 48 ++---
.../whitebox/sun/hotspot/WhiteBox.java | 15 +-
.../whitebox/vm_flags/BooleanTest.java | 87 +++++++++
.../whitebox/vm_flags/DoubleTest.java | 47 +++++
.../whitebox/vm_flags/IntxTest.java | 46 +++++
.../whitebox/vm_flags/StringTest.java | 45 +++++
.../whitebox/vm_flags/Uint64Test.java | 46 +++++
.../whitebox/vm_flags/UintxTest.java | 51 +++++
.../whitebox/vm_flags/VmFlagTest.java | 115 +++++++++++
11 files changed, 661 insertions(+), 43 deletions(-)
create mode 100644 hotspot/test/testlibrary_tests/whitebox/vm_flags/BooleanTest.java
create mode 100644 hotspot/test/testlibrary_tests/whitebox/vm_flags/DoubleTest.java
create mode 100644 hotspot/test/testlibrary_tests/whitebox/vm_flags/IntxTest.java
create mode 100644 hotspot/test/testlibrary_tests/whitebox/vm_flags/StringTest.java
create mode 100644 hotspot/test/testlibrary_tests/whitebox/vm_flags/Uint64Test.java
create mode 100644 hotspot/test/testlibrary_tests/whitebox/vm_flags/UintxTest.java
create mode 100644 hotspot/test/testlibrary_tests/whitebox/vm_flags/VmFlagTest.java
diff --git a/hotspot/src/share/vm/prims/whitebox.cpp b/hotspot/src/share/vm/prims/whitebox.cpp
index a68ed456899..15f316aa6c2 100644
--- a/hotspot/src/share/vm/prims/whitebox.cpp
+++ b/hotspot/src/share/vm/prims/whitebox.cpp
@@ -503,6 +503,159 @@ WB_ENTRY(void, WB_ClearMethodState(JNIEnv* env, jobject o, jobject method))
}
WB_END
+template
+static bool GetVMFlag(JavaThread* thread, JNIEnv* env, jstring name, T* value, bool (*TAt)(const char*, T*)) {
+ if (name == NULL) {
+ return false;
+ }
+ ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
+ const char* flag_name = env->GetStringUTFChars(name, NULL);
+ bool result = (*TAt)(flag_name, value);
+ env->ReleaseStringUTFChars(name, flag_name);
+ return result;
+}
+
+template
+static bool SetVMFlag(JavaThread* thread, JNIEnv* env, jstring name, T* value, bool (*TAtPut)(const char*, T*, Flag::Flags)) {
+ if (name == NULL) {
+ return false;
+ }
+ ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
+ const char* flag_name = env->GetStringUTFChars(name, NULL);
+ bool result = (*TAtPut)(flag_name, value, Flag::INTERNAL);
+ env->ReleaseStringUTFChars(name, flag_name);
+ return result;
+}
+
+template
+static jobject box(JavaThread* thread, JNIEnv* env, Symbol* name, Symbol* sig, T value) {
+ ResourceMark rm(thread);
+ jclass clazz = env->FindClass(name->as_C_string());
+ CHECK_JNI_EXCEPTION_(env, NULL);
+ jmethodID methodID = env->GetStaticMethodID(clazz,
+ vmSymbols::valueOf_name()->as_C_string(),
+ sig->as_C_string());
+ CHECK_JNI_EXCEPTION_(env, NULL);
+ jobject result = env->CallStaticObjectMethod(clazz, methodID, value);
+ CHECK_JNI_EXCEPTION_(env, NULL);
+ return result;
+}
+
+static jobject booleanBox(JavaThread* thread, JNIEnv* env, jboolean value) {
+ return box(thread, env, vmSymbols::java_lang_Boolean(), vmSymbols::Boolean_valueOf_signature(), value);
+}
+static jobject integerBox(JavaThread* thread, JNIEnv* env, jint value) {
+ return box(thread, env, vmSymbols::java_lang_Integer(), vmSymbols::Integer_valueOf_signature(), value);
+}
+static jobject longBox(JavaThread* thread, JNIEnv* env, jlong value) {
+ return box(thread, env, vmSymbols::java_lang_Long(), vmSymbols::Long_valueOf_signature(), value);
+}
+/* static jobject floatBox(JavaThread* thread, JNIEnv* env, jfloat value) {
+ return box(thread, env, vmSymbols::java_lang_Float(), vmSymbols::Float_valueOf_signature(), value);
+}*/
+static jobject doubleBox(JavaThread* thread, JNIEnv* env, jdouble value) {
+ return box(thread, env, vmSymbols::java_lang_Double(), vmSymbols::Double_valueOf_signature(), value);
+}
+
+WB_ENTRY(jobject, WB_GetBooleanVMFlag(JNIEnv* env, jobject o, jstring name))
+ bool result;
+ if (GetVMFlag (thread, env, name, &result, &CommandLineFlags::boolAt)) {
+ ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
+ return booleanBox(thread, env, result);
+ }
+ return NULL;
+WB_END
+
+WB_ENTRY(jobject, WB_GetIntxVMFlag(JNIEnv* env, jobject o, jstring name))
+ intx result;
+ if (GetVMFlag (thread, env, name, &result, &CommandLineFlags::intxAt)) {
+ ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
+ return longBox(thread, env, result);
+ }
+ return NULL;
+WB_END
+
+WB_ENTRY(jobject, WB_GetUintxVMFlag(JNIEnv* env, jobject o, jstring name))
+ uintx result;
+ if (GetVMFlag (thread, env, name, &result, &CommandLineFlags::uintxAt)) {
+ ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
+ return longBox(thread, env, result);
+ }
+ return NULL;
+WB_END
+
+WB_ENTRY(jobject, WB_GetUint64VMFlag(JNIEnv* env, jobject o, jstring name))
+ uint64_t result;
+ if (GetVMFlag (thread, env, name, &result, &CommandLineFlags::uint64_tAt)) {
+ ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
+ return longBox(thread, env, result);
+ }
+ return NULL;
+WB_END
+
+WB_ENTRY(jobject, WB_GetDoubleVMFlag(JNIEnv* env, jobject o, jstring name))
+ double result;
+ if (GetVMFlag (thread, env, name, &result, &CommandLineFlags::doubleAt)) {
+ ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
+ return doubleBox(thread, env, result);
+ }
+ return NULL;
+WB_END
+
+WB_ENTRY(jstring, WB_GetStringVMFlag(JNIEnv* env, jobject o, jstring name))
+ ccstr ccstrResult;
+ if (GetVMFlag (thread, env, name, &ccstrResult, &CommandLineFlags::ccstrAt)) {
+ ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
+ jstring result = env->NewStringUTF(ccstrResult);
+ CHECK_JNI_EXCEPTION_(env, NULL);
+ return result;
+ }
+ return NULL;
+WB_END
+
+WB_ENTRY(void, WB_SetBooleanVMFlag(JNIEnv* env, jobject o, jstring name, jboolean value))
+ bool result = value == JNI_TRUE ? true : false;
+ SetVMFlag (thread, env, name, &result, &CommandLineFlags::boolAtPut);
+WB_END
+
+WB_ENTRY(void, WB_SetIntxVMFlag(JNIEnv* env, jobject o, jstring name, jlong value))
+ intx result = value;
+ SetVMFlag (thread, env, name, &result, &CommandLineFlags::intxAtPut);
+WB_END
+
+WB_ENTRY(void, WB_SetUintxVMFlag(JNIEnv* env, jobject o, jstring name, jlong value))
+ uintx result = value;
+ SetVMFlag (thread, env, name, &result, &CommandLineFlags::uintxAtPut);
+WB_END
+
+WB_ENTRY(void, WB_SetUint64VMFlag(JNIEnv* env, jobject o, jstring name, jlong value))
+ uint64_t result = value;
+ SetVMFlag (thread, env, name, &result, &CommandLineFlags::uint64_tAtPut);
+WB_END
+
+WB_ENTRY(void, WB_SetDoubleVMFlag(JNIEnv* env, jobject o, jstring name, jdouble value))
+ double result = value;
+ SetVMFlag (thread, env, name, &result, &CommandLineFlags::doubleAtPut);
+WB_END
+
+WB_ENTRY(void, WB_SetStringVMFlag(JNIEnv* env, jobject o, jstring name, jstring value))
+ ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
+ const char* ccstrValue = (value == NULL) ? NULL : env->GetStringUTFChars(value, NULL);
+ ccstr ccstrResult = ccstrValue;
+ bool needFree;
+ {
+ ThreadInVMfromNative ttvfn(thread); // back to VM
+ needFree = SetVMFlag (thread, env, name, &ccstrResult, &CommandLineFlags::ccstrAtPut);
+ }
+ if (value != NULL) {
+ env->ReleaseStringUTFChars(value, ccstrValue);
+ }
+ if (needFree) {
+ FREE_C_HEAP_ARRAY(char, ccstrResult, mtInternal);
+ }
+WB_END
+
+
WB_ENTRY(jboolean, WB_IsInStringTable(JNIEnv* env, jobject o, jstring javaString))
ResourceMark rm(THREAD);
int len;
@@ -561,11 +714,7 @@ WB_ENTRY(jobjectArray, WB_GetNMethod(JNIEnv* env, jobject o, jobject method, jbo
return result;
}
- clazz = env->FindClass(vmSymbols::java_lang_Integer()->as_C_string());
- CHECK_JNI_EXCEPTION_(env, NULL);
- jmethodID constructor = env->GetMethodID(clazz, vmSymbols::object_initializer_name()->as_C_string(), vmSymbols::int_void_signature()->as_C_string());
- CHECK_JNI_EXCEPTION_(env, NULL);
- jobject obj = env->NewObject(clazz, constructor, code->comp_level());
+ jobject obj = integerBox(thread, env, code->comp_level());
CHECK_JNI_EXCEPTION_(env, NULL);
env->SetObjectArrayElement(result, 0, obj);
@@ -695,7 +844,26 @@ static JNINativeMethod methods[] = {
CC"(Ljava/lang/reflect/Executable;II)Z", (void*)&WB_EnqueueMethodForCompilation},
{CC"clearMethodState",
CC"(Ljava/lang/reflect/Executable;)V", (void*)&WB_ClearMethodState},
- {CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable },
+ {CC"setBooleanVMFlag", CC"(Ljava/lang/String;Z)V",(void*)&WB_SetBooleanVMFlag},
+ {CC"setIntxVMFlag", CC"(Ljava/lang/String;J)V",(void*)&WB_SetIntxVMFlag},
+ {CC"setUintxVMFlag", CC"(Ljava/lang/String;J)V",(void*)&WB_SetUintxVMFlag},
+ {CC"setUint64VMFlag", CC"(Ljava/lang/String;J)V",(void*)&WB_SetUint64VMFlag},
+ {CC"setDoubleVMFlag", CC"(Ljava/lang/String;D)V",(void*)&WB_SetDoubleVMFlag},
+ {CC"setStringVMFlag", CC"(Ljava/lang/String;Ljava/lang/String;)V",
+ (void*)&WB_SetStringVMFlag},
+ {CC"getBooleanVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Boolean;",
+ (void*)&WB_GetBooleanVMFlag},
+ {CC"getIntxVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;",
+ (void*)&WB_GetIntxVMFlag},
+ {CC"getUintxVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;",
+ (void*)&WB_GetUintxVMFlag},
+ {CC"getUint64VMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;",
+ (void*)&WB_GetUint64VMFlag},
+ {CC"getDoubleVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Double;",
+ (void*)&WB_GetDoubleVMFlag},
+ {CC"getStringVMFlag", CC"(Ljava/lang/String;)Ljava/lang/String;",
+ (void*)&WB_GetStringVMFlag},
+ {CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable },
{CC"fullGC", CC"()V", (void*)&WB_FullGC },
{CC"readReservedMemory", CC"()V", (void*)&WB_ReadReservedMemory },
{CC"getCPUFeatures", CC"()Ljava/lang/String;", (void*)&WB_GetCPUFeatures },
diff --git a/hotspot/src/share/vm/runtime/globals.cpp b/hotspot/src/share/vm/runtime/globals.cpp
index 05daec54cf8..928f7134e14 100644
--- a/hotspot/src/share/vm/runtime/globals.cpp
+++ b/hotspot/src/share/vm/runtime/globals.cpp
@@ -611,7 +611,7 @@ static void trace_flag_changed(const char* name, const T old_value, const T new_
e.commit();
}
-bool CommandLineFlags::boolAt(char* name, size_t len, bool* value) {
+bool CommandLineFlags::boolAt(const char* name, size_t len, bool* value) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_bool()) return false;
@@ -619,7 +619,7 @@ bool CommandLineFlags::boolAt(char* name, size_t len, bool* value) {
return true;
}
-bool CommandLineFlags::boolAtPut(char* name, size_t len, bool* value, Flag::Flags origin) {
+bool CommandLineFlags::boolAtPut(const char* name, size_t len, bool* value, Flag::Flags origin) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_bool()) return false;
@@ -639,7 +639,7 @@ void CommandLineFlagsEx::boolAtPut(CommandLineFlagWithType flag, bool value, Fla
faddr->set_origin(origin);
}
-bool CommandLineFlags::intxAt(char* name, size_t len, intx* value) {
+bool CommandLineFlags::intxAt(const char* name, size_t len, intx* value) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_intx()) return false;
@@ -647,7 +647,7 @@ bool CommandLineFlags::intxAt(char* name, size_t len, intx* value) {
return true;
}
-bool CommandLineFlags::intxAtPut(char* name, size_t len, intx* value, Flag::Flags origin) {
+bool CommandLineFlags::intxAtPut(const char* name, size_t len, intx* value, Flag::Flags origin) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_intx()) return false;
@@ -667,7 +667,7 @@ void CommandLineFlagsEx::intxAtPut(CommandLineFlagWithType flag, intx value, Fla
faddr->set_origin(origin);
}
-bool CommandLineFlags::uintxAt(char* name, size_t len, uintx* value) {
+bool CommandLineFlags::uintxAt(const char* name, size_t len, uintx* value) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_uintx()) return false;
@@ -675,7 +675,7 @@ bool CommandLineFlags::uintxAt(char* name, size_t len, uintx* value) {
return true;
}
-bool CommandLineFlags::uintxAtPut(char* name, size_t len, uintx* value, Flag::Flags origin) {
+bool CommandLineFlags::uintxAtPut(const char* name, size_t len, uintx* value, Flag::Flags origin) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_uintx()) return false;
@@ -695,7 +695,7 @@ void CommandLineFlagsEx::uintxAtPut(CommandLineFlagWithType flag, uintx value, F
faddr->set_origin(origin);
}
-bool CommandLineFlags::uint64_tAt(char* name, size_t len, uint64_t* value) {
+bool CommandLineFlags::uint64_tAt(const char* name, size_t len, uint64_t* value) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_uint64_t()) return false;
@@ -703,7 +703,7 @@ bool CommandLineFlags::uint64_tAt(char* name, size_t len, uint64_t* value) {
return true;
}
-bool CommandLineFlags::uint64_tAtPut(char* name, size_t len, uint64_t* value, Flag::Flags origin) {
+bool CommandLineFlags::uint64_tAtPut(const char* name, size_t len, uint64_t* value, Flag::Flags origin) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_uint64_t()) return false;
@@ -723,7 +723,7 @@ void CommandLineFlagsEx::uint64_tAtPut(CommandLineFlagWithType flag, uint64_t va
faddr->set_origin(origin);
}
-bool CommandLineFlags::doubleAt(char* name, size_t len, double* value) {
+bool CommandLineFlags::doubleAt(const char* name, size_t len, double* value) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_double()) return false;
@@ -731,7 +731,7 @@ bool CommandLineFlags::doubleAt(char* name, size_t len, double* value) {
return true;
}
-bool CommandLineFlags::doubleAtPut(char* name, size_t len, double* value, Flag::Flags origin) {
+bool CommandLineFlags::doubleAtPut(const char* name, size_t len, double* value, Flag::Flags origin) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_double()) return false;
@@ -751,7 +751,7 @@ void CommandLineFlagsEx::doubleAtPut(CommandLineFlagWithType flag, double value,
faddr->set_origin(origin);
}
-bool CommandLineFlags::ccstrAt(char* name, size_t len, ccstr* value) {
+bool CommandLineFlags::ccstrAt(const char* name, size_t len, ccstr* value) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_ccstr()) return false;
@@ -759,7 +759,7 @@ bool CommandLineFlags::ccstrAt(char* name, size_t len, ccstr* value) {
return true;
}
-bool CommandLineFlags::ccstrAtPut(char* name, size_t len, ccstr* value, Flag::Flags origin) {
+bool CommandLineFlags::ccstrAtPut(const char* name, size_t len, ccstr* value, Flag::Flags origin) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_ccstr()) return false;
diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp
index 9952ad96bb7..b0a342c1352 100644
--- a/hotspot/src/share/vm/runtime/globals.hpp
+++ b/hotspot/src/share/vm/runtime/globals.hpp
@@ -362,37 +362,37 @@ class DoubleFlagSetting {
class CommandLineFlags {
public:
- static bool boolAt(char* name, size_t len, bool* value);
- static bool boolAt(char* name, bool* value) { return boolAt(name, strlen(name), value); }
- static bool boolAtPut(char* name, size_t len, bool* value, Flag::Flags origin);
- static bool boolAtPut(char* name, bool* value, Flag::Flags origin) { return boolAtPut(name, strlen(name), value, origin); }
+ static bool boolAt(const char* name, size_t len, bool* value);
+ static bool boolAt(const char* name, bool* value) { return boolAt(name, strlen(name), value); }
+ static bool boolAtPut(const char* name, size_t len, bool* value, Flag::Flags origin);
+ static bool boolAtPut(const char* name, bool* value, Flag::Flags origin) { return boolAtPut(name, strlen(name), value, origin); }
- static bool intxAt(char* name, size_t len, intx* value);
- static bool intxAt(char* name, intx* value) { return intxAt(name, strlen(name), value); }
- static bool intxAtPut(char* name, size_t len, intx* value, Flag::Flags origin);
- static bool intxAtPut(char* name, intx* value, Flag::Flags origin) { return intxAtPut(name, strlen(name), value, origin); }
+ static bool intxAt(const char* name, size_t len, intx* value);
+ static bool intxAt(const char* name, intx* value) { return intxAt(name, strlen(name), value); }
+ static bool intxAtPut(const char* name, size_t len, intx* value, Flag::Flags origin);
+ static bool intxAtPut(const char* name, intx* value, Flag::Flags origin) { return intxAtPut(name, strlen(name), value, origin); }
- static bool uintxAt(char* name, size_t len, uintx* value);
- static bool uintxAt(char* name, uintx* value) { return uintxAt(name, strlen(name), value); }
- static bool uintxAtPut(char* name, size_t len, uintx* value, Flag::Flags origin);
- static bool uintxAtPut(char* name, uintx* value, Flag::Flags origin) { return uintxAtPut(name, strlen(name), value, origin); }
+ static bool uintxAt(const char* name, size_t len, uintx* value);
+ static bool uintxAt(const char* name, uintx* value) { return uintxAt(name, strlen(name), value); }
+ static bool uintxAtPut(const char* name, size_t len, uintx* value, Flag::Flags origin);
+ static bool uintxAtPut(const char* name, uintx* value, Flag::Flags origin) { return uintxAtPut(name, strlen(name), value, origin); }
- static bool uint64_tAt(char* name, size_t len, uint64_t* value);
- static bool uint64_tAt(char* name, uint64_t* value) { return uint64_tAt(name, strlen(name), value); }
- static bool uint64_tAtPut(char* name, size_t len, uint64_t* value, Flag::Flags origin);
- static bool uint64_tAtPut(char* name, uint64_t* value, Flag::Flags origin) { return uint64_tAtPut(name, strlen(name), value, origin); }
+ static bool uint64_tAt(const char* name, size_t len, uint64_t* value);
+ static bool uint64_tAt(const char* name, uint64_t* value) { return uint64_tAt(name, strlen(name), value); }
+ static bool uint64_tAtPut(const char* name, size_t len, uint64_t* value, Flag::Flags origin);
+ static bool uint64_tAtPut(const char* name, uint64_t* value, Flag::Flags origin) { return uint64_tAtPut(name, strlen(name), value, origin); }
- static bool doubleAt(char* name, size_t len, double* value);
- static bool doubleAt(char* name, double* value) { return doubleAt(name, strlen(name), value); }
- static bool doubleAtPut(char* name, size_t len, double* value, Flag::Flags origin);
- static bool doubleAtPut(char* name, double* value, Flag::Flags origin) { return doubleAtPut(name, strlen(name), value, origin); }
+ static bool doubleAt(const char* name, size_t len, double* value);
+ static bool doubleAt(const char* name, double* value) { return doubleAt(name, strlen(name), value); }
+ static bool doubleAtPut(const char* name, size_t len, double* value, Flag::Flags origin);
+ static bool doubleAtPut(const char* name, double* value, Flag::Flags origin) { return doubleAtPut(name, strlen(name), value, origin); }
- static bool ccstrAt(char* name, size_t len, ccstr* value);
- static bool ccstrAt(char* name, ccstr* value) { return ccstrAt(name, strlen(name), value); }
+ static bool ccstrAt(const char* name, size_t len, ccstr* value);
+ static bool ccstrAt(const char* name, ccstr* value) { return ccstrAt(name, strlen(name), value); }
// Contract: Flag will make private copy of the incoming value.
// Outgoing value is always malloc-ed, and caller MUST call free.
- static bool ccstrAtPut(char* name, size_t len, ccstr* value, Flag::Flags origin);
- static bool ccstrAtPut(char* name, ccstr* value, Flag::Flags origin) { return ccstrAtPut(name, strlen(name), value, origin); }
+ static bool ccstrAtPut(const char* name, size_t len, ccstr* value, Flag::Flags origin);
+ static bool ccstrAtPut(const char* name, ccstr* value, Flag::Flags origin) { return ccstrAtPut(name, strlen(name), value, origin); }
// Returns false if name is not a command line flag.
static bool wasSetOnCmdline(const char* name, bool* value);
diff --git a/hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java b/hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java
index a959900459a..8c817182e4c 100644
--- a/hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java
+++ b/hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java
@@ -129,7 +129,7 @@ public class WhiteBox {
}
public native int getCompileQueueSize(int compLevel);
public native boolean testSetForceInlineMethod(Executable method, boolean value);
- public boolean enqueueMethodForCompilation(Executable method, int compLevel) {
+ public boolean enqueueMethodForCompilation(Executable method, int compLevel) {
return enqueueMethodForCompilation(method, compLevel, -1 /*InvocationEntryBci*/);
}
public native boolean enqueueMethodForCompilation(Executable method, int compLevel, int entry_bci);
@@ -156,4 +156,17 @@ public class WhiteBox {
// CPU features
public native String getCPUFeatures();
+ // VM flags
+ public native void setBooleanVMFlag(String name, boolean value);
+ public native void setIntxVMFlag(String name, long value);
+ public native void setUintxVMFlag(String name, long value);
+ public native void setUint64VMFlag(String name, long value);
+ public native void setStringVMFlag(String name, String value);
+ public native void setDoubleVMFlag(String name, double value);
+ public native Boolean getBooleanVMFlag(String name);
+ public native Long getIntxVMFlag(String name);
+ public native Long getUintxVMFlag(String name);
+ public native Long getUint64VMFlag(String name);
+ public native String getStringVMFlag(String name);
+ public native Double getDoubleVMFlag(String name);
}
diff --git a/hotspot/test/testlibrary_tests/whitebox/vm_flags/BooleanTest.java b/hotspot/test/testlibrary_tests/whitebox/vm_flags/BooleanTest.java
new file mode 100644
index 00000000000..cf313c37962
--- /dev/null
+++ b/hotspot/test/testlibrary_tests/whitebox/vm_flags/BooleanTest.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test BooleanTest
+ * @bug 8028756
+ * @library /testlibrary /testlibrary/whitebox
+ * @build BooleanTest
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm/timeout=600 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI BooleanTest
+ * @summary testing of WB::set/getBooleanVMFlag()
+ * @author igor.ignatyev@oracle.com
+ */
+
+import sun.hotspot.WhiteBox;
+import com.oracle.java.testlibrary.*;
+import sun.management.*;
+import com.sun.management.*;
+
+public class BooleanTest {
+ private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox();
+ private static final Boolean[] TESTS = {true, false, true, true, false};
+ private static final String TEST_NAME = "BooleanTest";
+ private static final String FLAG_NAME = "PrintCompilation";
+ private static final String METHOD = TEST_NAME + "::method";
+ private static final String METHOD1 = METHOD + "1";
+ private static final String METHOD2 = METHOD + "2";
+
+ public static void main(String[] args) throws Exception {
+ if (args.length == 0) {
+ VmFlagTest.runTest(FLAG_NAME, TESTS,
+ VmFlagTest.WHITE_BOX::setBooleanVMFlag,
+ VmFlagTest.WHITE_BOX::getBooleanVMFlag);
+ testFunctional(false);
+ testFunctional(true);
+ } else {
+ boolean value = Boolean.valueOf(args[0]);
+ method1();
+ VmFlagTest.WHITE_BOX.setBooleanVMFlag(FLAG_NAME, value);
+ method2();
+ }
+ }
+
+ private static void testFunctional(boolean value) throws Exception {
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "-Xbootclasspath/a:.",
+ "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:+WhiteBoxAPI",
+ "-Xcomp",
+ "-XX:CompileCommand=compileonly," + METHOD + "*",
+ "-XX:" + (value ? "-" : "+") + FLAG_NAME,
+ TEST_NAME,
+ "" + value);
+ OutputAnalyzer out = new OutputAnalyzer(pb.start());
+ if (value) {
+ out.shouldNotContain(METHOD1);
+ out.shouldContain(METHOD2);
+ } else {
+ out.shouldContain(METHOD1);
+ out.shouldNotContain(METHOD2);
+ }
+ }
+
+ private static void method1() { }
+ private static void method2() { }
+}
+
diff --git a/hotspot/test/testlibrary_tests/whitebox/vm_flags/DoubleTest.java b/hotspot/test/testlibrary_tests/whitebox/vm_flags/DoubleTest.java
new file mode 100644
index 00000000000..2110fb9d7a7
--- /dev/null
+++ b/hotspot/test/testlibrary_tests/whitebox/vm_flags/DoubleTest.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test DoubleTest
+ * @bug 8028756
+ * @library /testlibrary /testlibrary/whitebox
+ * @build DoubleTest
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm/timeout=600 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI DoubleTest
+ * @summary testing of WB::set/getDoubleVMFlag()
+ * @author igor.ignatyev@oracle.com
+ */
+
+public class DoubleTest {
+ private static final String FLAG_NAME = null;
+ private static final Double[] TESTS = {0d, -0d, -1d, 1d,
+ Double.MAX_VALUE, Double.MIN_VALUE, Double.NaN,
+ Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY};
+
+ public static void main(String[] args) throws Exception {
+ VmFlagTest.runTest(FLAG_NAME, TESTS,
+ VmFlagTest.WHITE_BOX::setDoubleVMFlag,
+ VmFlagTest.WHITE_BOX::getDoubleVMFlag);
+ }
+}
+
diff --git a/hotspot/test/testlibrary_tests/whitebox/vm_flags/IntxTest.java b/hotspot/test/testlibrary_tests/whitebox/vm_flags/IntxTest.java
new file mode 100644
index 00000000000..6ffbd832611
--- /dev/null
+++ b/hotspot/test/testlibrary_tests/whitebox/vm_flags/IntxTest.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test IntxTest
+ * @bug 8028756
+ * @library /testlibrary /testlibrary/whitebox
+ * @build IntxTest
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm/timeout=600 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI IntxTest
+ * @summary testing of WB::set/getIntxVMFlag()
+ * @author igor.ignatyev@oracle.com
+ */
+
+public class IntxTest {
+ private static final String FLAG_NAME = "OnStackReplacePercentage";
+ private static final Long[] TESTS = {0L, 100L, -1L,
+ (long) Integer.MAX_VALUE, (long) Integer.MIN_VALUE};
+
+ public static void main(String[] args) throws Exception {
+ VmFlagTest.runTest(FLAG_NAME, TESTS,
+ VmFlagTest.WHITE_BOX::setIntxVMFlag,
+ VmFlagTest.WHITE_BOX::getIntxVMFlag);
+ }
+}
+
diff --git a/hotspot/test/testlibrary_tests/whitebox/vm_flags/StringTest.java b/hotspot/test/testlibrary_tests/whitebox/vm_flags/StringTest.java
new file mode 100644
index 00000000000..70aa0664c54
--- /dev/null
+++ b/hotspot/test/testlibrary_tests/whitebox/vm_flags/StringTest.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test StringTest
+ * @bug 8028756
+ * @library /testlibrary /testlibrary/whitebox
+ * @build StringTest
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm/timeout=600 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI StringTest
+ * @summary testing of WB::set/getStringVMFlag()
+ * @author igor.ignatyev@oracle.com
+ */
+
+public class StringTest {
+ private static final String FLAG_NAME = "CompileOnly";
+ private static final String[] TESTS = {"StringTest::*", ""};
+
+ public static void main(String[] args) throws Exception {
+ VmFlagTest.runTest(FLAG_NAME, TESTS,
+ VmFlagTest.WHITE_BOX::setStringVMFlag,
+ VmFlagTest.WHITE_BOX::getStringVMFlag);
+ }
+}
+
diff --git a/hotspot/test/testlibrary_tests/whitebox/vm_flags/Uint64Test.java b/hotspot/test/testlibrary_tests/whitebox/vm_flags/Uint64Test.java
new file mode 100644
index 00000000000..2f616d45507
--- /dev/null
+++ b/hotspot/test/testlibrary_tests/whitebox/vm_flags/Uint64Test.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test Uint64Test
+ * @bug 8028756
+ * @library /testlibrary /testlibrary/whitebox
+ * @build Uint64Test
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm/timeout=600 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI Uint64Test
+ * @summary testing of WB::set/getUint64VMFlag()
+ * @author igor.ignatyev@oracle.com
+ */
+
+public class Uint64Test {
+ private static final String FLAG_NAME = "MaxRAM";
+ private static final Long[] TESTS = {0L, 100L, (long) Integer.MAX_VALUE,
+ -1L, Long.MAX_VALUE, Long.MIN_VALUE};
+
+ public static void main(String[] args) throws Exception {
+ VmFlagTest.runTest(FLAG_NAME, TESTS,
+ VmFlagTest.WHITE_BOX::setUint64VMFlag,
+ VmFlagTest.WHITE_BOX::getUint64VMFlag);
+ }
+}
+
diff --git a/hotspot/test/testlibrary_tests/whitebox/vm_flags/UintxTest.java b/hotspot/test/testlibrary_tests/whitebox/vm_flags/UintxTest.java
new file mode 100644
index 00000000000..688962f0267
--- /dev/null
+++ b/hotspot/test/testlibrary_tests/whitebox/vm_flags/UintxTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test UintxTest
+ * @bug 8028756
+ * @library /testlibrary /testlibrary/whitebox
+ * @build UintxTest
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm/timeout=600 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI UintxTest
+ * @summary testing of WB::set/getUintxVMFlag()
+ * @author igor.ignatyev@oracle.com
+ */
+import com.oracle.java.testlibrary.Platform;
+
+public class UintxTest {
+ private static final String FLAG_NAME = "TypeProfileLevel";
+ private static final Long[] TESTS = {0L, 100L, (long) Integer.MAX_VALUE,
+ (1L << 32L) - 1L, 1L << 32L};
+ private static final Long[] EXPECTED_64 = TESTS;
+ private static final Long[] EXPECTED_32 = {0L, 100L,
+ (long) Integer.MAX_VALUE, (1L << 32L) - 1L, 0L};
+
+ public static void main(String[] args) throws Exception {
+ VmFlagTest.runTest(FLAG_NAME, TESTS,
+ Platform.is64bit() ? EXPECTED_64 : EXPECTED_32,
+ VmFlagTest.WHITE_BOX::setUintxVMFlag,
+ VmFlagTest.WHITE_BOX::getUintxVMFlag);
+ }
+}
+
diff --git a/hotspot/test/testlibrary_tests/whitebox/vm_flags/VmFlagTest.java b/hotspot/test/testlibrary_tests/whitebox/vm_flags/VmFlagTest.java
new file mode 100644
index 00000000000..fa8915f3a49
--- /dev/null
+++ b/hotspot/test/testlibrary_tests/whitebox/vm_flags/VmFlagTest.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.util.Objects;
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+import sun.hotspot.WhiteBox;
+import sun.management.*;
+import com.sun.management.*;
+import com.oracle.java.testlibrary.*;
+
+public final class VmFlagTest {
+ public static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox();
+
+ private static final String NONEXISTENT_FLAG = "NonexistentFlag";
+ private final String flagName;
+ private final BiConsumer test;
+ private final BiConsumer set;
+ private final Function get;
+
+ protected VmFlagTest(String flagName, BiConsumer set,
+ Function get, boolean isPositive) {
+ this.flagName = flagName;
+ this.set = set;
+ this.get = get;
+ if (isPositive) {
+ test = this::testPositive;
+ } else {
+ test = this::testNegative;
+ }
+ }
+
+ private void setNewValue(T value) {
+ set.accept(flagName, value);
+ }
+
+ private T getValue() {
+ T t = get.apply(flagName);
+ System.out.println("T = " + t);
+ return t;
+ }
+
+ protected static void runTest(String existentFlag, T[] tests,
+ BiConsumer set, Function get) {
+ runTest(existentFlag, tests, tests, set, get);
+ }
+
+ protected static void runTest(String existentFlag, T[] tests,
+ T[] results, BiConsumer set, Function get) {
+ if (existentFlag != null) {
+ new VmFlagTest(existentFlag, set, get, true).test(tests, results);
+ }
+ new VmFlagTest(NONEXISTENT_FLAG, set, get, false).test(tests, results);
+ }
+
+ public final void test(T[] tests, T[] results) {
+ Asserts.assertEQ(tests.length, results.length, "[TESTBUG] tests.length != results.length");
+ for (int i = 0, n = tests.length ; i < n; ++i) {
+ test.accept(tests[i], results[i]);
+ }
+ }
+
+ protected String getVMOptionAsString() {
+ HotSpotDiagnosticMXBean diagnostic
+ = ManagementFactoryHelper.getDiagnosticMXBean();
+ VMOption tmp;
+ try {
+ tmp = diagnostic.getVMOption(flagName);
+ } catch (IllegalArgumentException e) {
+ tmp = null;
+ }
+ return tmp == null ? null : tmp.getValue();
+ }
+
+ private void testPositive(T value, T expected) {
+ Asserts.assertEQ(getVMOptionAsString(), asString(getValue()));
+ setNewValue(value);
+ String newValue = getVMOptionAsString();
+ Asserts.assertEQ(newValue, asString(expected));
+ Asserts.assertEQ(getVMOptionAsString(), asString(getValue()));
+ }
+
+ private void testNegative(T value, T expected) {
+ String oldValue = getVMOptionAsString();
+ Asserts.assertEQ(oldValue, asString(getValue()));
+ setNewValue(value);
+ String newValue = getVMOptionAsString();
+ Asserts.assertEQ(oldValue, newValue);
+ }
+
+ private String asString(Object value) {
+ return value == null ? null : "" + value;
+ }
+}
+
From 2a0815a55e21ead2657cd08f36eee5e3c55366c8 Mon Sep 17 00:00:00 2001
From: Tobias Hartmann
Date: Mon, 2 Jun 2014 08:07:29 +0200
Subject: [PATCH 07/76] 8034812: remove IDX_INIT macro hack in Node class
The IDX_INIT macro used by Node::Node(...) to retrieve the Compile object is removed and replaced by a call to Compile::current(). The Node constructor, new operator and all calls to it are adapted accordingly.
Reviewed-by: kvn, jrose, iveresov, goetz
---
hotspot/src/cpu/ppc/vm/ppc.ad | 188 +++---
hotspot/src/cpu/x86/vm/x86_32.ad | 12 +-
hotspot/src/share/vm/adlc/output_c.cpp | 36 +-
hotspot/src/share/vm/opto/addnode.cpp | 64 +-
hotspot/src/share/vm/opto/block.cpp | 6 +-
hotspot/src/share/vm/opto/callGenerator.cpp | 14 +-
hotspot/src/share/vm/opto/callnode.cpp | 22 +-
hotspot/src/share/vm/opto/castnode.cpp | 8 +-
hotspot/src/share/vm/opto/cfgnode.cpp | 60 +-
hotspot/src/share/vm/opto/chaitin.cpp | 4 +-
hotspot/src/share/vm/opto/coalesce.cpp | 6 +-
hotspot/src/share/vm/opto/compile.cpp | 26 +-
hotspot/src/share/vm/opto/connode.cpp | 22 +-
hotspot/src/share/vm/opto/connode.hpp | 12 +-
hotspot/src/share/vm/opto/convertnode.cpp | 14 +-
hotspot/src/share/vm/opto/divnode.cpp | 168 +++---
hotspot/src/share/vm/opto/doCall.cpp | 14 +-
.../src/share/vm/opto/generateOptoStub.cpp | 75 ++-
hotspot/src/share/vm/opto/graphKit.cpp | 254 ++++----
hotspot/src/share/vm/opto/graphKit.hpp | 42 +-
hotspot/src/share/vm/opto/idealKit.cpp | 20 +-
hotspot/src/share/vm/opto/idealKit.hpp | 34 +-
hotspot/src/share/vm/opto/ifnode.cpp | 52 +-
hotspot/src/share/vm/opto/lcm.cpp | 8 +-
hotspot/src/share/vm/opto/library_call.cpp | 559 +++++++++---------
hotspot/src/share/vm/opto/loopPredicate.cpp | 30 +-
hotspot/src/share/vm/opto/loopTransform.cpp | 142 ++---
hotspot/src/share/vm/opto/loopUnswitch.cpp | 10 +-
hotspot/src/share/vm/opto/loopnode.cpp | 110 ++--
hotspot/src/share/vm/opto/loopopts.cpp | 46 +-
hotspot/src/share/vm/opto/machnode.hpp | 5 +-
hotspot/src/share/vm/opto/macro.cpp | 225 ++++---
hotspot/src/share/vm/opto/macro.hpp | 2 +-
hotspot/src/share/vm/opto/matcher.cpp | 44 +-
hotspot/src/share/vm/opto/memnode.cpp | 142 ++---
hotspot/src/share/vm/opto/movenode.cpp | 26 +-
hotspot/src/share/vm/opto/mulnode.cpp | 132 ++---
hotspot/src/share/vm/opto/node.cpp | 45 +-
hotspot/src/share/vm/opto/node.hpp | 8 +-
hotspot/src/share/vm/opto/output.cpp | 26 +-
hotspot/src/share/vm/opto/parse1.cpp | 80 +--
hotspot/src/share/vm/opto/parse2.cpp | 210 +++----
hotspot/src/share/vm/opto/parse3.cpp | 4 +-
hotspot/src/share/vm/opto/parseHelper.cpp | 24 +-
hotspot/src/share/vm/opto/phaseX.cpp | 6 +-
hotspot/src/share/vm/opto/reg_split.cpp | 8 +-
hotspot/src/share/vm/opto/split_if.cpp | 2 +-
hotspot/src/share/vm/opto/stringopts.cpp | 42 +-
hotspot/src/share/vm/opto/subnode.cpp | 96 +--
hotspot/src/share/vm/opto/superword.cpp | 34 +-
hotspot/src/share/vm/opto/vectornode.cpp | 126 ++--
51 files changed, 1659 insertions(+), 1686 deletions(-)
diff --git a/hotspot/src/cpu/ppc/vm/ppc.ad b/hotspot/src/cpu/ppc/vm/ppc.ad
index 214ea62029b..d2d51379a22 100644
--- a/hotspot/src/cpu/ppc/vm/ppc.ad
+++ b/hotspot/src/cpu/ppc/vm/ppc.ad
@@ -1285,9 +1285,9 @@ bool MachConstantBaseNode::requires_postalloc_expand() const { return true; }
void MachConstantBaseNode::postalloc_expand(GrowableArray *nodes, PhaseRegAlloc *ra_) {
Compile *C = ra_->C;
- iRegPdstOper *op_dst = new (C) iRegPdstOper();
- MachNode *m1 = new (C) loadToc_hiNode();
- MachNode *m2 = new (C) loadToc_loNode();
+ iRegPdstOper *op_dst = new iRegPdstOper();
+ MachNode *m1 = new loadToc_hiNode();
+ MachNode *m2 = new loadToc_loNode();
m1->add_req(NULL);
m2->add_req(NULL, m1);
@@ -2232,9 +2232,9 @@ const bool Matcher::isSimpleConstant64(jlong value) {
MachTypeNode *Matcher::make_decode_node(Compile *C) {
assert(Universe::narrow_oop_base() == NULL && Universe::narrow_oop_shift() == 0,
"This method is only implemented for unscaled cOops mode so far");
- MachTypeNode *decode = new (C) decodeN_unscaledNode();
- decode->set_opnd_array(0, new (C) iRegPdstOper());
- decode->set_opnd_array(1, new (C) iRegNsrcOper());
+ MachTypeNode *decode = new decodeN_unscaledNode();
+ decode->set_opnd_array(0, new iRegPdstOper());
+ decode->set_opnd_array(1, new iRegNsrcOper());
return decode;
}
*/
@@ -2600,20 +2600,20 @@ loadConLNodesTuple loadConLNodesTuple_create(Compile *C, PhaseRegAlloc *ra_, Nod
const bool large_constant_pool = true; // TODO: PPC port C->cfg()->_consts_size > 4000;
if (large_constant_pool) {
// Create new nodes.
- loadConL_hiNode *m1 = new (C) loadConL_hiNode();
- loadConL_loNode *m2 = new (C) loadConL_loNode();
+ loadConL_hiNode *m1 = new loadConL_hiNode();
+ loadConL_loNode *m2 = new loadConL_loNode();
// inputs for new nodes
m1->add_req(NULL, toc);
m2->add_req(NULL, m1);
// operands for new nodes
- m1->_opnds[0] = new (C) iRegLdstOper(); // dst
- m1->_opnds[1] = immSrc; // src
- m1->_opnds[2] = new (C) iRegPdstOper(); // toc
- m2->_opnds[0] = new (C) iRegLdstOper(); // dst
- m2->_opnds[1] = immSrc; // src
- m2->_opnds[2] = new (C) iRegLdstOper(); // base
+ m1->_opnds[0] = new iRegLdstOper(); // dst
+ m1->_opnds[1] = immSrc; // src
+ m1->_opnds[2] = new iRegPdstOper(); // toc
+ m2->_opnds[0] = new iRegLdstOper(); // dst
+ m2->_opnds[1] = immSrc; // src
+ m2->_opnds[2] = new iRegLdstOper(); // base
// Initialize ins_attrib TOC fields.
m1->_const_toc_offset = -1;
@@ -2633,15 +2633,15 @@ loadConLNodesTuple loadConLNodesTuple_create(Compile *C, PhaseRegAlloc *ra_, Nod
nodes._last = nodes._large_lo;
assert(m2->bottom_type()->isa_long(), "must be long");
} else {
- loadConLNode *m2 = new (C) loadConLNode();
+ loadConLNode *m2 = new loadConLNode();
// inputs for new nodes
m2->add_req(NULL, toc);
// operands for new nodes
- m2->_opnds[0] = new (C) iRegLdstOper(); // dst
- m2->_opnds[1] = immSrc; // src
- m2->_opnds[2] = new (C) iRegPdstOper(); // toc
+ m2->_opnds[0] = new iRegLdstOper(); // dst
+ m2->_opnds[1] = immSrc; // src
+ m2->_opnds[2] = new iRegPdstOper(); // toc
// Initialize ins_attrib instruction offset.
m2->_cbuf_insts_offset = -1;
@@ -2750,20 +2750,20 @@ encode %{
const bool large_constant_pool = true; // TODO: PPC port C->cfg()->_consts_size > 4000;
if (large_constant_pool) {
// Create new nodes.
- loadConP_hiNode *m1 = new (C) loadConP_hiNode();
- loadConP_loNode *m2 = new (C) loadConP_loNode();
+ loadConP_hiNode *m1 = new loadConP_hiNode();
+ loadConP_loNode *m2 = new loadConP_loNode();
// inputs for new nodes
m1->add_req(NULL, n_toc);
m2->add_req(NULL, m1);
// operands for new nodes
- m1->_opnds[0] = new (C) iRegPdstOper(); // dst
- m1->_opnds[1] = op_src; // src
- m1->_opnds[2] = new (C) iRegPdstOper(); // toc
- m2->_opnds[0] = new (C) iRegPdstOper(); // dst
- m2->_opnds[1] = op_src; // src
- m2->_opnds[2] = new (C) iRegLdstOper(); // base
+ m1->_opnds[0] = new iRegPdstOper(); // dst
+ m1->_opnds[1] = op_src; // src
+ m1->_opnds[2] = new iRegPdstOper(); // toc
+ m2->_opnds[0] = new iRegPdstOper(); // dst
+ m2->_opnds[1] = op_src; // src
+ m2->_opnds[2] = new iRegLdstOper(); // base
// Initialize ins_attrib TOC fields.
m1->_const_toc_offset = -1;
@@ -2777,15 +2777,15 @@ encode %{
nodes->push(m2);
assert(m2->bottom_type()->isa_ptr(), "must be ptr");
} else {
- loadConPNode *m2 = new (C) loadConPNode();
+ loadConPNode *m2 = new loadConPNode();
// inputs for new nodes
m2->add_req(NULL, n_toc);
// operands for new nodes
- m2->_opnds[0] = new (C) iRegPdstOper(); // dst
- m2->_opnds[1] = op_src; // src
- m2->_opnds[2] = new (C) iRegPdstOper(); // toc
+ m2->_opnds[0] = new iRegPdstOper(); // dst
+ m2->_opnds[1] = op_src; // src
+ m2->_opnds[2] = new iRegPdstOper(); // toc
// Register allocation for new nodes.
ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this));
@@ -2802,9 +2802,9 @@ encode %{
MachNode *m2;
if (large_constant_pool) {
- m2 = new (C) loadConFCompNode();
+ m2 = new loadConFCompNode();
} else {
- m2 = new (C) loadConFNode();
+ m2 = new loadConFNode();
}
// inputs for new nodes
m2->add_req(NULL, n_toc);
@@ -2812,7 +2812,7 @@ encode %{
// operands for new nodes
m2->_opnds[0] = op_dst;
m2->_opnds[1] = op_src;
- m2->_opnds[2] = new (C) iRegPdstOper(); // constanttablebase
+ m2->_opnds[2] = new iRegPdstOper(); // constanttablebase
// register allocation for new nodes
ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this));
@@ -2826,9 +2826,9 @@ encode %{
MachNode *m2;
if (large_constant_pool) {
- m2 = new (C) loadConDCompNode();
+ m2 = new loadConDCompNode();
} else {
- m2 = new (C) loadConDNode();
+ m2 = new loadConDNode();
}
// inputs for new nodes
m2->add_req(NULL, n_toc);
@@ -2836,7 +2836,7 @@ encode %{
// operands for new nodes
m2->_opnds[0] = op_dst;
m2->_opnds[1] = op_src;
- m2->_opnds[2] = new (C) iRegPdstOper(); // constanttablebase
+ m2->_opnds[2] = new iRegPdstOper(); // constanttablebase
// register allocation for new nodes
ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this));
@@ -2918,15 +2918,15 @@ encode %{
if (VM_Version::has_isel()) {
// use isel instruction with Power 7
- cmpP_reg_imm16Node *n_compare = new (C) cmpP_reg_imm16Node();
- encodeP_subNode *n_sub_base = new (C) encodeP_subNode();
- encodeP_shiftNode *n_shift = new (C) encodeP_shiftNode();
- cond_set_0_oopNode *n_cond_set = new (C) cond_set_0_oopNode();
+ cmpP_reg_imm16Node *n_compare = new cmpP_reg_imm16Node();
+ encodeP_subNode *n_sub_base = new encodeP_subNode();
+ encodeP_shiftNode *n_shift = new encodeP_shiftNode();
+ cond_set_0_oopNode *n_cond_set = new cond_set_0_oopNode();
n_compare->add_req(n_region, n_src);
n_compare->_opnds[0] = op_crx;
n_compare->_opnds[1] = op_src;
- n_compare->_opnds[2] = new (C) immL16Oper(0);
+ n_compare->_opnds[2] = new immL16Oper(0);
n_sub_base->add_req(n_region, n_src);
n_sub_base->_opnds[0] = op_dst;
@@ -2956,10 +2956,10 @@ encode %{
} else {
// before Power 7
- moveRegNode *n_move = new (C) moveRegNode();
- cmpP_reg_imm16Node *n_compare = new (C) cmpP_reg_imm16Node();
- encodeP_shiftNode *n_shift = new (C) encodeP_shiftNode();
- cond_sub_baseNode *n_sub_base = new (C) cond_sub_baseNode();
+ moveRegNode *n_move = new moveRegNode();
+ cmpP_reg_imm16Node *n_compare = new cmpP_reg_imm16Node();
+ encodeP_shiftNode *n_shift = new encodeP_shiftNode();
+ cond_sub_baseNode *n_sub_base = new cond_sub_baseNode();
n_move->add_req(n_region, n_src);
n_move->_opnds[0] = op_dst;
@@ -2971,7 +2971,7 @@ encode %{
n_compare->_opnds[0] = op_crx;
n_compare->_opnds[1] = op_src;
- n_compare->_opnds[2] = new (C) immL16Oper(0);
+ n_compare->_opnds[2] = new immL16Oper(0);
n_sub_base->add_req(n_region, n_compare, n_src);
n_sub_base->_opnds[0] = op_dst;
@@ -3000,13 +3000,13 @@ encode %{
enc_class postalloc_expand_encode_oop_not_null(iRegNdst dst, iRegPdst src) %{
- encodeP_subNode *n1 = new (C) encodeP_subNode();
+ encodeP_subNode *n1 = new encodeP_subNode();
n1->add_req(n_region, n_src);
n1->_opnds[0] = op_dst;
n1->_opnds[1] = op_src;
n1->_bottom_type = _bottom_type;
- encodeP_shiftNode *n2 = new (C) encodeP_shiftNode();
+ encodeP_shiftNode *n2 = new encodeP_shiftNode();
n2->add_req(n_region, n1);
n2->_opnds[0] = op_dst;
n2->_opnds[1] = op_dst;
@@ -3020,13 +3020,13 @@ encode %{
%}
enc_class postalloc_expand_decode_oop(iRegPdst dst, iRegNsrc src, flagsReg crx) %{
- decodeN_shiftNode *n_shift = new (C) decodeN_shiftNode();
- cmpN_reg_imm0Node *n_compare = new (C) cmpN_reg_imm0Node();
+ decodeN_shiftNode *n_shift = new decodeN_shiftNode();
+ cmpN_reg_imm0Node *n_compare = new cmpN_reg_imm0Node();
n_compare->add_req(n_region, n_src);
n_compare->_opnds[0] = op_crx;
n_compare->_opnds[1] = op_src;
- n_compare->_opnds[2] = new (C) immN_0Oper(TypeNarrowOop::NULL_PTR);
+ n_compare->_opnds[2] = new immN_0Oper(TypeNarrowOop::NULL_PTR);
n_shift->add_req(n_region, n_src);
n_shift->_opnds[0] = op_dst;
@@ -3036,13 +3036,13 @@ encode %{
if (VM_Version::has_isel()) {
// use isel instruction with Power 7
- decodeN_addNode *n_add_base = new (C) decodeN_addNode();
+ decodeN_addNode *n_add_base = new decodeN_addNode();
n_add_base->add_req(n_region, n_shift);
n_add_base->_opnds[0] = op_dst;
n_add_base->_opnds[1] = op_dst;
n_add_base->_bottom_type = _bottom_type;
- cond_set_0_ptrNode *n_cond_set = new (C) cond_set_0_ptrNode();
+ cond_set_0_ptrNode *n_cond_set = new cond_set_0_ptrNode();
n_cond_set->add_req(n_region, n_compare, n_add_base);
n_cond_set->_opnds[0] = op_dst;
n_cond_set->_opnds[1] = op_crx;
@@ -3064,7 +3064,7 @@ encode %{
} else {
// before Power 7
- cond_add_baseNode *n_add_base = new (C) cond_add_baseNode();
+ cond_add_baseNode *n_add_base = new cond_add_baseNode();
n_add_base->add_req(n_region, n_compare, n_shift);
n_add_base->_opnds[0] = op_dst;
@@ -3086,13 +3086,13 @@ encode %{
%}
enc_class postalloc_expand_decode_oop_not_null(iRegPdst dst, iRegNsrc src) %{
- decodeN_shiftNode *n1 = new (C) decodeN_shiftNode();
+ decodeN_shiftNode *n1 = new decodeN_shiftNode();
n1->add_req(n_region, n_src);
n1->_opnds[0] = op_dst;
n1->_opnds[1] = op_src;
n1->_bottom_type = _bottom_type;
- decodeN_addNode *n2 = new (C) decodeN_addNode();
+ decodeN_addNode *n2 = new decodeN_addNode();
n2->add_req(n_region, n1);
n2->_opnds[0] = op_dst;
n2->_opnds[1] = op_dst;
@@ -3388,7 +3388,7 @@ encode %{
// Create new nodes.
// Make an operand with the bit pattern to load as float.
- immLOper *op_repl = new (C) immLOper((jlong)replicate_immF(op_src->constantF()));
+ immLOper *op_repl = new immLOper((jlong)replicate_immF(op_src->constantF()));
loadConLNodesTuple loadConLNodes =
loadConLNodesTuple_create(C, ra_, n_toc, op_repl,
@@ -3611,11 +3611,11 @@ encode %{
// Create the nodes for loading the IC from the TOC.
loadConLNodesTuple loadConLNodes_IC =
- loadConLNodesTuple_create(C, ra_, n_toc, new (C) immLOper((jlong)Universe::non_oop_word()),
+ loadConLNodesTuple_create(C, ra_, n_toc, new immLOper((jlong)Universe::non_oop_word()),
OptoReg::Name(R19_H_num), OptoReg::Name(R19_num));
// Create the call node.
- CallDynamicJavaDirectSchedNode *call = new (C) CallDynamicJavaDirectSchedNode();
+ CallDynamicJavaDirectSchedNode *call = new CallDynamicJavaDirectSchedNode();
call->_method_handle_invoke = _method_handle_invoke;
call->_vtable_index = _vtable_index;
call->_method = _method;
@@ -3765,7 +3765,7 @@ encode %{
#if defined(ABI_ELFv2)
jlong entry_address = (jlong) this->entry_point();
assert(entry_address, "need address here");
- loadConLNodes_Entry = loadConLNodesTuple_create(C, ra_, n_toc, new (C) immLOper(entry_address),
+ loadConLNodes_Entry = loadConLNodesTuple_create(C, ra_, n_toc, new immLOper(entry_address),
OptoReg::Name(R12_H_num), OptoReg::Name(R12_num));
#else
// Get the struct that describes the function we are about to call.
@@ -3777,42 +3777,42 @@ encode %{
loadConLNodesTuple loadConLNodes_Toc;
// Create nodes and operands for loading the entry point.
- loadConLNodes_Entry = loadConLNodesTuple_create(C, ra_, n_toc, new (C) immLOper(entry_address),
+ loadConLNodes_Entry = loadConLNodesTuple_create(C, ra_, n_toc, new immLOper(entry_address),
OptoReg::Name(R12_H_num), OptoReg::Name(R12_num));
// Create nodes and operands for loading the env pointer.
if (fd->env() != NULL) {
- loadConLNodes_Env = loadConLNodesTuple_create(C, ra_, n_toc, new (C) immLOper((jlong) fd->env()),
+ loadConLNodes_Env = loadConLNodesTuple_create(C, ra_, n_toc, new immLOper((jlong) fd->env()),
OptoReg::Name(R11_H_num), OptoReg::Name(R11_num));
} else {
loadConLNodes_Env._large_hi = NULL;
loadConLNodes_Env._large_lo = NULL;
loadConLNodes_Env._small = NULL;
- loadConLNodes_Env._last = new (C) loadConL16Node();
- loadConLNodes_Env._last->_opnds[0] = new (C) iRegLdstOper();
- loadConLNodes_Env._last->_opnds[1] = new (C) immL16Oper(0);
+ loadConLNodes_Env._last = new loadConL16Node();
+ loadConLNodes_Env._last->_opnds[0] = new iRegLdstOper();
+ loadConLNodes_Env._last->_opnds[1] = new immL16Oper(0);
ra_->set_pair(loadConLNodes_Env._last->_idx, OptoReg::Name(R11_H_num), OptoReg::Name(R11_num));
}
// Create nodes and operands for loading the Toc point.
- loadConLNodes_Toc = loadConLNodesTuple_create(C, ra_, n_toc, new (C) immLOper((jlong) fd->toc()),
+ loadConLNodes_Toc = loadConLNodesTuple_create(C, ra_, n_toc, new immLOper((jlong) fd->toc()),
OptoReg::Name(R2_H_num), OptoReg::Name(R2_num));
#endif // ABI_ELFv2
// mtctr node
- MachNode *mtctr = new (C) CallLeafDirect_mtctrNode();
+ MachNode *mtctr = new CallLeafDirect_mtctrNode();
assert(loadConLNodes_Entry._last != NULL, "entry must exist");
mtctr->add_req(0, loadConLNodes_Entry._last);
- mtctr->_opnds[0] = new (C) iRegLdstOper();
- mtctr->_opnds[1] = new (C) iRegLdstOper();
+ mtctr->_opnds[0] = new iRegLdstOper();
+ mtctr->_opnds[1] = new iRegLdstOper();
// call node
- MachCallLeafNode *call = new (C) CallLeafDirectNode();
+ MachCallLeafNode *call = new CallLeafDirectNode();
call->_opnds[0] = _opnds[0];
- call->_opnds[1] = new (C) methodOper((intptr_t) entry_address); // May get set later.
+ call->_opnds[1] = new methodOper((intptr_t) entry_address); // May get set later.
// Make the new call node look like the old one.
call->_name = _name;
@@ -6050,9 +6050,9 @@ instruct loadConN_Ex(iRegNdst dst, immN src) %{
format %{ "LoadN $dst, $src \t// postalloc expanded" %} // mask
postalloc_expand %{
- MachNode *m1 = new (C) loadConN_hiNode();
- MachNode *m2 = new (C) loadConN_loNode();
- MachNode *m3 = new (C) clearMs32bNode();
+ MachNode *m1 = new loadConN_hiNode();
+ MachNode *m2 = new loadConN_loNode();
+ MachNode *m3 = new clearMs32bNode();
m1->add_req(NULL);
m2->add_req(NULL, m1);
m3->add_req(NULL, m2);
@@ -6117,7 +6117,7 @@ instruct loadConNKlass_Ex(iRegNdst dst, immNKlass src) %{
format %{ "LoadN $dst, $src \t// postalloc expanded" %} // mask
postalloc_expand %{
// Load high bits into register. Sign extended.
- MachNode *m1 = new (C) loadConNKlass_hiNode();
+ MachNode *m1 = new loadConNKlass_hiNode();
m1->add_req(NULL);
m1->_opnds[0] = op_dst;
m1->_opnds[1] = op_src;
@@ -6127,7 +6127,7 @@ instruct loadConNKlass_Ex(iRegNdst dst, immNKlass src) %{
MachNode *m2 = m1;
if (!Assembler::is_uimm((jlong)Klass::encode_klass((Klass *)op_src->constant()), 31)) {
// Value might be 1-extended. Mask out these bits.
- m2 = new (C) clearMs32bNode();
+ m2 = new clearMs32bNode();
m2->add_req(NULL, m1);
m2->_opnds[0] = op_dst;
m2->_opnds[1] = op_dst;
@@ -6135,7 +6135,7 @@ instruct loadConNKlass_Ex(iRegNdst dst, immNKlass src) %{
nodes->push(m2);
}
- MachNode *m3 = new (C) loadConNKlass_loNode();
+ MachNode *m3 = new loadConNKlass_loNode();
m3->add_req(NULL, m2);
m3->_opnds[0] = op_dst;
m3->_opnds[1] = op_src;
@@ -6987,14 +6987,14 @@ instruct encodePKlass_not_null_Ex(iRegNdst dst, iRegLsrc base, iRegPsrc src) %{
format %{ "EncodePKlass $dst, $src\t// $src != Null, postalloc expanded" %}
postalloc_expand %{
- encodePKlass_sub_baseNode *n1 = new (C) encodePKlass_sub_baseNode();
+ encodePKlass_sub_baseNode *n1 = new encodePKlass_sub_baseNode();
n1->add_req(n_region, n_base, n_src);
n1->_opnds[0] = op_dst;
n1->_opnds[1] = op_base;
n1->_opnds[2] = op_src;
n1->_bottom_type = _bottom_type;
- encodePKlass_shiftNode *n2 = new (C) encodePKlass_shiftNode();
+ encodePKlass_shiftNode *n2 = new encodePKlass_shiftNode();
n2->add_req(n_region, n1);
n2->_opnds[0] = op_dst;
n2->_opnds[1] = op_dst;
@@ -7064,14 +7064,14 @@ instruct decodeNKlass_notNull_addBase_Ex(iRegPdst dst, iRegLsrc base, iRegNsrc s
format %{ "DecodeNKlass $dst = $base + ($src << 3) \t// $src != NULL, postalloc expanded" %}
postalloc_expand %{
- decodeNKlass_add_baseNode *n1 = new (C) decodeNKlass_add_baseNode();
+ decodeNKlass_add_baseNode *n1 = new decodeNKlass_add_baseNode();
n1->add_req(n_region, n_base, n_src);
n1->_opnds[0] = op_dst;
n1->_opnds[1] = op_base;
n1->_opnds[2] = op_src;
n1->_bottom_type = _bottom_type;
- decodeNKlass_shiftNode *n2 = new (C) decodeNKlass_shiftNode();
+ decodeNKlass_shiftNode *n2 = new decodeNKlass_shiftNode();
n2->add_req(n_region, n1);
n2->_opnds[0] = op_dst;
n2->_opnds[1] = op_dst;
@@ -9773,8 +9773,8 @@ instruct cmovI_bso_stackSlotL_conLvalue0_Ex(iRegIdst dst, flagsReg crx, stackSlo
//
// Create new nodes.
- MachNode *m1 = new (C) loadConI16Node();
- MachNode *m2 = new (C) cmovI_bso_stackSlotLNode();
+ MachNode *m1 = new loadConI16Node();
+ MachNode *m2 = new cmovI_bso_stackSlotLNode();
// inputs for new nodes
m1->add_req(n_region);
@@ -9785,7 +9785,7 @@ instruct cmovI_bso_stackSlotL_conLvalue0_Ex(iRegIdst dst, flagsReg crx, stackSlo
// operands for new nodes
m1->_opnds[0] = op_dst;
- m1->_opnds[1] = new (C) immI16Oper(0);
+ m1->_opnds[1] = new immI16Oper(0);
m2->_opnds[0] = op_dst;
m2->_opnds[1] = op_crx;
@@ -9942,8 +9942,8 @@ instruct cmovL_bso_stackSlotL_conLvalue0_Ex(iRegLdst dst, flagsReg crx, stackSlo
//
// Create new nodes.
- MachNode *m1 = new (C) loadConL16Node();
- MachNode *m2 = new (C) cmovL_bso_stackSlotLNode();
+ MachNode *m1 = new loadConL16Node();
+ MachNode *m2 = new cmovL_bso_stackSlotLNode();
// inputs for new nodes
m1->add_req(n_region);
@@ -9952,7 +9952,7 @@ instruct cmovL_bso_stackSlotL_conLvalue0_Ex(iRegLdst dst, flagsReg crx, stackSlo
// operands for new nodes
m1->_opnds[0] = op_dst;
- m1->_opnds[1] = new (C) immL16Oper(0);
+ m1->_opnds[1] = new immL16Oper(0);
m2->_opnds[0] = op_dst;
m2->_opnds[1] = op_crx;
m2->_opnds[2] = op_mem;
@@ -10288,8 +10288,8 @@ instruct cmovI_conIvalueMinus1_conIvalue0_conIvalue1_Ex(iRegIdst dst, flagsReg c
//
// Create new nodes.
- MachNode *m1 = new (C) loadConI16Node();
- MachNode *m2 = new (C) cmovI_conIvalueMinus1_conIvalue1Node();
+ MachNode *m1 = new loadConI16Node();
+ MachNode *m2 = new cmovI_conIvalueMinus1_conIvalue1Node();
// inputs for new nodes
m1->add_req(n_region);
@@ -10298,7 +10298,7 @@ instruct cmovI_conIvalueMinus1_conIvalue0_conIvalue1_Ex(iRegIdst dst, flagsReg c
// operands for new nodes
m1->_opnds[0] = op_dst;
- m1->_opnds[1] = new (C) immI16Oper(0);
+ m1->_opnds[1] = new immI16Oper(0);
m2->_opnds[0] = op_dst;
m2->_opnds[1] = op_crx;
@@ -10623,8 +10623,8 @@ instruct cmpF_reg_reg_Ex(flagsReg crx, regF src1, regF src2) %{
//
// Create new nodes.
- MachNode *m1 = new (C) cmpFUnordered_reg_regNode();
- MachNode *m2 = new (C) cmov_bns_lessNode();
+ MachNode *m1 = new cmpFUnordered_reg_regNode();
+ MachNode *m2 = new cmov_bns_lessNode();
// inputs for new nodes
m1->add_req(n_region, n_src1, n_src2);
@@ -10698,8 +10698,8 @@ instruct cmpD_reg_reg_Ex(flagsReg crx, regD src1, regD src2) %{
//
// create new nodes
- MachNode *m1 = new (C) cmpDUnordered_reg_regNode();
- MachNode *m2 = new (C) cmov_bns_lessNode();
+ MachNode *m1 = new cmpDUnordered_reg_regNode();
+ MachNode *m2 = new cmov_bns_lessNode();
// inputs for new nodes
m1->add_req(n_region, n_src1, n_src2);
diff --git a/hotspot/src/cpu/x86/vm/x86_32.ad b/hotspot/src/cpu/x86/vm/x86_32.ad
index 63a7a066304..c246f2d2deb 100644
--- a/hotspot/src/cpu/x86/vm/x86_32.ad
+++ b/hotspot/src/cpu/x86/vm/x86_32.ad
@@ -1401,22 +1401,22 @@ void Matcher::pd_implicit_null_fixup(MachNode *node, uint idx) {
// No transformation necessary.
return;
case INDIRECT:
- new_memory = new (C) indirect_win95_safeOper( );
+ new_memory = new indirect_win95_safeOper( );
break;
case INDOFFSET8:
- new_memory = new (C) indOffset8_win95_safeOper(memory->disp(NULL, NULL, 0));
+ new_memory = new indOffset8_win95_safeOper(memory->disp(NULL, NULL, 0));
break;
case INDOFFSET32:
- new_memory = new (C) indOffset32_win95_safeOper(memory->disp(NULL, NULL, 0));
+ new_memory = new indOffset32_win95_safeOper(memory->disp(NULL, NULL, 0));
break;
case INDINDEXOFFSET:
- new_memory = new (C) indIndexOffset_win95_safeOper(memory->disp(NULL, NULL, 0));
+ new_memory = new indIndexOffset_win95_safeOper(memory->disp(NULL, NULL, 0));
break;
case INDINDEXSCALE:
- new_memory = new (C) indIndexScale_win95_safeOper(memory->scale());
+ new_memory = new indIndexScale_win95_safeOper(memory->scale());
break;
case INDINDEXSCALEOFFSET:
- new_memory = new (C) indIndexScaleOffset_win95_safeOper(memory->scale(), memory->disp(NULL, NULL, 0));
+ new_memory = new indIndexScaleOffset_win95_safeOper(memory->scale(), memory->disp(NULL, NULL, 0));
break;
case LOAD_LONG_INDIRECT:
case LOAD_LONG_INDOFFSET32:
diff --git a/hotspot/src/share/vm/adlc/output_c.cpp b/hotspot/src/share/vm/adlc/output_c.cpp
index bd2393c578c..6169c8f62b7 100644
--- a/hotspot/src/share/vm/adlc/output_c.cpp
+++ b/hotspot/src/share/vm/adlc/output_c.cpp
@@ -1000,7 +1000,7 @@ void ArchDesc::build_pipe_classes(FILE *fp_cpp) {
fprintf(fp_cpp, "void Bundle::initialize_nops(MachNode * nop_list[%d], Compile *C) {\n", nopcnt);
int i = 0;
for ( _pipeline->_noplist.reset(); (nop = _pipeline->_noplist.iter()) != NULL; i++ ) {
- fprintf(fp_cpp, " nop_list[%d] = (MachNode *) new (C) %sNode();\n", i, nop);
+ fprintf(fp_cpp, " nop_list[%d] = (MachNode *) new %sNode();\n", i, nop);
}
fprintf(fp_cpp, "};\n\n");
fprintf(fp_cpp, "#ifndef PRODUCT\n");
@@ -1328,7 +1328,7 @@ static void generate_peepreplace( FILE *fp, FormDict &globals, PeepMatch *pmatch
preplace->next_instruction(root_inst);
InstructForm *root_form = globals[root_inst]->is_instruction();
assert( root_form != NULL, "Replacement instruction was not previously defined");
- fprintf(fp, " %sNode *root = new (C) %sNode();\n", root_inst, root_inst);
+ fprintf(fp, " %sNode *root = new %sNode();\n", root_inst, root_inst);
int inst_num;
const char *op_name;
@@ -1497,11 +1497,11 @@ void ArchDesc::defineExpand(FILE *fp, InstructForm *node) {
new_oper = frm->is_operand();
char *tmp = (char *)node->_exprule->_newopconst[new_id];
if (tmp == NULL) {
- fprintf(fp," MachOper *op%d = new (C) %sOper();\n",
+ fprintf(fp," MachOper *op%d = new %sOper();\n",
cnt, new_oper->_ident);
}
else {
- fprintf(fp," MachOper *op%d = new (C) %sOper(%s);\n",
+ fprintf(fp," MachOper *op%d = new %sOper(%s);\n",
cnt, new_oper->_ident, tmp);
}
}
@@ -1566,7 +1566,7 @@ void ArchDesc::defineExpand(FILE *fp, InstructForm *node) {
}
// Build the node for the instruction
- fprintf(fp,"\n %sNode *n%d = new (C) %sNode();\n", new_id, cnt, new_id);
+ fprintf(fp,"\n %sNode *n%d = new %sNode();\n", new_id, cnt, new_id);
// Add control edge for this node
fprintf(fp," n%d->add_req(_in[0]);\n", cnt);
// Build the operand for the value this node defines.
@@ -1729,7 +1729,7 @@ void ArchDesc::defineExpand(FILE *fp, InstructForm *node) {
declared_def = true;
}
if (op && op->_interface && op->_interface->is_RegInterface()) {
- fprintf(fp," def = new (C) MachTempNode(state->MachOperGenerator( %s, C ));\n",
+ fprintf(fp," def = new MachTempNode(state->MachOperGenerator( %s, C ));\n",
machOperEnum(op->_ident));
fprintf(fp," add_req(def);\n");
// The operand for TEMP is already constructed during
@@ -1760,7 +1760,7 @@ void ArchDesc::defineExpand(FILE *fp, InstructForm *node) {
}
fprintf(fp," kill = ");
- fprintf(fp,"new (C) MachProjNode( %s, %d, (%s), Op_%s );\n",
+ fprintf(fp,"new MachProjNode( %s, %d, (%s), Op_%s );\n",
machNode, proj_no++, regmask, ideal_type);
fprintf(fp," proj_list.push(kill);\n");
}
@@ -2840,7 +2840,7 @@ static void defineIn_RegMask(FILE *fp, FormDict &globals, OperandForm &oper) {
// generate code to create a clone for a class derived from MachOper
//
// (0) MachOper *MachOperXOper::clone(Compile* C) const {
-// (1) return new (C) MachXOper( _ccode, _c0, _c1, ..., _cn);
+// (1) return new MachXOper( _ccode, _c0, _c1, ..., _cn);
// (2) }
//
static void defineClone(FILE *fp, FormDict &globalNames, OperandForm &oper) {
@@ -2849,7 +2849,7 @@ static void defineClone(FILE *fp, FormDict &globalNames, OperandForm &oper) {
const int num_consts = oper.num_consts(globalNames);
const bool is_ideal_bool = oper.is_ideal_bool();
if( (num_consts > 0) ) {
- fprintf(fp," return new (C) %sOper(", oper._ident);
+ fprintf(fp," return new %sOper(", oper._ident);
// generate parameters for constants
int i = 0;
fprintf(fp,"_c%d", i);
@@ -2861,7 +2861,7 @@ static void defineClone(FILE *fp, FormDict &globalNames, OperandForm &oper) {
}
else {
assert( num_consts == 0, "Currently support zero or one constant per operand clone function");
- fprintf(fp," return new (C) %sOper();\n", oper._ident);
+ fprintf(fp," return new %sOper();\n", oper._ident);
}
// finish method
fprintf(fp,"}\n");
@@ -3106,7 +3106,7 @@ void ArchDesc::defineClasses(FILE *fp) {
defineIn_RegMask(_CPP_MISC_file._fp, _globalNames, *oper);
fprintf(fp,"MachOper *%sOper::clone(Compile* C) const {\n", oper->_ident);
- fprintf(fp," return new (C) %sOper(_label, _block_num);\n", oper->_ident);
+ fprintf(fp," return new %sOper(_label, _block_num);\n", oper->_ident);
fprintf(fp,"}\n");
fprintf(fp,"uint %sOper::opcode() const { return %s; }\n",
@@ -3125,7 +3125,7 @@ void ArchDesc::defineClasses(FILE *fp) {
defineIn_RegMask(_CPP_MISC_file._fp, _globalNames, *oper);
fprintf(fp,"MachOper *%sOper::clone(Compile* C) const {\n", oper->_ident);
- fprintf(fp," return new (C) %sOper(_method);\n", oper->_ident);
+ fprintf(fp," return new %sOper(_method);\n", oper->_ident);
fprintf(fp,"}\n");
fprintf(fp,"uint %sOper::opcode() const { return %s; }\n",
@@ -3815,7 +3815,7 @@ static void genMachOperCase(FILE *fp, FormDict &globalNames, ArchDesc &AD,
// Generate the case statement for this opcode
fprintf(fp, " case %s:", opEnumName);
- fprintf(fp, "\n return new (C) %sOper(", opName);
+ fprintf(fp, "\n return new %sOper(", opName);
// Access parameters for constructor from the stat object
//
// Build access to condition code value
@@ -3894,7 +3894,7 @@ void ArchDesc::buildMachNode(FILE *fp_cpp, InstructForm *inst, const char *inden
const char *opClass = inst->_ident;
// Create the MachNode object
- fprintf(fp_cpp, "%s %sNode *node = new (C) %sNode();\n",indent, opClass,opClass);
+ fprintf(fp_cpp, "%s %sNode *node = new %sNode();\n",indent, opClass,opClass);
if ( (inst->num_post_match_opnds() != 0) ) {
// Instruction that contains operands which are not in match rule.
@@ -3936,7 +3936,7 @@ void ArchDesc::buildMachNode(FILE *fp_cpp, InstructForm *inst, const char *inden
// Check for multiple constants and then fill them in.
// Just like MachOperGenerator
const char *opName = inst->_matrule->_rChild->_opType;
- fprintf(fp_cpp, "new (C) %sOper(", opName);
+ fprintf(fp_cpp, "new %sOper(", opName);
// Grab operand form
OperandForm *op = (_globalNames[opName])->is_operand();
// Look up the number of constants
@@ -4010,7 +4010,7 @@ bool InstructForm::define_cisc_version(ArchDesc &AD, FILE *fp_cpp) {
fprintf(fp_cpp, "// Build CISC version of this instruction\n");
fprintf(fp_cpp, "MachNode *%sNode::cisc_version( int offset, Compile* C ) {\n", this->_ident);
// Create the MachNode object
- fprintf(fp_cpp, " %sNode *node = new (C) %sNode();\n", name, name);
+ fprintf(fp_cpp, " %sNode *node = new %sNode();\n", name, name);
// Fill in the bottom_type where requested
if ( this->captures_bottom_type(AD.globalNames()) ) {
fprintf(fp_cpp, " node->_bottom_type = bottom_type();\n");
@@ -4026,7 +4026,7 @@ bool InstructForm::define_cisc_version(ArchDesc &AD, FILE *fp_cpp) {
fprintf(fp_cpp, " fill_new_machnode(node, C);\n");
// Construct operand to access [stack_pointer + offset]
fprintf(fp_cpp, " // Construct operand to access [stack_pointer + offset]\n");
- fprintf(fp_cpp, " node->set_opnd_array(cisc_operand(), new (C) %sOper(offset));\n", cisc_oper_name);
+ fprintf(fp_cpp, " node->set_opnd_array(cisc_operand(), new %sOper(offset));\n", cisc_oper_name);
fprintf(fp_cpp, "\n");
// Return result and exit scope
@@ -4057,7 +4057,7 @@ bool InstructForm::define_short_branch_methods(ArchDesc &AD, FILE *fp_cpp) {
fprintf(fp_cpp, "// Build short branch version of this instruction\n");
fprintf(fp_cpp, "MachNode *%sNode::short_branch_version(Compile* C) {\n", this->_ident);
// Create the MachNode object
- fprintf(fp_cpp, " %sNode *node = new (C) %sNode();\n", name, name);
+ fprintf(fp_cpp, " %sNode *node = new %sNode();\n", name, name);
if( is_ideal_if() ) {
fprintf(fp_cpp, " node->_prob = _prob;\n");
fprintf(fp_cpp, " node->_fcnt = _fcnt;\n");
diff --git a/hotspot/src/share/vm/opto/addnode.cpp b/hotspot/src/share/vm/opto/addnode.cpp
index a586eba1322..a88ee2e1d22 100644
--- a/hotspot/src/share/vm/opto/addnode.cpp
+++ b/hotspot/src/share/vm/opto/addnode.cpp
@@ -254,47 +254,46 @@ Node *AddINode::Ideal(PhaseGVN *phase, bool can_reshape) {
const Type *t_sub1 = phase->type( in1->in(1) );
const Type *t_2 = phase->type( in2 );
if( t_sub1->singleton() && t_2->singleton() && t_sub1 != Type::TOP && t_2 != Type::TOP )
- return new (phase->C) SubINode(phase->makecon( add_ring( t_sub1, t_2 ) ),
- in1->in(2) );
+ return new SubINode(phase->makecon( add_ring( t_sub1, t_2 ) ), in1->in(2) );
// Convert "(a-b)+(c-d)" into "(a+c)-(b+d)"
if( op2 == Op_SubI ) {
// Check for dead cycle: d = (a-b)+(c-d)
assert( in1->in(2) != this && in2->in(2) != this,
"dead loop in AddINode::Ideal" );
- Node *sub = new (phase->C) SubINode(NULL, NULL);
- sub->init_req(1, phase->transform(new (phase->C) AddINode(in1->in(1), in2->in(1) ) ));
- sub->init_req(2, phase->transform(new (phase->C) AddINode(in1->in(2), in2->in(2) ) ));
+ Node *sub = new SubINode(NULL, NULL);
+ sub->init_req(1, phase->transform(new AddINode(in1->in(1), in2->in(1) ) ));
+ sub->init_req(2, phase->transform(new AddINode(in1->in(2), in2->in(2) ) ));
return sub;
}
// Convert "(a-b)+(b+c)" into "(a+c)"
if( op2 == Op_AddI && in1->in(2) == in2->in(1) ) {
assert(in1->in(1) != this && in2->in(2) != this,"dead loop in AddINode::Ideal");
- return new (phase->C) AddINode(in1->in(1), in2->in(2));
+ return new AddINode(in1->in(1), in2->in(2));
}
// Convert "(a-b)+(c+b)" into "(a+c)"
if( op2 == Op_AddI && in1->in(2) == in2->in(2) ) {
assert(in1->in(1) != this && in2->in(1) != this,"dead loop in AddINode::Ideal");
- return new (phase->C) AddINode(in1->in(1), in2->in(1));
+ return new AddINode(in1->in(1), in2->in(1));
}
// Convert "(a-b)+(b-c)" into "(a-c)"
if( op2 == Op_SubI && in1->in(2) == in2->in(1) ) {
assert(in1->in(1) != this && in2->in(2) != this,"dead loop in AddINode::Ideal");
- return new (phase->C) SubINode(in1->in(1), in2->in(2));
+ return new SubINode(in1->in(1), in2->in(2));
}
// Convert "(a-b)+(c-a)" into "(c-b)"
if( op2 == Op_SubI && in1->in(1) == in2->in(2) ) {
assert(in1->in(2) != this && in2->in(1) != this,"dead loop in AddINode::Ideal");
- return new (phase->C) SubINode(in2->in(1), in1->in(2));
+ return new SubINode(in2->in(1), in1->in(2));
}
}
// Convert "x+(0-y)" into "(x-y)"
if( op2 == Op_SubI && phase->type(in2->in(1)) == TypeInt::ZERO )
- return new (phase->C) SubINode(in1, in2->in(2) );
+ return new SubINode(in1, in2->in(2) );
// Convert "(0-y)+x" into "(x-y)"
if( op1 == Op_SubI && phase->type(in1->in(1)) == TypeInt::ZERO )
- return new (phase->C) SubINode( in2, in1->in(2) );
+ return new SubINode( in2, in1->in(2) );
// Convert (x>>>z)+y into (x+(y<>>z for small constant z and y.
// Helps with array allocation math constant folding
@@ -315,8 +314,8 @@ Node *AddINode::Ideal(PhaseGVN *phase, bool can_reshape) {
if( z < 5 && -5 < y && y < 0 ) {
const Type *t_in11 = phase->type(in1->in(1));
if( t_in11 != Type::TOP && (t_in11->is_int()->_lo >= -(y << z)) ) {
- Node *a = phase->transform( new (phase->C) AddINode( in1->in(1), phase->intcon(y<C) URShiftINode( a, in1->in(2) );
+ Node *a = phase->transform( new AddINode( in1->in(1), phase->intcon(y<in(2) );
}
}
}
@@ -387,47 +386,46 @@ Node *AddLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
const Type *t_sub1 = phase->type( in1->in(1) );
const Type *t_2 = phase->type( in2 );
if( t_sub1->singleton() && t_2->singleton() && t_sub1 != Type::TOP && t_2 != Type::TOP )
- return new (phase->C) SubLNode(phase->makecon( add_ring( t_sub1, t_2 ) ),
- in1->in(2) );
+ return new SubLNode(phase->makecon( add_ring( t_sub1, t_2 ) ), in1->in(2) );
// Convert "(a-b)+(c-d)" into "(a+c)-(b+d)"
if( op2 == Op_SubL ) {
// Check for dead cycle: d = (a-b)+(c-d)
assert( in1->in(2) != this && in2->in(2) != this,
"dead loop in AddLNode::Ideal" );
- Node *sub = new (phase->C) SubLNode(NULL, NULL);
- sub->init_req(1, phase->transform(new (phase->C) AddLNode(in1->in(1), in2->in(1) ) ));
- sub->init_req(2, phase->transform(new (phase->C) AddLNode(in1->in(2), in2->in(2) ) ));
+ Node *sub = new SubLNode(NULL, NULL);
+ sub->init_req(1, phase->transform(new AddLNode(in1->in(1), in2->in(1) ) ));
+ sub->init_req(2, phase->transform(new AddLNode(in1->in(2), in2->in(2) ) ));
return sub;
}
// Convert "(a-b)+(b+c)" into "(a+c)"
if( op2 == Op_AddL && in1->in(2) == in2->in(1) ) {
assert(in1->in(1) != this && in2->in(2) != this,"dead loop in AddLNode::Ideal");
- return new (phase->C) AddLNode(in1->in(1), in2->in(2));
+ return new AddLNode(in1->in(1), in2->in(2));
}
// Convert "(a-b)+(c+b)" into "(a+c)"
if( op2 == Op_AddL && in1->in(2) == in2->in(2) ) {
assert(in1->in(1) != this && in2->in(1) != this,"dead loop in AddLNode::Ideal");
- return new (phase->C) AddLNode(in1->in(1), in2->in(1));
+ return new AddLNode(in1->in(1), in2->in(1));
}
// Convert "(a-b)+(b-c)" into "(a-c)"
if( op2 == Op_SubL && in1->in(2) == in2->in(1) ) {
assert(in1->in(1) != this && in2->in(2) != this,"dead loop in AddLNode::Ideal");
- return new (phase->C) SubLNode(in1->in(1), in2->in(2));
+ return new SubLNode(in1->in(1), in2->in(2));
}
// Convert "(a-b)+(c-a)" into "(c-b)"
if( op2 == Op_SubL && in1->in(1) == in1->in(2) ) {
assert(in1->in(2) != this && in2->in(1) != this,"dead loop in AddLNode::Ideal");
- return new (phase->C) SubLNode(in2->in(1), in1->in(2));
+ return new SubLNode(in2->in(1), in1->in(2));
}
}
// Convert "x+(0-y)" into "(x-y)"
if( op2 == Op_SubL && phase->type(in2->in(1)) == TypeLong::ZERO )
- return new (phase->C) SubLNode( in1, in2->in(2) );
+ return new SubLNode( in1, in2->in(2) );
// Convert "(0-y)+x" into "(x-y)"
if( op1 == Op_SubL && phase->type(in1->in(1)) == TypeInt::ZERO )
- return new (phase->C) SubLNode( in2, in1->in(2) );
+ return new SubLNode( in2, in1->in(2) );
// Convert "X+X+X+X+X...+X+Y" into "k*X+Y" or really convert "X+(X+Y)"
// into "(X<<1)+Y" and let shift-folding happen.
@@ -435,8 +433,8 @@ Node *AddLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
in2->in(1) == in1 &&
op1 != Op_ConL &&
0 ) {
- Node *shift = phase->transform(new (phase->C) LShiftLNode(in1,phase->intcon(1)));
- return new (phase->C) AddLNode(shift,in2->in(2));
+ Node *shift = phase->transform(new LShiftLNode(in1,phase->intcon(1)));
+ return new AddLNode(shift,in2->in(2));
}
return AddNode::Ideal(phase, can_reshape);
@@ -596,7 +594,7 @@ Node *AddPNode::Ideal(PhaseGVN *phase, bool can_reshape) {
offset = phase->MakeConX(t2->get_con() + t12->get_con());
} else {
// Else move the constant to the right. ((A+con)+B) into ((A+B)+con)
- address = phase->transform(new (phase->C) AddPNode(in(Base),addp->in(Address),in(Offset)));
+ address = phase->transform(new AddPNode(in(Base),addp->in(Address),in(Offset)));
offset = addp->in(Offset);
}
PhaseIterGVN *igvn = phase->is_IterGVN();
@@ -616,7 +614,7 @@ Node *AddPNode::Ideal(PhaseGVN *phase, bool can_reshape) {
// If this is a NULL+long form (from unsafe accesses), switch to a rawptr.
if (phase->type(in(Address)) == TypePtr::NULL_PTR) {
Node* offset = in(Offset);
- return new (phase->C) CastX2PNode(offset);
+ return new CastX2PNode(offset);
}
}
@@ -628,7 +626,7 @@ Node *AddPNode::Ideal(PhaseGVN *phase, bool can_reshape) {
if( add->Opcode() == Op_AddX && add->in(1) != add ) {
const Type *t22 = phase->type( add->in(2) );
if( t22->singleton() && (t22 != Type::TOP) ) { // Right input is an add of a constant?
- set_req(Address, phase->transform(new (phase->C) AddPNode(in(Base),in(Address),add->in(1))));
+ set_req(Address, phase->transform(new AddPNode(in(Base),in(Address),add->in(1))));
set_req(Offset, add->in(2));
PhaseIterGVN *igvn = phase->is_IterGVN();
if (add->outcnt() == 0 && igvn) {
@@ -858,7 +856,7 @@ Node *MinINode::Ideal(PhaseGVN *phase, bool can_reshape) {
// to force a right-spline graph for the rest of MinINode::Ideal().
if( l->Opcode() == Op_MinI ) {
assert( l != l->in(1), "dead loop in MinINode::Ideal" );
- r = phase->transform(new (phase->C) MinINode(l->in(2),r));
+ r = phase->transform(new MinINode(l->in(2),r));
l = l->in(1);
set_req(1, l);
set_req(2, r);
@@ -906,18 +904,18 @@ Node *MinINode::Ideal(PhaseGVN *phase, bool can_reshape) {
}
if( x->_idx > y->_idx )
- return new (phase->C) MinINode(r->in(1),phase->transform(new (phase->C) MinINode(l,r->in(2))));
+ return new MinINode(r->in(1),phase->transform(new MinINode(l,r->in(2))));
// See if covers: MIN2(x+c0,MIN2(y+c1,z))
if( !phase->eqv(x,y) ) return NULL;
// If (y == x) transform MIN2(x+c0, MIN2(x+c1,z)) into
// MIN2(x+c0 or x+c1 which less, z).
- return new (phase->C) MinINode(phase->transform(new (phase->C) AddINode(x,phase->intcon(MIN2(x_off,y_off)))),r->in(2));
+ return new MinINode(phase->transform(new AddINode(x,phase->intcon(MIN2(x_off,y_off)))),r->in(2));
} else {
// See if covers: MIN2(x+c0,y+c1)
if( !phase->eqv(x,y) ) return NULL;
// If (y == x) transform MIN2(x+c0,x+c1) into x+c0 or x+c1 which less.
- return new (phase->C) AddINode(x,phase->intcon(MIN2(x_off,y_off)));
+ return new AddINode(x,phase->intcon(MIN2(x_off,y_off)));
}
}
diff --git a/hotspot/src/share/vm/opto/block.cpp b/hotspot/src/share/vm/opto/block.cpp
index 85598d636a3..7c32b68d015 100644
--- a/hotspot/src/share/vm/opto/block.cpp
+++ b/hotspot/src/share/vm/opto/block.cpp
@@ -373,7 +373,7 @@ PhaseCFG::PhaseCFG(Arena* arena, RootNode* root, Matcher& matcher)
// I'll need a few machine-specific GotoNodes. Make an Ideal GotoNode,
// then Match it into a machine-specific Node. Then clone the machine
// Node on demand.
- Node *x = new (C) GotoNode(NULL);
+ Node *x = new GotoNode(NULL);
x->init_req(0, x);
_goto = matcher.match_tree(x);
assert(_goto != NULL, "");
@@ -426,7 +426,7 @@ uint PhaseCFG::build_cfg() {
!p->is_block_start() );
// Make the block begin with one of Region or StartNode.
if( !p->is_block_start() ) {
- RegionNode *r = new (C) RegionNode( 2 );
+ RegionNode *r = new RegionNode( 2 );
r->init_req(1, p); // Insert RegionNode in the way
proj->set_req(0, r); // Insert RegionNode in the way
p = r;
@@ -501,7 +501,7 @@ void PhaseCFG::insert_goto_at(uint block_no, uint succ_no) {
// get ProjNode corresponding to the succ_no'th successor of the in block
ProjNode* proj = in->get_node(in->number_of_nodes() - in->_num_succs + succ_no)->as_Proj();
// create region for basic block
- RegionNode* region = new (C) RegionNode(2);
+ RegionNode* region = new RegionNode(2);
region->init_req(1, proj);
// setup corresponding basic block
Block* block = new (_block_arena) Block(_block_arena, region);
diff --git a/hotspot/src/share/vm/opto/callGenerator.cpp b/hotspot/src/share/vm/opto/callGenerator.cpp
index 249e0215c60..563f5ae4d78 100644
--- a/hotspot/src/share/vm/opto/callGenerator.cpp
+++ b/hotspot/src/share/vm/opto/callGenerator.cpp
@@ -136,7 +136,7 @@ JVMState* DirectCallGenerator::generate(JVMState* jvms, Parse* parent_parser) {
kit.C->log()->elem("direct_call bci='%d'", jvms->bci());
}
- CallStaticJavaNode *call = new (kit.C) CallStaticJavaNode(kit.C, tf(), target, method(), kit.bci());
+ CallStaticJavaNode *call = new CallStaticJavaNode(kit.C, tf(), target, method(), kit.bci());
_call_node = call; // Save the call node in case we need it later
if (!is_static) {
// Make an explicit receiver null_check as part of this call.
@@ -225,7 +225,7 @@ JVMState* VirtualCallGenerator::generate(JVMState* jvms, Parse* parent_parser) {
"no vtable calls if +UseInlineCaches ");
address target = SharedRuntime::get_resolve_virtual_call_stub();
// Normal inline cache used for call
- CallDynamicJavaNode *call = new (kit.C) CallDynamicJavaNode(tf(), target, method(), _vtable_index, kit.bci());
+ CallDynamicJavaNode *call = new CallDynamicJavaNode(tf(), target, method(), _vtable_index, kit.bci());
kit.set_arguments_for_java_call(call);
kit.set_edges_for_java_call(call);
Node* ret = kit.set_results_for_java_call(call);
@@ -350,7 +350,7 @@ void LateInlineCallGenerator::do_late_inline() {
JVMState* old_jvms = call->jvms();
JVMState* jvms = old_jvms->clone_shallow(C);
uint size = call->req();
- SafePointNode* map = new (C) SafePointNode(size, jvms);
+ SafePointNode* map = new SafePointNode(size, jvms);
for (uint i1 = 0; i1 < size; i1++) {
map->init_req(i1, call->in(i1));
}
@@ -717,7 +717,7 @@ JVMState* PredictedCallGenerator::generate(JVMState* jvms, Parse* parent_parser)
// Finish the diamond.
kit.C->set_has_split_ifs(true); // Has chance for split-if optimization
- RegionNode* region = new (kit.C) RegionNode(3);
+ RegionNode* region = new RegionNode(3);
region->init_req(1, kit.control());
region->init_req(2, slow_map->control());
kit.set_control(gvn.transform(region));
@@ -825,7 +825,7 @@ CallGenerator* CallGenerator::for_method_handle_inline(JVMState* jvms, ciMethod*
const TypeOopPtr* arg_type = arg->bottom_type()->isa_oopptr();
const Type* sig_type = TypeOopPtr::make_from_klass(signature->accessing_klass());
if (arg_type != NULL && !arg_type->higher_equal(sig_type)) {
- Node* cast_obj = gvn.transform(new (C) CheckCastPPNode(kit.control(), arg, sig_type));
+ Node* cast_obj = gvn.transform(new CheckCastPPNode(kit.control(), arg, sig_type));
kit.set_argument(0, cast_obj);
}
}
@@ -837,7 +837,7 @@ CallGenerator* CallGenerator::for_method_handle_inline(JVMState* jvms, ciMethod*
const TypeOopPtr* arg_type = arg->bottom_type()->isa_oopptr();
const Type* sig_type = TypeOopPtr::make_from_klass(t->as_klass());
if (arg_type != NULL && !arg_type->higher_equal(sig_type)) {
- Node* cast_obj = gvn.transform(new (C) CheckCastPPNode(kit.control(), arg, sig_type));
+ Node* cast_obj = gvn.transform(new CheckCastPPNode(kit.control(), arg, sig_type));
kit.set_argument(receiver_skip + i, cast_obj);
}
}
@@ -978,7 +978,7 @@ JVMState* PredictedIntrinsicGenerator::generate(JVMState* jvms, Parse* parent_pa
// Finish the diamond.
kit.C->set_has_split_ifs(true); // Has chance for split-if optimization
- RegionNode* region = new (kit.C) RegionNode(3);
+ RegionNode* region = new RegionNode(3);
region->init_req(1, kit.control());
region->init_req(2, slow_map->control());
kit.set_control(gvn.transform(region));
diff --git a/hotspot/src/share/vm/opto/callnode.cpp b/hotspot/src/share/vm/opto/callnode.cpp
index b2cd166b4dd..848e3aeb029 100644
--- a/hotspot/src/share/vm/opto/callnode.cpp
+++ b/hotspot/src/share/vm/opto/callnode.cpp
@@ -74,20 +74,20 @@ Node *StartNode::match( const ProjNode *proj, const Matcher *match ) {
case TypeFunc::Control:
case TypeFunc::I_O:
case TypeFunc::Memory:
- return new (match->C) MachProjNode(this,proj->_con,RegMask::Empty,MachProjNode::unmatched_proj);
+ return new MachProjNode(this,proj->_con,RegMask::Empty,MachProjNode::unmatched_proj);
case TypeFunc::FramePtr:
- return new (match->C) MachProjNode(this,proj->_con,Matcher::c_frame_ptr_mask, Op_RegP);
+ return new MachProjNode(this,proj->_con,Matcher::c_frame_ptr_mask, Op_RegP);
case TypeFunc::ReturnAdr:
- return new (match->C) MachProjNode(this,proj->_con,match->_return_addr_mask,Op_RegP);
+ return new MachProjNode(this,proj->_con,match->_return_addr_mask,Op_RegP);
case TypeFunc::Parms:
default: {
uint parm_num = proj->_con - TypeFunc::Parms;
const Type *t = _domain->field_at(proj->_con);
if (t->base() == Type::Half) // 2nd half of Longs and Doubles
- return new (match->C) ConNode(Type::TOP);
+ return new ConNode(Type::TOP);
uint ideal_reg = t->ideal_reg();
RegMask &rm = match->_calling_convention_mask[parm_num];
- return new (match->C) MachProjNode(this,proj->_con,rm,ideal_reg);
+ return new MachProjNode(this,proj->_con,rm,ideal_reg);
}
}
return NULL;
@@ -685,12 +685,12 @@ Node *CallNode::match( const ProjNode *proj, const Matcher *match ) {
case TypeFunc::Control:
case TypeFunc::I_O:
case TypeFunc::Memory:
- return new (match->C) MachProjNode(this,proj->_con,RegMask::Empty,MachProjNode::unmatched_proj);
+ return new MachProjNode(this,proj->_con,RegMask::Empty,MachProjNode::unmatched_proj);
case TypeFunc::Parms+1: // For LONG & DOUBLE returns
assert(tf()->_range->field_at(TypeFunc::Parms+1) == Type::HALF, "");
// 2nd half of doubles and longs
- return new (match->C) MachProjNode(this,proj->_con, RegMask::Empty, (uint)OptoReg::Bad);
+ return new MachProjNode(this,proj->_con, RegMask::Empty, (uint)OptoReg::Bad);
case TypeFunc::Parms: { // Normal returns
uint ideal_reg = tf()->range()->field_at(TypeFunc::Parms)->ideal_reg();
@@ -700,7 +700,7 @@ Node *CallNode::match( const ProjNode *proj, const Matcher *match ) {
RegMask rm = RegMask(regs.first());
if( OptoReg::is_valid(regs.second()) )
rm.Insert( regs.second() );
- return new (match->C) MachProjNode(this,proj->_con,rm,ideal_reg);
+ return new MachProjNode(this,proj->_con,rm,ideal_reg);
}
case TypeFunc::ReturnAdr:
@@ -1288,10 +1288,10 @@ Node* AllocateArrayNode::Ideal(PhaseGVN *phase, bool can_reshape) {
Node* nproj = catchproj->clone();
igvn->register_new_node_with_optimizer(nproj);
- Node *frame = new (phase->C) ParmNode( phase->C->start(), TypeFunc::FramePtr );
+ Node *frame = new ParmNode( phase->C->start(), TypeFunc::FramePtr );
frame = phase->transform(frame);
// Halt & Catch Fire
- Node *halt = new (phase->C) HaltNode( nproj, frame );
+ Node *halt = new HaltNode( nproj, frame );
phase->C->root()->add_req(halt);
phase->transform(halt);
@@ -1333,7 +1333,7 @@ Node *AllocateArrayNode::make_ideal_length(const TypeOopPtr* oop_type, PhaseTran
if (!allow_new_nodes) return NULL;
// Create a cast which is control dependent on the initialization to
// propagate the fact that the array length must be positive.
- length = new (phase->C) CastIINode(length, narrow_length_type);
+ length = new CastIINode(length, narrow_length_type);
length->set_req(0, initialization()->proj_out(0));
}
}
diff --git a/hotspot/src/share/vm/opto/castnode.cpp b/hotspot/src/share/vm/opto/castnode.cpp
index b8a35a72df9..afaddaf72fb 100644
--- a/hotspot/src/share/vm/opto/castnode.cpp
+++ b/hotspot/src/share/vm/opto/castnode.cpp
@@ -228,11 +228,11 @@ static inline Node* addP_of_X2P(PhaseGVN *phase,
Node* dispX,
bool negate = false) {
if (negate) {
- dispX = new (phase->C) SubXNode(phase->MakeConX(0), phase->transform(dispX));
+ dispX = new SubXNode(phase->MakeConX(0), phase->transform(dispX));
}
- return new (phase->C) AddPNode(phase->C->top(),
- phase->transform(new (phase->C) CastX2PNode(base)),
- phase->transform(dispX));
+ return new AddPNode(phase->C->top(),
+ phase->transform(new CastX2PNode(base)),
+ phase->transform(dispX));
}
Node *CastX2PNode::Ideal(PhaseGVN *phase, bool can_reshape) {
diff --git a/hotspot/src/share/vm/opto/cfgnode.cpp b/hotspot/src/share/vm/opto/cfgnode.cpp
index 02ec25fda2d..d99118edc83 100644
--- a/hotspot/src/share/vm/opto/cfgnode.cpp
+++ b/hotspot/src/share/vm/opto/cfgnode.cpp
@@ -662,17 +662,17 @@ Node *RegionNode::Ideal(PhaseGVN *phase, bool can_reshape) {
convf2i->in(1) == bot_in ) {
// Matched pattern, including LShiftI; RShiftI, replace with integer compares
// max test
- Node *cmp = gvn->register_new_node_with_optimizer(new (phase->C) CmpINode( convf2i, min ));
- Node *boo = gvn->register_new_node_with_optimizer(new (phase->C) BoolNode( cmp, BoolTest::lt ));
- IfNode *iff = (IfNode*)gvn->register_new_node_with_optimizer(new (phase->C) IfNode( top_if->in(0), boo, PROB_UNLIKELY_MAG(5), top_if->_fcnt ));
- Node *if_min= gvn->register_new_node_with_optimizer(new (phase->C) IfTrueNode (iff));
- Node *ifF = gvn->register_new_node_with_optimizer(new (phase->C) IfFalseNode(iff));
+ Node *cmp = gvn->register_new_node_with_optimizer(new CmpINode( convf2i, min ));
+ Node *boo = gvn->register_new_node_with_optimizer(new BoolNode( cmp, BoolTest::lt ));
+ IfNode *iff = (IfNode*)gvn->register_new_node_with_optimizer(new IfNode( top_if->in(0), boo, PROB_UNLIKELY_MAG(5), top_if->_fcnt ));
+ Node *if_min= gvn->register_new_node_with_optimizer(new IfTrueNode (iff));
+ Node *ifF = gvn->register_new_node_with_optimizer(new IfFalseNode(iff));
// min test
- cmp = gvn->register_new_node_with_optimizer(new (phase->C) CmpINode( convf2i, max ));
- boo = gvn->register_new_node_with_optimizer(new (phase->C) BoolNode( cmp, BoolTest::gt ));
- iff = (IfNode*)gvn->register_new_node_with_optimizer(new (phase->C) IfNode( ifF, boo, PROB_UNLIKELY_MAG(5), bot_if->_fcnt ));
- Node *if_max= gvn->register_new_node_with_optimizer(new (phase->C) IfTrueNode (iff));
- ifF = gvn->register_new_node_with_optimizer(new (phase->C) IfFalseNode(iff));
+ cmp = gvn->register_new_node_with_optimizer(new CmpINode( convf2i, max ));
+ boo = gvn->register_new_node_with_optimizer(new BoolNode( cmp, BoolTest::gt ));
+ iff = (IfNode*)gvn->register_new_node_with_optimizer(new IfNode( ifF, boo, PROB_UNLIKELY_MAG(5), bot_if->_fcnt ));
+ Node *if_max= gvn->register_new_node_with_optimizer(new IfTrueNode (iff));
+ ifF = gvn->register_new_node_with_optimizer(new IfFalseNode(iff));
// update input edges to region node
set_req_X( min_idx, if_min, gvn );
set_req_X( max_idx, if_max, gvn );
@@ -731,7 +731,7 @@ const TypePtr* flatten_phi_adr_type(const TypePtr* at) {
PhiNode* PhiNode::make(Node* r, Node* x, const Type *t, const TypePtr* at) {
uint preds = r->req(); // Number of predecessor paths
assert(t != Type::MEMORY || at == flatten_phi_adr_type(at), "flatten at");
- PhiNode* p = new (Compile::current()) PhiNode(r, t, at);
+ PhiNode* p = new PhiNode(r, t, at);
for (uint j = 1; j < preds; j++) {
// Fill in all inputs, except those which the region does not yet have
if (r->in(j) != NULL)
@@ -749,7 +749,7 @@ PhiNode* PhiNode::make_blank(Node* r, Node* x) {
const Type* t = x->bottom_type();
const TypePtr* at = NULL;
if (t == Type::MEMORY) at = flatten_phi_adr_type(x->adr_type());
- return new (Compile::current()) PhiNode(r, t, at);
+ return new PhiNode(r, t, at);
}
@@ -1258,9 +1258,9 @@ static Node *is_x2logic( PhaseGVN *phase, PhiNode *phi, int true_path ) {
} else return NULL;
// Build int->bool conversion
- Node *n = new (phase->C) Conv2BNode( cmp->in(1) );
+ Node *n = new Conv2BNode( cmp->in(1) );
if( flipped )
- n = new (phase->C) XorINode( phase->transform(n), phase->intcon(1) );
+ n = new XorINode( phase->transform(n), phase->intcon(1) );
return n;
}
@@ -1320,9 +1320,9 @@ static Node* is_cond_add(PhaseGVN *phase, PhiNode *phi, int true_path) {
if( q->is_Con() && phase->type(q) != TypeInt::ZERO && y->is_Con() )
return NULL;
- Node *cmplt = phase->transform( new (phase->C) CmpLTMaskNode(p,q) );
- Node *j_and = phase->transform( new (phase->C) AndINode(cmplt,y) );
- return new (phase->C) AddINode(j_and,x);
+ Node *cmplt = phase->transform( new CmpLTMaskNode(p,q) );
+ Node *j_and = phase->transform( new AndINode(cmplt,y) );
+ return new AddINode(j_and,x);
}
//------------------------------is_absolute------------------------------------
@@ -1384,17 +1384,17 @@ static Node* is_absolute( PhaseGVN *phase, PhiNode *phi_root, int true_path) {
if( sub->Opcode() != Op_SubF ||
sub->in(2) != x ||
phase->type(sub->in(1)) != tzero ) return NULL;
- x = new (phase->C) AbsFNode(x);
+ x = new AbsFNode(x);
if (flip) {
- x = new (phase->C) SubFNode(sub->in(1), phase->transform(x));
+ x = new SubFNode(sub->in(1), phase->transform(x));
}
} else {
if( sub->Opcode() != Op_SubD ||
sub->in(2) != x ||
phase->type(sub->in(1)) != tzero ) return NULL;
- x = new (phase->C) AbsDNode(x);
+ x = new AbsDNode(x);
if (flip) {
- x = new (phase->C) SubDNode(sub->in(1), phase->transform(x));
+ x = new SubDNode(sub->in(1), phase->transform(x));
}
}
@@ -1469,7 +1469,7 @@ static Node* split_flow_path(PhaseGVN *phase, PhiNode *phi) {
// Now start splitting out the flow paths that merge the same value.
// Split first the RegionNode.
PhaseIterGVN *igvn = phase->is_IterGVN();
- RegionNode *newr = new (phase->C) RegionNode(hit+1);
+ RegionNode *newr = new RegionNode(hit+1);
split_once(igvn, phi, val, r, newr);
// Now split all other Phis than this one
@@ -1781,13 +1781,13 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) {
}
if (doit) {
if (base == NULL) {
- base = new (phase->C) PhiNode(in(0), type, NULL);
+ base = new PhiNode(in(0), type, NULL);
for (uint i = 1; i < req(); i++) {
base->init_req(i, in(i)->in(AddPNode::Base));
}
phase->is_IterGVN()->register_new_node_with_optimizer(base);
}
- return new (phase->C) AddPNode(base, base, y);
+ return new AddPNode(base, base, y);
}
}
}
@@ -1864,7 +1864,7 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) {
// Phi(...MergeMem(m0, m1:AT1, m2:AT2)...) into
// MergeMem(Phi(...m0...), Phi:AT1(...m1...), Phi:AT2(...m2...))
PhaseIterGVN *igvn = phase->is_IterGVN();
- Node* hook = new (phase->C) Node(1);
+ Node* hook = new Node(1);
PhiNode* new_base = (PhiNode*) clone();
// Must eagerly register phis, since they participate in loops.
if (igvn) {
@@ -1961,7 +1961,7 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) {
} else {
narrow_t = TypeNarrowKlass::make(this->bottom_type()->is_ptr());
}
- PhiNode* new_phi = new (phase->C) PhiNode(r, narrow_t);
+ PhiNode* new_phi = new PhiNode(r, narrow_t);
uint orig_cnt = req();
for (uint i=1; iC) EncodePNode(ii, narrow_t);
+ new_ii = new EncodePNode(ii, narrow_t);
} else {
- new_ii = new (phase->C) EncodePKlassNode(ii, narrow_t);
+ new_ii = new EncodePKlassNode(ii, narrow_t);
}
igvn->register_new_node_with_optimizer(new_ii);
}
@@ -1986,9 +1986,9 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) {
}
igvn->register_new_node_with_optimizer(new_phi, this);
if (is_decodeN) {
- progress = new (phase->C) DecodeNNode(new_phi, bottom_type());
+ progress = new DecodeNNode(new_phi, bottom_type());
} else {
- progress = new (phase->C) DecodeNKlassNode(new_phi, bottom_type());
+ progress = new DecodeNKlassNode(new_phi, bottom_type());
}
}
}
diff --git a/hotspot/src/share/vm/opto/chaitin.cpp b/hotspot/src/share/vm/opto/chaitin.cpp
index f6e2065e26d..822d83a9c23 100644
--- a/hotspot/src/share/vm/opto/chaitin.cpp
+++ b/hotspot/src/share/vm/opto/chaitin.cpp
@@ -1730,7 +1730,7 @@ Node *PhaseChaitin::find_base_for_derived( Node **derived_base_map, Node *derive
// Now we see we need a base-Phi here to merge the bases
const Type *t = base->bottom_type();
- base = new (C) PhiNode( derived->in(0), t );
+ base = new PhiNode( derived->in(0), t );
for( i = 1; i < derived->req(); i++ ) {
base->init_req(i, find_base_for_derived(derived_base_map, derived->in(i), maxlrg));
t = t->meet(base->in(i)->bottom_type());
@@ -1800,7 +1800,7 @@ bool PhaseChaitin::stretch_base_pointer_live_ranges(ResourceArea *a) {
Block *phi_block = _cfg.get_block_for_node(phi);
if (_cfg.get_block_for_node(phi_block->pred(2)) == block) {
const RegMask *mask = C->matcher()->idealreg2spillmask[Op_RegI];
- Node *spill = new (C) MachSpillCopyNode(MachSpillCopyNode::LoopPhiInput, phi, *mask, *mask);
+ Node *spill = new MachSpillCopyNode(MachSpillCopyNode::LoopPhiInput, phi, *mask, *mask);
insert_proj( phi_block, 1, spill, maxlrg++ );
n->set_req(1,spill);
must_recompute_live = true;
diff --git a/hotspot/src/share/vm/opto/coalesce.cpp b/hotspot/src/share/vm/opto/coalesce.cpp
index 5579d90c485..57a20bcb638 100644
--- a/hotspot/src/share/vm/opto/coalesce.cpp
+++ b/hotspot/src/share/vm/opto/coalesce.cpp
@@ -291,7 +291,7 @@ void PhaseAggressiveCoalesce::insert_copies( Matcher &matcher ) {
_phc.clone_projs(pred, pred->end_idx(), m, copy, _phc._lrg_map);
} else {
const RegMask *rm = C->matcher()->idealreg2spillmask[m->ideal_reg()];
- copy = new (C) MachSpillCopyNode(MachSpillCopyNode::PhiInput, m, *rm, *rm);
+ copy = new MachSpillCopyNode(MachSpillCopyNode::PhiInput, m, *rm, *rm);
// Find a good place to insert. Kinda tricky, use a subroutine
insert_copy_with_overlap(pred,copy,phi_name,src_name);
}
@@ -325,7 +325,7 @@ void PhaseAggressiveCoalesce::insert_copies( Matcher &matcher ) {
l += _phc.clone_projs(b, l, m, copy, _phc._lrg_map);
} else {
const RegMask *rm = C->matcher()->idealreg2spillmask[m->ideal_reg()];
- copy = new (C) MachSpillCopyNode(MachSpillCopyNode::TwoAddress, m, *rm, *rm);
+ copy = new MachSpillCopyNode(MachSpillCopyNode::TwoAddress, m, *rm, *rm);
// Insert the copy in the basic block, just before us
b->insert_node(copy, l++);
}
@@ -372,7 +372,7 @@ void PhaseAggressiveCoalesce::insert_copies( Matcher &matcher ) {
continue; // Live out; do not pre-split
// Split the lrg at this use
const RegMask *rm = C->matcher()->idealreg2spillmask[inp->ideal_reg()];
- Node* copy = new (C) MachSpillCopyNode(MachSpillCopyNode::DebugUse, inp, *rm, *rm);
+ Node* copy = new MachSpillCopyNode(MachSpillCopyNode::DebugUse, inp, *rm, *rm);
// Insert the copy in the use-def chain
n->set_req(inpidx, copy );
// Insert the copy in the basic block, just before us
diff --git a/hotspot/src/share/vm/opto/compile.cpp b/hotspot/src/share/vm/opto/compile.cpp
index 9c05d1da889..f93e985ae11 100644
--- a/hotspot/src/share/vm/opto/compile.cpp
+++ b/hotspot/src/share/vm/opto/compile.cpp
@@ -95,7 +95,7 @@
// Constant table base node singleton.
MachConstantBaseNode* Compile::mach_constant_base_node() {
if (_mach_constant_base_node == NULL) {
- _mach_constant_base_node = new (C) MachConstantBaseNode();
+ _mach_constant_base_node = new MachConstantBaseNode();
_mach_constant_base_node->add_req(C->root());
}
return _mach_constant_base_node;
@@ -748,14 +748,14 @@ Compile::Compile( ciEnv* ci_env, C2Compiler* compiler, ciMethod* target, int osr
const TypeTuple *domain = StartOSRNode::osr_domain();
const TypeTuple *range = TypeTuple::make_range(method()->signature());
init_tf(TypeFunc::make(domain, range));
- StartNode* s = new (this) StartOSRNode(root(), domain);
+ StartNode* s = new StartOSRNode(root(), domain);
initial_gvn()->set_type_bottom(s);
init_start(s);
cg = CallGenerator::for_osr(method(), entry_bci());
} else {
// Normal case.
init_tf(TypeFunc::make(method()));
- StartNode* s = new (this) StartNode(root(), tf()->domain());
+ StartNode* s = new StartNode(root(), tf()->domain());
initial_gvn()->set_type_bottom(s);
init_start(s);
if (method()->intrinsic_id() == vmIntrinsics::_Reference_get && UseG1GC) {
@@ -1061,9 +1061,9 @@ void Compile::Init(int aliaslevel) {
// Globally visible Nodes
// First set TOP to NULL to give safe behavior during creation of RootNode
set_cached_top_node(NULL);
- set_root(new (this) RootNode());
+ set_root(new RootNode());
// Now that you have a Root to point to, create the real TOP
- set_cached_top_node( new (this) ConNode(Type::TOP) );
+ set_cached_top_node( new ConNode(Type::TOP) );
set_recent_alloc(NULL, NULL);
// Create Debug Information Recorder to record scopes, oopmaps, etc.
@@ -2757,9 +2757,9 @@ void Compile::final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &frc) {
// Decode a narrow oop to match address
// [R12 + narrow_oop_reg<<3 + offset]
if (t->isa_oopptr()) {
- nn = new (this) DecodeNNode(nn, t);
+ nn = new DecodeNNode(nn, t);
} else {
- nn = new (this) DecodeNKlassNode(nn, t);
+ nn = new DecodeNKlassNode(nn, t);
}
n->set_req(AddPNode::Base, nn);
n->set_req(AddPNode::Address, nn);
@@ -2880,7 +2880,7 @@ void Compile::final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &frc) {
}
}
if (new_in2 != NULL) {
- Node* cmpN = new (this) CmpNNode(in1->in(1), new_in2);
+ Node* cmpN = new CmpNNode(in1->in(1), new_in2);
n->subsume_by(cmpN, this);
if (in1->outcnt() == 0) {
in1->disconnect_inputs(NULL, this);
@@ -2979,8 +2979,8 @@ void Compile::final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &frc) {
n->subsume_by(divmod->mod_proj(), this);
} else {
// replace a%b with a-((a/b)*b)
- Node* mult = new (this) MulINode(d, d->in(2));
- Node* sub = new (this) SubINode(d->in(1), mult);
+ Node* mult = new MulINode(d, d->in(2));
+ Node* sub = new SubINode(d->in(1), mult);
n->subsume_by(sub, this);
}
}
@@ -2999,8 +2999,8 @@ void Compile::final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &frc) {
n->subsume_by(divmod->mod_proj(), this);
} else {
// replace a%b with a-((a/b)*b)
- Node* mult = new (this) MulLNode(d, d->in(2));
- Node* sub = new (this) SubLNode(d->in(1), mult);
+ Node* mult = new MulLNode(d, d->in(2));
+ Node* sub = new SubLNode(d->in(1), mult);
n->subsume_by(sub, this);
}
}
@@ -3049,7 +3049,7 @@ void Compile::final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &frc) {
}
} else {
if (t == NULL || t->_lo < 0 || t->_hi > (int)mask) {
- Node* shift = new (this) AndINode(in2, ConNode::make(this, TypeInt::make(mask)));
+ Node* shift = new AndINode(in2, ConNode::make(this, TypeInt::make(mask)));
n->set_req(2, shift);
}
}
diff --git a/hotspot/src/share/vm/opto/connode.cpp b/hotspot/src/share/vm/opto/connode.cpp
index 8485aba1303..485e8df7951 100644
--- a/hotspot/src/share/vm/opto/connode.cpp
+++ b/hotspot/src/share/vm/opto/connode.cpp
@@ -45,17 +45,17 @@ uint ConNode::hash() const {
//------------------------------make-------------------------------------------
ConNode *ConNode::make( Compile* C, const Type *t ) {
switch( t->basic_type() ) {
- case T_INT: return new (C) ConINode( t->is_int() );
- case T_LONG: return new (C) ConLNode( t->is_long() );
- case T_FLOAT: return new (C) ConFNode( t->is_float_constant() );
- case T_DOUBLE: return new (C) ConDNode( t->is_double_constant() );
- case T_VOID: return new (C) ConNode ( Type::TOP );
- case T_OBJECT: return new (C) ConPNode( t->is_ptr() );
- case T_ARRAY: return new (C) ConPNode( t->is_aryptr() );
- case T_ADDRESS: return new (C) ConPNode( t->is_ptr() );
- case T_NARROWOOP: return new (C) ConNNode( t->is_narrowoop() );
- case T_NARROWKLASS: return new (C) ConNKlassNode( t->is_narrowklass() );
- case T_METADATA: return new (C) ConPNode( t->is_ptr() );
+ case T_INT: return new ConINode( t->is_int() );
+ case T_LONG: return new ConLNode( t->is_long() );
+ case T_FLOAT: return new ConFNode( t->is_float_constant() );
+ case T_DOUBLE: return new ConDNode( t->is_double_constant() );
+ case T_VOID: return new ConNode ( Type::TOP );
+ case T_OBJECT: return new ConPNode( t->is_ptr() );
+ case T_ARRAY: return new ConPNode( t->is_aryptr() );
+ case T_ADDRESS: return new ConPNode( t->is_ptr() );
+ case T_NARROWOOP: return new ConNNode( t->is_narrowoop() );
+ case T_NARROWKLASS: return new ConNKlassNode( t->is_narrowklass() );
+ case T_METADATA: return new ConPNode( t->is_ptr() );
// Expected cases: TypePtr::NULL_PTR, any is_rawptr()
// Also seen: AnyPtr(TopPTR *+top); from command line:
// r -XX:+PrintOpto -XX:CIStart=285 -XX:+CompileTheWorld -XX:CompileTheWorldStartAt=660
diff --git a/hotspot/src/share/vm/opto/connode.hpp b/hotspot/src/share/vm/opto/connode.hpp
index a25e4c128a0..446b807a846 100644
--- a/hotspot/src/share/vm/opto/connode.hpp
+++ b/hotspot/src/share/vm/opto/connode.hpp
@@ -58,7 +58,7 @@ public:
// Factory method:
static ConINode* make( Compile* C, int con ) {
- return new (C) ConINode( TypeInt::make(con) );
+ return new ConINode( TypeInt::make(con) );
}
};
@@ -73,9 +73,9 @@ public:
// Factory methods:
static ConPNode* make( Compile *C ,address con ) {
if (con == NULL)
- return new (C) ConPNode( TypePtr::NULL_PTR ) ;
+ return new ConPNode( TypePtr::NULL_PTR ) ;
else
- return new (C) ConPNode( TypeRawPtr::make(con) );
+ return new ConPNode( TypeRawPtr::make(con) );
}
};
@@ -106,7 +106,7 @@ public:
// Factory method:
static ConLNode* make( Compile *C ,jlong con ) {
- return new (C) ConLNode( TypeLong::make(con) );
+ return new ConLNode( TypeLong::make(con) );
}
};
@@ -120,7 +120,7 @@ public:
// Factory method:
static ConFNode* make( Compile *C, float con ) {
- return new (C) ConFNode( TypeF::make(con) );
+ return new ConFNode( TypeF::make(con) );
}
};
@@ -134,7 +134,7 @@ public:
// Factory method:
static ConDNode* make( Compile *C, double con ) {
- return new (C) ConDNode( TypeD::make(con) );
+ return new ConDNode( TypeD::make(con) );
}
};
diff --git a/hotspot/src/share/vm/opto/convertnode.cpp b/hotspot/src/share/vm/opto/convertnode.cpp
index bf09d3fbb90..8c42aaed679 100644
--- a/hotspot/src/share/vm/opto/convertnode.cpp
+++ b/hotspot/src/share/vm/opto/convertnode.cpp
@@ -374,11 +374,11 @@ Node *ConvI2LNode::Ideal(PhaseGVN *phase, bool can_reshape) {
ryhi = -rylo0;
}
- Node* cx = phase->transform( new (phase->C) ConvI2LNode(x, TypeLong::make(rxlo, rxhi, widen)) );
- Node* cy = phase->transform( new (phase->C) ConvI2LNode(y, TypeLong::make(rylo, ryhi, widen)) );
+ Node* cx = phase->transform( new ConvI2LNode(x, TypeLong::make(rxlo, rxhi, widen)) );
+ Node* cy = phase->transform( new ConvI2LNode(y, TypeLong::make(rylo, ryhi, widen)) );
switch (op) {
- case Op_AddI: return new (phase->C) AddLNode(cx, cy);
- case Op_SubI: return new (phase->C) SubLNode(cx, cy);
+ case Op_AddI: return new AddLNode(cx, cy);
+ case Op_SubI: return new SubLNode(cx, cy);
default: ShouldNotReachHere();
}
}
@@ -452,9 +452,9 @@ Node *ConvL2INode::Ideal(PhaseGVN *phase, bool can_reshape) {
assert( x != andl && y != andl, "dead loop in ConvL2INode::Ideal" );
if (phase->type(x) == Type::TOP) return NULL;
if (phase->type(y) == Type::TOP) return NULL;
- Node *add1 = phase->transform(new (phase->C) ConvL2INode(x));
- Node *add2 = phase->transform(new (phase->C) ConvL2INode(y));
- return new (phase->C) AddINode(add1,add2);
+ Node *add1 = phase->transform(new ConvL2INode(x));
+ Node *add2 = phase->transform(new ConvL2INode(y));
+ return new AddINode(add1,add2);
}
// Disable optimization: LoadL->ConvL2I ==> LoadI.
diff --git a/hotspot/src/share/vm/opto/divnode.cpp b/hotspot/src/share/vm/opto/divnode.cpp
index 40bd21fbc4c..8a27c24e37e 100644
--- a/hotspot/src/share/vm/opto/divnode.cpp
+++ b/hotspot/src/share/vm/opto/divnode.cpp
@@ -106,7 +106,7 @@ static Node *transform_int_divide( PhaseGVN *phase, Node *dividend, jint divisor
// division by +/- 1
if (!d_pos) {
// Just negate the value
- q = new (phase->C) SubINode(phase->intcon(0), dividend);
+ q = new SubINode(phase->intcon(0), dividend);
}
} else if ( is_power_of_2(d) ) {
// division by +/- a power of 2
@@ -143,18 +143,18 @@ static Node *transform_int_divide( PhaseGVN *phase, Node *dividend, jint divisor
// (-2+3)>>2 becomes 0, etc.
// Compute 0 or -1, based on sign bit
- Node *sign = phase->transform(new (phase->C) RShiftINode(dividend, phase->intcon(N - 1)));
+ Node *sign = phase->transform(new RShiftINode(dividend, phase->intcon(N - 1)));
// Mask sign bit to the low sign bits
- Node *round = phase->transform(new (phase->C) URShiftINode(sign, phase->intcon(N - l)));
+ Node *round = phase->transform(new URShiftINode(sign, phase->intcon(N - l)));
// Round up before shifting
- dividend = phase->transform(new (phase->C) AddINode(dividend, round));
+ dividend = phase->transform(new AddINode(dividend, round));
}
// Shift for division
- q = new (phase->C) RShiftINode(dividend, phase->intcon(l));
+ q = new RShiftINode(dividend, phase->intcon(l));
if (!d_pos) {
- q = new (phase->C) SubINode(phase->intcon(0), phase->transform(q));
+ q = new SubINode(phase->intcon(0), phase->transform(q));
}
} else {
// Attempt the jint constant divide -> multiply transform found in
@@ -166,33 +166,33 @@ static Node *transform_int_divide( PhaseGVN *phase, Node *dividend, jint divisor
jint shift_const;
if (magic_int_divide_constants(d, magic_const, shift_const)) {
Node *magic = phase->longcon(magic_const);
- Node *dividend_long = phase->transform(new (phase->C) ConvI2LNode(dividend));
+ Node *dividend_long = phase->transform(new ConvI2LNode(dividend));
// Compute the high half of the dividend x magic multiplication
- Node *mul_hi = phase->transform(new (phase->C) MulLNode(dividend_long, magic));
+ Node *mul_hi = phase->transform(new MulLNode(dividend_long, magic));
if (magic_const < 0) {
- mul_hi = phase->transform(new (phase->C) RShiftLNode(mul_hi, phase->intcon(N)));
- mul_hi = phase->transform(new (phase->C) ConvL2INode(mul_hi));
+ mul_hi = phase->transform(new RShiftLNode(mul_hi, phase->intcon(N)));
+ mul_hi = phase->transform(new ConvL2INode(mul_hi));
// The magic multiplier is too large for a 32 bit constant. We've adjusted
// it down by 2^32, but have to add 1 dividend back in after the multiplication.
// This handles the "overflow" case described by Granlund and Montgomery.
- mul_hi = phase->transform(new (phase->C) AddINode(dividend, mul_hi));
+ mul_hi = phase->transform(new AddINode(dividend, mul_hi));
// Shift over the (adjusted) mulhi
if (shift_const != 0) {
- mul_hi = phase->transform(new (phase->C) RShiftINode(mul_hi, phase->intcon(shift_const)));
+ mul_hi = phase->transform(new RShiftINode(mul_hi, phase->intcon(shift_const)));
}
} else {
// No add is required, we can merge the shifts together.
- mul_hi = phase->transform(new (phase->C) RShiftLNode(mul_hi, phase->intcon(N + shift_const)));
- mul_hi = phase->transform(new (phase->C) ConvL2INode(mul_hi));
+ mul_hi = phase->transform(new RShiftLNode(mul_hi, phase->intcon(N + shift_const)));
+ mul_hi = phase->transform(new ConvL2INode(mul_hi));
}
// Get a 0 or -1 from the sign of the dividend.
Node *addend0 = mul_hi;
- Node *addend1 = phase->transform(new (phase->C) RShiftINode(dividend, phase->intcon(N-1)));
+ Node *addend1 = phase->transform(new RShiftINode(dividend, phase->intcon(N-1)));
// If the divisor is negative, swap the order of the input addends;
// this has the effect of negating the quotient.
@@ -202,7 +202,7 @@ static Node *transform_int_divide( PhaseGVN *phase, Node *dividend, jint divisor
// Adjust the final quotient by subtracting -1 (adding 1)
// from the mul_hi.
- q = new (phase->C) SubINode(addend0, addend1);
+ q = new SubINode(addend0, addend1);
}
}
@@ -261,7 +261,7 @@ static Node* long_by_long_mulhi(PhaseGVN* phase, Node* dividend, jlong magic_con
// no need to synthesize it in ideal nodes.
if (Matcher::has_match_rule(Op_MulHiL)) {
Node* v = phase->longcon(magic_const);
- return new (phase->C) MulHiLNode(dividend, v);
+ return new MulHiLNode(dividend, v);
}
// Taken from Hacker's Delight, Fig. 8-2. Multiply high signed.
@@ -287,11 +287,11 @@ static Node* long_by_long_mulhi(PhaseGVN* phase, Node* dividend, jlong magic_con
const int N = 64;
// Dummy node to keep intermediate nodes alive during construction
- Node* hook = new (phase->C) Node(4);
+ Node* hook = new Node(4);
// u0 = u & 0xFFFFFFFF; u1 = u >> 32;
- Node* u0 = phase->transform(new (phase->C) AndLNode(dividend, phase->longcon(0xFFFFFFFF)));
- Node* u1 = phase->transform(new (phase->C) RShiftLNode(dividend, phase->intcon(N / 2)));
+ Node* u0 = phase->transform(new AndLNode(dividend, phase->longcon(0xFFFFFFFF)));
+ Node* u1 = phase->transform(new RShiftLNode(dividend, phase->intcon(N / 2)));
hook->init_req(0, u0);
hook->init_req(1, u1);
@@ -300,29 +300,29 @@ static Node* long_by_long_mulhi(PhaseGVN* phase, Node* dividend, jlong magic_con
Node* v1 = phase->longcon(magic_const >> (N / 2));
// w0 = u0*v0;
- Node* w0 = phase->transform(new (phase->C) MulLNode(u0, v0));
+ Node* w0 = phase->transform(new MulLNode(u0, v0));
// t = u1*v0 + (w0 >> 32);
- Node* u1v0 = phase->transform(new (phase->C) MulLNode(u1, v0));
- Node* temp = phase->transform(new (phase->C) URShiftLNode(w0, phase->intcon(N / 2)));
- Node* t = phase->transform(new (phase->C) AddLNode(u1v0, temp));
+ Node* u1v0 = phase->transform(new MulLNode(u1, v0));
+ Node* temp = phase->transform(new URShiftLNode(w0, phase->intcon(N / 2)));
+ Node* t = phase->transform(new AddLNode(u1v0, temp));
hook->init_req(2, t);
// w1 = t & 0xFFFFFFFF;
- Node* w1 = phase->transform(new (phase->C) AndLNode(t, phase->longcon(0xFFFFFFFF)));
+ Node* w1 = phase->transform(new AndLNode(t, phase->longcon(0xFFFFFFFF)));
hook->init_req(3, w1);
// w2 = t >> 32;
- Node* w2 = phase->transform(new (phase->C) RShiftLNode(t, phase->intcon(N / 2)));
+ Node* w2 = phase->transform(new RShiftLNode(t, phase->intcon(N / 2)));
// w1 = u0*v1 + w1;
- Node* u0v1 = phase->transform(new (phase->C) MulLNode(u0, v1));
- w1 = phase->transform(new (phase->C) AddLNode(u0v1, w1));
+ Node* u0v1 = phase->transform(new MulLNode(u0, v1));
+ w1 = phase->transform(new AddLNode(u0v1, w1));
// return u1*v1 + w2 + (w1 >> 32);
- Node* u1v1 = phase->transform(new (phase->C) MulLNode(u1, v1));
- Node* temp1 = phase->transform(new (phase->C) AddLNode(u1v1, w2));
- Node* temp2 = phase->transform(new (phase->C) RShiftLNode(w1, phase->intcon(N / 2)));
+ Node* u1v1 = phase->transform(new MulLNode(u1, v1));
+ Node* temp1 = phase->transform(new AddLNode(u1v1, w2));
+ Node* temp2 = phase->transform(new RShiftLNode(w1, phase->intcon(N / 2)));
// Remove the bogus extra edges used to keep things alive
PhaseIterGVN* igvn = phase->is_IterGVN();
@@ -334,7 +334,7 @@ static Node* long_by_long_mulhi(PhaseGVN* phase, Node* dividend, jlong magic_con
}
}
- return new (phase->C) AddLNode(temp1, temp2);
+ return new AddLNode(temp1, temp2);
}
@@ -357,7 +357,7 @@ static Node *transform_long_divide( PhaseGVN *phase, Node *dividend, jlong divis
// division by +/- 1
if (!d_pos) {
// Just negate the value
- q = new (phase->C) SubLNode(phase->longcon(0), dividend);
+ q = new SubLNode(phase->longcon(0), dividend);
}
} else if ( is_power_of_2_long(d) ) {
@@ -396,18 +396,18 @@ static Node *transform_long_divide( PhaseGVN *phase, Node *dividend, jlong divis
// (-2+3)>>2 becomes 0, etc.
// Compute 0 or -1, based on sign bit
- Node *sign = phase->transform(new (phase->C) RShiftLNode(dividend, phase->intcon(N - 1)));
+ Node *sign = phase->transform(new RShiftLNode(dividend, phase->intcon(N - 1)));
// Mask sign bit to the low sign bits
- Node *round = phase->transform(new (phase->C) URShiftLNode(sign, phase->intcon(N - l)));
+ Node *round = phase->transform(new URShiftLNode(sign, phase->intcon(N - l)));
// Round up before shifting
- dividend = phase->transform(new (phase->C) AddLNode(dividend, round));
+ dividend = phase->transform(new AddLNode(dividend, round));
}
// Shift for division
- q = new (phase->C) RShiftLNode(dividend, phase->intcon(l));
+ q = new RShiftLNode(dividend, phase->intcon(l));
if (!d_pos) {
- q = new (phase->C) SubLNode(phase->longcon(0), phase->transform(q));
+ q = new SubLNode(phase->longcon(0), phase->transform(q));
}
} else if ( !Matcher::use_asm_for_ldiv_by_con(d) ) { // Use hardware DIV instruction when
// it is faster than code generated below.
@@ -427,17 +427,17 @@ static Node *transform_long_divide( PhaseGVN *phase, Node *dividend, jlong divis
// The magic multiplier is too large for a 64 bit constant. We've adjusted
// it down by 2^64, but have to add 1 dividend back in after the multiplication.
// This handles the "overflow" case described by Granlund and Montgomery.
- mul_hi = phase->transform(new (phase->C) AddLNode(dividend, mul_hi));
+ mul_hi = phase->transform(new AddLNode(dividend, mul_hi));
}
// Shift over the (adjusted) mulhi
if (shift_const != 0) {
- mul_hi = phase->transform(new (phase->C) RShiftLNode(mul_hi, phase->intcon(shift_const)));
+ mul_hi = phase->transform(new RShiftLNode(mul_hi, phase->intcon(shift_const)));
}
// Get a 0 or -1 from the sign of the dividend.
Node *addend0 = mul_hi;
- Node *addend1 = phase->transform(new (phase->C) RShiftLNode(dividend, phase->intcon(N-1)));
+ Node *addend1 = phase->transform(new RShiftLNode(dividend, phase->intcon(N-1)));
// If the divisor is negative, swap the order of the input addends;
// this has the effect of negating the quotient.
@@ -447,7 +447,7 @@ static Node *transform_long_divide( PhaseGVN *phase, Node *dividend, jlong divis
// Adjust the final quotient by subtracting -1 (adding 1)
// from the mul_hi.
- q = new (phase->C) SubLNode(addend0, addend1);
+ q = new SubLNode(addend0, addend1);
}
}
@@ -737,7 +737,7 @@ Node *DivFNode::Ideal(PhaseGVN *phase, bool can_reshape) {
assert( frexp((double)reciprocal, &exp) == 0.5, "reciprocal should be power of 2" );
// return multiplication by the reciprocal
- return (new (phase->C) MulFNode(in(1), phase->makecon(TypeF::make(reciprocal))));
+ return (new MulFNode(in(1), phase->makecon(TypeF::make(reciprocal))));
}
//=============================================================================
@@ -831,7 +831,7 @@ Node *DivDNode::Ideal(PhaseGVN *phase, bool can_reshape) {
assert( frexp(reciprocal, &exp) == 0.5, "reciprocal should be power of 2" );
// return multiplication by the reciprocal
- return (new (phase->C) MulDNode(in(1), phase->makecon(TypeD::make(reciprocal))));
+ return (new MulDNode(in(1), phase->makecon(TypeD::make(reciprocal))));
}
//=============================================================================
@@ -858,7 +858,7 @@ Node *ModINode::Ideal(PhaseGVN *phase, bool can_reshape) {
if( !ti->is_con() ) return NULL;
jint con = ti->get_con();
- Node *hook = new (phase->C) Node(1);
+ Node *hook = new Node(1);
// First, special check for modulo 2^k-1
if( con >= 0 && con < max_jint && is_power_of_2(con+1) ) {
@@ -878,24 +878,24 @@ Node *ModINode::Ideal(PhaseGVN *phase, bool can_reshape) {
hook->init_req(0, x); // Add a use to x to prevent him from dying
// Generate code to reduce X rapidly to nearly 2^k-1.
for( int i = 0; i < trip_count; i++ ) {
- Node *xl = phase->transform( new (phase->C) AndINode(x,divisor) );
- Node *xh = phase->transform( new (phase->C) RShiftINode(x,phase->intcon(k)) ); // Must be signed
- x = phase->transform( new (phase->C) AddINode(xh,xl) );
+ Node *xl = phase->transform( new AndINode(x,divisor) );
+ Node *xh = phase->transform( new RShiftINode(x,phase->intcon(k)) ); // Must be signed
+ x = phase->transform( new AddINode(xh,xl) );
hook->set_req(0, x);
}
// Generate sign-fixup code. Was original value positive?
// int hack_res = (i >= 0) ? divisor : 1;
- Node *cmp1 = phase->transform( new (phase->C) CmpINode( in(1), phase->intcon(0) ) );
- Node *bol1 = phase->transform( new (phase->C) BoolNode( cmp1, BoolTest::ge ) );
- Node *cmov1= phase->transform( new (phase->C) CMoveINode(bol1, phase->intcon(1), divisor, TypeInt::POS) );
+ Node *cmp1 = phase->transform( new CmpINode( in(1), phase->intcon(0) ) );
+ Node *bol1 = phase->transform( new BoolNode( cmp1, BoolTest::ge ) );
+ Node *cmov1= phase->transform( new CMoveINode(bol1, phase->intcon(1), divisor, TypeInt::POS) );
// if( x >= hack_res ) x -= divisor;
- Node *sub = phase->transform( new (phase->C) SubINode( x, divisor ) );
- Node *cmp2 = phase->transform( new (phase->C) CmpINode( x, cmov1 ) );
- Node *bol2 = phase->transform( new (phase->C) BoolNode( cmp2, BoolTest::ge ) );
+ Node *sub = phase->transform( new SubINode( x, divisor ) );
+ Node *cmp2 = phase->transform( new CmpINode( x, cmov1 ) );
+ Node *bol2 = phase->transform( new BoolNode( cmp2, BoolTest::ge ) );
// Convention is to not transform the return value of an Ideal
// since Ideal is expected to return a modified 'this' or a new node.
- Node *cmov2= new (phase->C) CMoveINode(bol2, x, sub, TypeInt::INT);
+ Node *cmov2= new CMoveINode(bol2, x, sub, TypeInt::INT);
// cmov2 is now the mod
// Now remove the bogus extra edges used to keep things alive
@@ -918,7 +918,7 @@ Node *ModINode::Ideal(PhaseGVN *phase, bool can_reshape) {
jint pos_con = (con >= 0) ? con : -con;
// integer Mod 1 is always 0
- if( pos_con == 1 ) return new (phase->C) ConINode(TypeInt::ZERO);
+ if( pos_con == 1 ) return new ConINode(TypeInt::ZERO);
int log2_con = -1;
@@ -931,7 +931,7 @@ Node *ModINode::Ideal(PhaseGVN *phase, bool can_reshape) {
// See if this can be masked, if the dividend is non-negative
if( dti && dti->_lo >= 0 )
- return ( new (phase->C) AndINode( in(1), phase->intcon( pos_con-1 ) ) );
+ return ( new AndINode( in(1), phase->intcon( pos_con-1 ) ) );
}
// Save in(1) so that it cannot be changed or deleted
@@ -946,12 +946,12 @@ Node *ModINode::Ideal(PhaseGVN *phase, bool can_reshape) {
Node *mult = NULL;
if( log2_con >= 0 )
- mult = phase->transform( new (phase->C) LShiftINode( divide, phase->intcon( log2_con ) ) );
+ mult = phase->transform( new LShiftINode( divide, phase->intcon( log2_con ) ) );
else
- mult = phase->transform( new (phase->C) MulINode( divide, phase->intcon( pos_con ) ) );
+ mult = phase->transform( new MulINode( divide, phase->intcon( pos_con ) ) );
// Finally, subtract the multiplied divided value from the original
- result = new (phase->C) SubINode( in(1), mult );
+ result = new SubINode( in(1), mult );
}
// Now remove the bogus extra edges used to keep things alive
@@ -1029,7 +1029,7 @@ Node *ModLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
if( !tl->is_con() ) return NULL;
jlong con = tl->get_con();
- Node *hook = new (phase->C) Node(1);
+ Node *hook = new Node(1);
// Expand mod
if( con >= 0 && con < max_jlong && is_power_of_2_long(con+1) ) {
@@ -1051,24 +1051,24 @@ Node *ModLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
hook->init_req(0, x); // Add a use to x to prevent him from dying
// Generate code to reduce X rapidly to nearly 2^k-1.
for( int i = 0; i < trip_count; i++ ) {
- Node *xl = phase->transform( new (phase->C) AndLNode(x,divisor) );
- Node *xh = phase->transform( new (phase->C) RShiftLNode(x,phase->intcon(k)) ); // Must be signed
- x = phase->transform( new (phase->C) AddLNode(xh,xl) );
+ Node *xl = phase->transform( new AndLNode(x,divisor) );
+ Node *xh = phase->transform( new RShiftLNode(x,phase->intcon(k)) ); // Must be signed
+ x = phase->transform( new AddLNode(xh,xl) );
hook->set_req(0, x); // Add a use to x to prevent him from dying
}
// Generate sign-fixup code. Was original value positive?
// long hack_res = (i >= 0) ? divisor : CONST64(1);
- Node *cmp1 = phase->transform( new (phase->C) CmpLNode( in(1), phase->longcon(0) ) );
- Node *bol1 = phase->transform( new (phase->C) BoolNode( cmp1, BoolTest::ge ) );
- Node *cmov1= phase->transform( new (phase->C) CMoveLNode(bol1, phase->longcon(1), divisor, TypeLong::LONG) );
+ Node *cmp1 = phase->transform( new CmpLNode( in(1), phase->longcon(0) ) );
+ Node *bol1 = phase->transform( new BoolNode( cmp1, BoolTest::ge ) );
+ Node *cmov1= phase->transform( new CMoveLNode(bol1, phase->longcon(1), divisor, TypeLong::LONG) );
// if( x >= hack_res ) x -= divisor;
- Node *sub = phase->transform( new (phase->C) SubLNode( x, divisor ) );
- Node *cmp2 = phase->transform( new (phase->C) CmpLNode( x, cmov1 ) );
- Node *bol2 = phase->transform( new (phase->C) BoolNode( cmp2, BoolTest::ge ) );
+ Node *sub = phase->transform( new SubLNode( x, divisor ) );
+ Node *cmp2 = phase->transform( new CmpLNode( x, cmov1 ) );
+ Node *bol2 = phase->transform( new BoolNode( cmp2, BoolTest::ge ) );
// Convention is to not transform the return value of an Ideal
// since Ideal is expected to return a modified 'this' or a new node.
- Node *cmov2= new (phase->C) CMoveLNode(bol2, x, sub, TypeLong::LONG);
+ Node *cmov2= new CMoveLNode(bol2, x, sub, TypeLong::LONG);
// cmov2 is now the mod
// Now remove the bogus extra edges used to keep things alive
@@ -1091,7 +1091,7 @@ Node *ModLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
jlong pos_con = (con >= 0) ? con : -con;
// integer Mod 1 is always 0
- if( pos_con == 1 ) return new (phase->C) ConLNode(TypeLong::ZERO);
+ if( pos_con == 1 ) return new ConLNode(TypeLong::ZERO);
int log2_con = -1;
@@ -1104,7 +1104,7 @@ Node *ModLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
// See if this can be masked, if the dividend is non-negative
if( dtl && dtl->_lo >= 0 )
- return ( new (phase->C) AndLNode( in(1), phase->longcon( pos_con-1 ) ) );
+ return ( new AndLNode( in(1), phase->longcon( pos_con-1 ) ) );
}
// Save in(1) so that it cannot be changed or deleted
@@ -1119,12 +1119,12 @@ Node *ModLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
Node *mult = NULL;
if( log2_con >= 0 )
- mult = phase->transform( new (phase->C) LShiftLNode( divide, phase->intcon( log2_con ) ) );
+ mult = phase->transform( new LShiftLNode( divide, phase->intcon( log2_con ) ) );
else
- mult = phase->transform( new (phase->C) MulLNode( divide, phase->longcon( pos_con ) ) );
+ mult = phase->transform( new MulLNode( divide, phase->longcon( pos_con ) ) );
// Finally, subtract the multiplied divided value from the original
- result = new (phase->C) SubLNode( in(1), mult );
+ result = new SubLNode( in(1), mult );
}
// Now remove the bogus extra edges used to keep things alive
@@ -1279,9 +1279,9 @@ DivModINode* DivModINode::make(Compile* C, Node* div_or_mod) {
assert(n->Opcode() == Op_DivI || n->Opcode() == Op_ModI,
"only div or mod input pattern accepted");
- DivModINode* divmod = new (C) DivModINode(n->in(0), n->in(1), n->in(2));
- Node* dproj = new (C) ProjNode(divmod, DivModNode::div_proj_num);
- Node* mproj = new (C) ProjNode(divmod, DivModNode::mod_proj_num);
+ DivModINode* divmod = new DivModINode(n->in(0), n->in(1), n->in(2));
+ Node* dproj = new ProjNode(divmod, DivModNode::div_proj_num);
+ Node* mproj = new ProjNode(divmod, DivModNode::mod_proj_num);
return divmod;
}
@@ -1291,9 +1291,9 @@ DivModLNode* DivModLNode::make(Compile* C, Node* div_or_mod) {
assert(n->Opcode() == Op_DivL || n->Opcode() == Op_ModL,
"only div or mod input pattern accepted");
- DivModLNode* divmod = new (C) DivModLNode(n->in(0), n->in(1), n->in(2));
- Node* dproj = new (C) ProjNode(divmod, DivModNode::div_proj_num);
- Node* mproj = new (C) ProjNode(divmod, DivModNode::mod_proj_num);
+ DivModLNode* divmod = new DivModLNode(n->in(0), n->in(1), n->in(2));
+ Node* dproj = new ProjNode(divmod, DivModNode::div_proj_num);
+ Node* mproj = new ProjNode(divmod, DivModNode::mod_proj_num);
return divmod;
}
@@ -1308,7 +1308,7 @@ Node *DivModINode::match( const ProjNode *proj, const Matcher *match ) {
assert(proj->_con == mod_proj_num, "must be div or mod projection");
rm = match->modI_proj_mask();
}
- return new (match->C)MachProjNode(this, proj->_con, rm, ideal_reg);
+ return new MachProjNode(this, proj->_con, rm, ideal_reg);
}
@@ -1323,5 +1323,5 @@ Node *DivModLNode::match( const ProjNode *proj, const Matcher *match ) {
assert(proj->_con == mod_proj_num, "must be div or mod projection");
rm = match->modL_proj_mask();
}
- return new (match->C)MachProjNode(this, proj->_con, rm, ideal_reg);
+ return new MachProjNode(this, proj->_con, rm, ideal_reg);
}
diff --git a/hotspot/src/share/vm/opto/doCall.cpp b/hotspot/src/share/vm/opto/doCall.cpp
index 2c48e604497..d3a85d4d29f 100644
--- a/hotspot/src/share/vm/opto/doCall.cpp
+++ b/hotspot/src/share/vm/opto/doCall.cpp
@@ -596,7 +596,7 @@ void Parse::do_call() {
const Type* sig_type = TypeOopPtr::make_from_klass(ctype->as_klass());
if (arg_type != NULL && !arg_type->higher_equal(sig_type)) {
Node* retnode = pop();
- Node* cast_obj = _gvn.transform(new (C) CheckCastPPNode(control(), retnode, sig_type));
+ Node* cast_obj = _gvn.transform(new CheckCastPPNode(control(), retnode, sig_type));
push(cast_obj);
}
}
@@ -689,7 +689,7 @@ void Parse::catch_call_exceptions(ciExceptionHandlerStream& handlers) {
}
int len = bcis->length();
- CatchNode *cn = new (C) CatchNode(control(), i_o, len+1);
+ CatchNode *cn = new CatchNode(control(), i_o, len+1);
Node *catch_ = _gvn.transform(cn);
// now branch with the exception state to each of the (potential)
@@ -700,14 +700,14 @@ void Parse::catch_call_exceptions(ciExceptionHandlerStream& handlers) {
// Locals are just copied from before the call.
// Get control from the CatchNode.
int handler_bci = bcis->at(i);
- Node* ctrl = _gvn.transform( new (C) CatchProjNode(catch_, i+1,handler_bci));
+ Node* ctrl = _gvn.transform( new CatchProjNode(catch_, i+1,handler_bci));
// This handler cannot happen?
if (ctrl == top()) continue;
set_control(ctrl);
// Create exception oop
const TypeInstPtr* extype = extypes->at(i)->is_instptr();
- Node *ex_oop = _gvn.transform(new (C) CreateExNode(extypes->at(i), ctrl, i_o));
+ Node *ex_oop = _gvn.transform(new CreateExNode(extypes->at(i), ctrl, i_o));
// Handle unloaded exception classes.
if (saw_unloaded->contains(handler_bci)) {
@@ -746,7 +746,7 @@ void Parse::catch_call_exceptions(ciExceptionHandlerStream& handlers) {
// The first CatchProj is for the normal return.
// (Note: If this is a call to rethrow_Java, this node goes dead.)
- set_control(_gvn.transform( new (C) CatchProjNode(catch_, CatchProjNode::fall_through_index, CatchProjNode::no_handler_bci)));
+ set_control(_gvn.transform( new CatchProjNode(catch_, CatchProjNode::fall_through_index, CatchProjNode::no_handler_bci)));
}
@@ -797,7 +797,7 @@ void Parse::catch_inline_exceptions(SafePointNode* ex_map) {
// I'm loading the class from, I can replace the LoadKlass with the
// klass constant for the exception oop.
if( ex_node->is_Phi() ) {
- ex_klass_node = new (C) PhiNode( ex_node->in(0), TypeKlassPtr::OBJECT );
+ ex_klass_node = new PhiNode( ex_node->in(0), TypeKlassPtr::OBJECT );
for( uint i = 1; i < ex_node->req(); i++ ) {
Node* p = basic_plus_adr( ex_node->in(i), ex_node->in(i), oopDesc::klass_offset_in_bytes() );
Node* k = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), p, TypeInstPtr::KLASS, TypeKlassPtr::OBJECT) );
@@ -863,7 +863,7 @@ void Parse::catch_inline_exceptions(SafePointNode* ex_map) {
PreserveJVMState pjvms(this);
const TypeInstPtr* tinst = TypeOopPtr::make_from_klass_unique(klass)->cast_to_ptr_type(TypePtr::NotNull)->is_instptr();
assert(klass->has_subklass() || tinst->klass_is_exact(), "lost exactness");
- Node* ex_oop = _gvn.transform(new (C) CheckCastPPNode(control(), ex_node, tinst));
+ Node* ex_oop = _gvn.transform(new CheckCastPPNode(control(), ex_node, tinst));
push_ex_oop(ex_oop); // Push exception oop for handler
#ifndef PRODUCT
if (PrintOpto && WizardMode) {
diff --git a/hotspot/src/share/vm/opto/generateOptoStub.cpp b/hotspot/src/share/vm/opto/generateOptoStub.cpp
index f75110842b9..0472f45adeb 100644
--- a/hotspot/src/share/vm/opto/generateOptoStub.cpp
+++ b/hotspot/src/share/vm/opto/generateOptoStub.cpp
@@ -50,7 +50,7 @@ void GraphKit::gen_stub(address C_function,
const TypeTuple *jrange = C->tf()->range();
// The procedure start
- StartNode* start = new (C) StartNode(root(), jdomain);
+ StartNode* start = new StartNode(root(), jdomain);
_gvn.set_type_bottom(start);
// Make a map, with JVM state
@@ -64,7 +64,7 @@ void GraphKit::gen_stub(address C_function,
jvms->set_scloff(max_map);
jvms->set_endoff(max_map);
{
- SafePointNode *map = new (C) SafePointNode( max_map, jvms );
+ SafePointNode *map = new SafePointNode( max_map, jvms );
jvms->set_map(map);
set_jvms(jvms);
assert(map == this->map(), "kit.map is set");
@@ -73,7 +73,7 @@ void GraphKit::gen_stub(address C_function,
// Make up the parameters
uint i;
for( i = 0; i < parm_cnt; i++ )
- map()->init_req(i, _gvn.transform(new (C) ParmNode(start, i)));
+ map()->init_req(i, _gvn.transform(new ParmNode(start, i)));
for( ; ireq(); i++ )
map()->init_req(i, top()); // For nicer debugging
@@ -81,7 +81,7 @@ void GraphKit::gen_stub(address C_function,
set_all_memory(map()->memory());
// Get base of thread-local storage area
- Node* thread = _gvn.transform( new (C) ThreadLocalNode() );
+ Node* thread = _gvn.transform( new ThreadLocalNode() );
const int NoAlias = Compile::AliasIdxBot;
@@ -166,8 +166,7 @@ void GraphKit::gen_stub(address C_function,
//-----------------------------
// Make the call node
- CallRuntimeNode *call = new (C)
- CallRuntimeNode(c_sig, C_function, name, TypePtr::BOTTOM);
+ CallRuntimeNode *call = new CallRuntimeNode(c_sig, C_function, name, TypePtr::BOTTOM);
//-----------------------------
// Fix-up the debug info for the call
@@ -184,7 +183,7 @@ void GraphKit::gen_stub(address C_function,
for (; i < parm_cnt; i++) { // Regular input arguments
// Convert ints to longs if required.
if (CCallingConventionRequiresIntsAsLongs && jdomain->field_at(i)->isa_int()) {
- Node* int_as_long = _gvn.transform(new (C) ConvI2LNode(map()->in(i)));
+ Node* int_as_long = _gvn.transform(new ConvI2LNode(map()->in(i)));
call->init_req(cnt++, int_as_long); // long
call->init_req(cnt++, top()); // half
} else {
@@ -200,23 +199,23 @@ void GraphKit::gen_stub(address C_function,
//-----------------------------
// Now set up the return results
- set_control( _gvn.transform( new (C) ProjNode(call,TypeFunc::Control)) );
- set_i_o( _gvn.transform( new (C) ProjNode(call,TypeFunc::I_O )) );
+ set_control( _gvn.transform( new ProjNode(call,TypeFunc::Control)) );
+ set_i_o( _gvn.transform( new ProjNode(call,TypeFunc::I_O )) );
set_all_memory_call(call);
if (range->cnt() > TypeFunc::Parms) {
- Node* retnode = _gvn.transform( new (C) ProjNode(call,TypeFunc::Parms) );
+ Node* retnode = _gvn.transform( new ProjNode(call,TypeFunc::Parms) );
// C-land is allowed to return sub-word values. Convert to integer type.
assert( retval != Type::TOP, "" );
if (retval == TypeInt::BOOL) {
- retnode = _gvn.transform( new (C) AndINode(retnode, intcon(0xFF)) );
+ retnode = _gvn.transform( new AndINode(retnode, intcon(0xFF)) );
} else if (retval == TypeInt::CHAR) {
- retnode = _gvn.transform( new (C) AndINode(retnode, intcon(0xFFFF)) );
+ retnode = _gvn.transform( new AndINode(retnode, intcon(0xFFFF)) );
} else if (retval == TypeInt::BYTE) {
- retnode = _gvn.transform( new (C) LShiftINode(retnode, intcon(24)) );
- retnode = _gvn.transform( new (C) RShiftINode(retnode, intcon(24)) );
+ retnode = _gvn.transform( new LShiftINode(retnode, intcon(24)) );
+ retnode = _gvn.transform( new RShiftINode(retnode, intcon(24)) );
} else if (retval == TypeInt::SHORT) {
- retnode = _gvn.transform( new (C) LShiftINode(retnode, intcon(16)) );
- retnode = _gvn.transform( new (C) RShiftINode(retnode, intcon(16)) );
+ retnode = _gvn.transform( new LShiftINode(retnode, intcon(16)) );
+ retnode = _gvn.transform( new RShiftINode(retnode, intcon(16)) );
}
map()->set_req( TypeFunc::Parms, retnode );
}
@@ -253,21 +252,21 @@ void GraphKit::gen_stub(address C_function,
Node* exit_memory = reset_memory();
- Node* cmp = _gvn.transform( new (C) CmpPNode(pending, null()) );
- Node* bo = _gvn.transform( new (C) BoolNode(cmp, BoolTest::ne) );
+ Node* cmp = _gvn.transform( new CmpPNode(pending, null()) );
+ Node* bo = _gvn.transform( new BoolNode(cmp, BoolTest::ne) );
IfNode *iff = create_and_map_if(control(), bo, PROB_MIN, COUNT_UNKNOWN);
- Node* if_null = _gvn.transform( new (C) IfFalseNode(iff) );
- Node* if_not_null = _gvn.transform( new (C) IfTrueNode(iff) );
+ Node* if_null = _gvn.transform( new IfFalseNode(iff) );
+ Node* if_not_null = _gvn.transform( new IfTrueNode(iff) );
assert (StubRoutines::forward_exception_entry() != NULL, "must be generated before");
Node *exc_target = makecon(TypeRawPtr::make( StubRoutines::forward_exception_entry() ));
- Node *to_exc = new (C) TailCallNode(if_not_null,
- i_o(),
- exit_memory,
- frameptr(),
- returnadr(),
- exc_target, null());
+ Node *to_exc = new TailCallNode(if_not_null,
+ i_o(),
+ exit_memory,
+ frameptr(),
+ returnadr(),
+ exc_target, null());
root()->add_req(_gvn.transform(to_exc)); // bind to root to keep live
C->init_start(start);
@@ -277,27 +276,27 @@ void GraphKit::gen_stub(address C_function,
switch( is_fancy_jump ) {
case 0: // Make a return instruction
// Return to caller, free any space for return address
- ret = new (C) ReturnNode(TypeFunc::Parms, if_null,
- i_o(),
- exit_memory,
- frameptr(),
- returnadr());
+ ret = new ReturnNode(TypeFunc::Parms, if_null,
+ i_o(),
+ exit_memory,
+ frameptr(),
+ returnadr());
if (C->tf()->range()->cnt() > TypeFunc::Parms)
ret->add_req( map()->in(TypeFunc::Parms) );
break;
case 1: // This is a fancy tail-call jump. Jump to computed address.
// Jump to new callee; leave old return address alone.
- ret = new (C) TailCallNode(if_null,
- i_o(),
- exit_memory,
- frameptr(),
- returnadr(),
- target, map()->in(TypeFunc::Parms));
+ ret = new TailCallNode(if_null,
+ i_o(),
+ exit_memory,
+ frameptr(),
+ returnadr(),
+ target, map()->in(TypeFunc::Parms));
break;
case 2: // Pop return address & jump
// Throw away old return address; jump to new computed address
//assert(C_function == CAST_FROM_FN_PTR(address, OptoRuntime::rethrow_C), "fancy_jump==2 only for rethrow");
- ret = new (C) TailJumpNode(if_null,
+ ret = new TailJumpNode(if_null,
i_o(),
exit_memory,
frameptr(),
diff --git a/hotspot/src/share/vm/opto/graphKit.cpp b/hotspot/src/share/vm/opto/graphKit.cpp
index 123e28fa95b..9e07ebf8949 100644
--- a/hotspot/src/share/vm/opto/graphKit.cpp
+++ b/hotspot/src/share/vm/opto/graphKit.cpp
@@ -294,7 +294,7 @@ JVMState* GraphKit::transfer_exceptions_into_jvms() {
JVMState* jvms = new (C) JVMState(_method, NULL);
jvms->set_bci(_bci);
jvms->set_sp(_sp);
- jvms->set_map(new (C) SafePointNode(TypeFunc::Parms, jvms));
+ jvms->set_map(new SafePointNode(TypeFunc::Parms, jvms));
set_jvms(jvms);
for (uint i = 0; i < map()->req(); i++) map()->init_req(i, top());
set_all_memory(top());
@@ -347,7 +347,7 @@ void GraphKit::combine_exception_states(SafePointNode* ex_map, SafePointNode* ph
if (region->in(0) != hidden_merge_mark) {
// The control input is not (yet) a specially-marked region in phi_map.
// Make it so, and build some phis.
- region = new (C) RegionNode(2);
+ region = new RegionNode(2);
_gvn.set_type(region, Type::CONTROL);
region->set_req(0, hidden_merge_mark); // marks an internal ex-state
region->init_req(1, phi_map->control());
@@ -496,13 +496,13 @@ void GraphKit::uncommon_trap_if_should_post_on_exceptions(Deoptimization::DeoptR
// take the uncommon_trap in the BuildCutout below.
// first must access the should_post_on_exceptions_flag in this thread's JavaThread
- Node* jthread = _gvn.transform(new (C) ThreadLocalNode());
+ Node* jthread = _gvn.transform(new ThreadLocalNode());
Node* adr = basic_plus_adr(top(), jthread, in_bytes(JavaThread::should_post_on_exceptions_flag_offset()));
Node* should_post_flag = make_load(control(), adr, TypeInt::INT, T_INT, Compile::AliasIdxRaw, MemNode::unordered);
// Test the should_post_on_exceptions_flag vs. 0
- Node* chk = _gvn.transform( new (C) CmpINode(should_post_flag, intcon(0)) );
- Node* tst = _gvn.transform( new (C) BoolNode(chk, BoolTest::eq) );
+ Node* chk = _gvn.transform( new CmpINode(should_post_flag, intcon(0)) );
+ Node* tst = _gvn.transform( new BoolNode(chk, BoolTest::eq) );
// Branch to slow_path if should_post_on_exceptions_flag was true
{ BuildCutout unless(this, tst, PROB_MAX);
@@ -675,8 +675,8 @@ BuildCutout::BuildCutout(GraphKit* kit, Node* p, float prob, float cnt)
SafePointNode* outer_map = _map; // preserved map is caller's
SafePointNode* inner_map = kit->map();
IfNode* iff = kit->create_and_map_if(outer_map->control(), p, prob, cnt);
- outer_map->set_control(kit->gvn().transform( new (kit->C) IfTrueNode(iff) ));
- inner_map->set_control(kit->gvn().transform( new (kit->C) IfFalseNode(iff) ));
+ outer_map->set_control(kit->gvn().transform( new IfTrueNode(iff) ));
+ inner_map->set_control(kit->gvn().transform( new IfFalseNode(iff) ));
}
BuildCutout::~BuildCutout() {
GraphKit* kit = _kit;
@@ -1118,7 +1118,7 @@ bool GraphKit::compute_stack_effects(int& inputs, int& depth) {
Node* GraphKit::basic_plus_adr(Node* base, Node* ptr, Node* offset) {
// short-circuit a common case
if (offset == intcon(0)) return ptr;
- return _gvn.transform( new (C) AddPNode(base, ptr, offset) );
+ return _gvn.transform( new AddPNode(base, ptr, offset) );
}
Node* GraphKit::ConvI2L(Node* offset) {
@@ -1127,7 +1127,7 @@ Node* GraphKit::ConvI2L(Node* offset) {
if (offset_con != Type::OffsetBot) {
return longcon((jlong) offset_con);
}
- return _gvn.transform( new (C) ConvI2LNode(offset));
+ return _gvn.transform( new ConvI2LNode(offset));
}
Node* GraphKit::ConvI2UL(Node* offset) {
@@ -1135,9 +1135,9 @@ Node* GraphKit::ConvI2UL(Node* offset) {
if (offset_con != (juint) Type::OffsetBot) {
return longcon((julong) offset_con);
}
- Node* conv = _gvn.transform( new (C) ConvI2LNode(offset));
+ Node* conv = _gvn.transform( new ConvI2LNode(offset));
Node* mask = _gvn.transform( ConLNode::make(C, (julong) max_juint) );
- return _gvn.transform( new (C) AndLNode(conv, mask) );
+ return _gvn.transform( new AndLNode(conv, mask) );
}
Node* GraphKit::ConvL2I(Node* offset) {
@@ -1146,7 +1146,7 @@ Node* GraphKit::ConvL2I(Node* offset) {
if (offset_con != (jlong)Type::OffsetBot) {
return intcon((int) offset_con);
}
- return _gvn.transform( new (C) ConvL2INode(offset));
+ return _gvn.transform( new ConvL2INode(offset));
}
//-------------------------load_object_klass-----------------------------------
@@ -1165,7 +1165,7 @@ Node* GraphKit::load_array_length(Node* array) {
Node *alen;
if (alloc == NULL) {
Node *r_adr = basic_plus_adr(array, arrayOopDesc::length_offset_in_bytes());
- alen = _gvn.transform( new (C) LoadRangeNode(0, immutable_memory(), r_adr, TypeInt::POS));
+ alen = _gvn.transform( new LoadRangeNode(0, immutable_memory(), r_adr, TypeInt::POS));
} else {
alen = alloc->Ideal_length();
Node* ccast = alloc->make_ideal_length(_gvn.type(array)->is_oopptr(), &_gvn);
@@ -1199,8 +1199,8 @@ Node* GraphKit::null_check_common(Node* value, BasicType type,
// Construct NULL check
Node *chk = NULL;
switch(type) {
- case T_LONG : chk = new (C) CmpLNode(value, _gvn.zerocon(T_LONG)); break;
- case T_INT : chk = new (C) CmpINode(value, _gvn.intcon(0)); break;
+ case T_LONG : chk = new CmpLNode(value, _gvn.zerocon(T_LONG)); break;
+ case T_INT : chk = new CmpINode(value, _gvn.intcon(0)); break;
case T_ARRAY : // fall through
type = T_OBJECT; // simplify further tests
case T_OBJECT : {
@@ -1247,7 +1247,7 @@ Node* GraphKit::null_check_common(Node* value, BasicType type,
return value; // Elided null check quickly!
}
}
- chk = new (C) CmpPNode( value, null() );
+ chk = new CmpPNode( value, null() );
break;
}
@@ -1258,7 +1258,7 @@ Node* GraphKit::null_check_common(Node* value, BasicType type,
chk = _gvn.transform(chk);
BoolTest::mask btest = assert_null ? BoolTest::eq : BoolTest::ne;
- BoolNode *btst = new (C) BoolNode( chk, btest);
+ BoolNode *btst = new BoolNode( chk, btest);
Node *tst = _gvn.transform( btst );
//-----------
@@ -1325,8 +1325,8 @@ Node* GraphKit::null_check_common(Node* value, BasicType type,
if (null_control != NULL) {
IfNode* iff = create_and_map_if(control(), tst, ok_prob, COUNT_UNKNOWN);
- Node* null_true = _gvn.transform( new (C) IfFalseNode(iff));
- set_control( _gvn.transform( new (C) IfTrueNode(iff)));
+ Node* null_true = _gvn.transform( new IfFalseNode(iff));
+ set_control( _gvn.transform( new IfTrueNode(iff)));
if (null_true == top())
explicit_null_checks_elided++;
(*null_control) = null_true;
@@ -1378,7 +1378,7 @@ Node* GraphKit::cast_not_null(Node* obj, bool do_replace_in_map) {
// Object is already not-null?
if( t == t_not_null ) return obj;
- Node *cast = new (C) CastPPNode(obj,t_not_null);
+ Node *cast = new CastPPNode(obj,t_not_null);
cast->init_req(0, control());
cast = _gvn.transform( cast );
@@ -1486,7 +1486,7 @@ void GraphKit::set_all_memory(Node* newmem) {
//------------------------------set_all_memory_call----------------------------
void GraphKit::set_all_memory_call(Node* call, bool separate_io_proj) {
- Node* newmem = _gvn.transform( new (C) ProjNode(call, TypeFunc::Memory, separate_io_proj) );
+ Node* newmem = _gvn.transform( new ProjNode(call, TypeFunc::Memory, separate_io_proj) );
set_all_memory(newmem);
}
@@ -1721,9 +1721,9 @@ Node* GraphKit::array_element_address(Node* ary, Node* idx, BasicType elembt,
int index_max = max_jint - 1; // array size is max_jint, index is one less
if (sizetype != NULL) index_max = sizetype->_hi - 1;
const TypeLong* lidxtype = TypeLong::make(CONST64(0), index_max, Type::WidenMax);
- idx = _gvn.transform( new (C) ConvI2LNode(idx, lidxtype) );
+ idx = _gvn.transform( new ConvI2LNode(idx, lidxtype) );
#endif
- Node* scale = _gvn.transform( new (C) LShiftXNode(idx, intcon(shift)) );
+ Node* scale = _gvn.transform( new LShiftXNode(idx, intcon(shift)) );
return basic_plus_adr(ary, base, scale);
}
@@ -1771,8 +1771,8 @@ void GraphKit::set_edges_for_java_call(CallJavaNode* call, bool must_throw, bool
// Re-use the current map to produce the result.
- set_control(_gvn.transform(new (C) ProjNode(call, TypeFunc::Control)));
- set_i_o( _gvn.transform(new (C) ProjNode(call, TypeFunc::I_O , separate_io_proj)));
+ set_control(_gvn.transform(new ProjNode(call, TypeFunc::Control)));
+ set_i_o( _gvn.transform(new ProjNode(call, TypeFunc::I_O , separate_io_proj)));
set_all_memory_call(xcall, separate_io_proj);
//return xcall; // no need, caller already has it
@@ -1786,7 +1786,7 @@ Node* GraphKit::set_results_for_java_call(CallJavaNode* call, bool separate_io_p
if (call->method() == NULL ||
call->method()->return_type()->basic_type() == T_VOID)
ret = top();
- else ret = _gvn.transform(new (C) ProjNode(call, TypeFunc::Parms));
+ else ret = _gvn.transform(new ProjNode(call, TypeFunc::Parms));
// Note: Since any out-of-line call can produce an exception,
// we always insert an I_O projection from the call into the result.
@@ -1797,8 +1797,8 @@ Node* GraphKit::set_results_for_java_call(CallJavaNode* call, bool separate_io_p
// The caller requested separate projections be used by the fall
// through and exceptional paths, so replace the projections for
// the fall through path.
- set_i_o(_gvn.transform( new (C) ProjNode(call, TypeFunc::I_O) ));
- set_all_memory(_gvn.transform( new (C) ProjNode(call, TypeFunc::Memory) ));
+ set_i_o(_gvn.transform( new ProjNode(call, TypeFunc::I_O) ));
+ set_all_memory(_gvn.transform( new ProjNode(call, TypeFunc::Memory) ));
}
return ret;
}
@@ -1838,13 +1838,13 @@ void GraphKit::set_predefined_output_for_runtime_call(Node* call,
Node* keep_mem,
const TypePtr* hook_mem) {
// no i/o
- set_control(_gvn.transform( new (C) ProjNode(call,TypeFunc::Control) ));
+ set_control(_gvn.transform( new ProjNode(call,TypeFunc::Control) ));
if (keep_mem) {
// First clone the existing memory state
set_all_memory(keep_mem);
if (hook_mem != NULL) {
// Make memory for the call
- Node* mem = _gvn.transform( new (C) ProjNode(call, TypeFunc::Memory) );
+ Node* mem = _gvn.transform( new ProjNode(call, TypeFunc::Memory) );
// Set the RawPtr memory state only. This covers all the heap top/GC stuff
// We also use hook_mem to extract specific effects from arraycopy stubs.
set_memory(mem, hook_mem);
@@ -1968,7 +1968,7 @@ void GraphKit::increment_counter(Node* counter_addr) {
int adr_type = Compile::AliasIdxRaw;
Node* ctrl = control();
Node* cnt = make_load(ctrl, counter_addr, TypeInt::INT, T_INT, adr_type, MemNode::unordered);
- Node* incr = _gvn.transform(new (C) AddINode(cnt, _gvn.intcon(1)));
+ Node* incr = _gvn.transform(new AddINode(cnt, _gvn.intcon(1)));
store_to_memory(ctrl, counter_addr, incr, T_INT, adr_type, MemNode::unordered);
}
@@ -2087,7 +2087,7 @@ void GraphKit::uncommon_trap(int trap_request,
// The debug info is the only real input to this call.
// Halt-and-catch fire here. The above call should never return!
- HaltNode* halt = new(C) HaltNode(control(), frameptr());
+ HaltNode* halt = new HaltNode(control(), frameptr());
_gvn.set_type_bottom(halt);
root()->add_req(halt);
@@ -2169,7 +2169,7 @@ Node* GraphKit::record_profile_for_speculation(Node* n, ciKlass* exact_kls, bool
// the new type. The new type depends on the control: what
// profiling tells us is only valid from here as far as we can
// tell.
- Node* cast = new(C) CheckCastPPNode(control(), n, current_type->remove_speculative()->join_speculative(spec_type));
+ Node* cast = new CheckCastPPNode(control(), n, current_type->remove_speculative()->join_speculative(spec_type));
cast = _gvn.transform(cast);
replace_in_map(n, cast);
n = cast;
@@ -2287,7 +2287,7 @@ void GraphKit::round_double_result(ciMethod* dest_method) {
Node* GraphKit::precision_rounding(Node* n) {
return UseStrictFP && _method->flags().is_strict()
&& UseSSE == 0 && Matcher::strict_fp_requires_explicit_rounding
- ? _gvn.transform( new (C) RoundFloatNode(0, n) )
+ ? _gvn.transform( new RoundFloatNode(0, n) )
: n;
}
@@ -2295,7 +2295,7 @@ Node* GraphKit::precision_rounding(Node* n) {
Node* GraphKit::dprecision_rounding(Node *n) {
return UseStrictFP && _method->flags().is_strict()
&& UseSSE <= 1 && Matcher::strict_fp_requires_explicit_rounding
- ? _gvn.transform( new (C) RoundDoubleNode(0, n) )
+ ? _gvn.transform( new RoundDoubleNode(0, n) )
: n;
}
@@ -2303,7 +2303,7 @@ Node* GraphKit::dprecision_rounding(Node *n) {
Node* GraphKit::dstore_rounding(Node* n) {
return Matcher::strict_fp_requires_explicit_rounding
&& UseSSE <= 1
- ? _gvn.transform( new (C) RoundDoubleNode(0, n) )
+ ? _gvn.transform( new RoundDoubleNode(0, n) )
: n;
}
@@ -2382,11 +2382,11 @@ Node* GraphKit::opt_iff(Node* region, Node* iff) {
IfNode *opt_iff = _gvn.transform(iff)->as_If();
// Fast path taken; set region slot 2
- Node *fast_taken = _gvn.transform( new (C) IfFalseNode(opt_iff) );
+ Node *fast_taken = _gvn.transform( new IfFalseNode(opt_iff) );
region->init_req(2,fast_taken); // Capture fast-control
// Fast path not-taken, i.e. slow path
- Node *slow_taken = _gvn.transform( new (C) IfTrueNode(opt_iff) );
+ Node *slow_taken = _gvn.transform( new IfTrueNode(opt_iff) );
return slow_taken;
}
@@ -2410,12 +2410,12 @@ Node* GraphKit::make_runtime_call(int flags,
}
CallNode* call;
if (!is_leaf) {
- call = new(C) CallStaticJavaNode(call_type, call_addr, call_name,
+ call = new CallStaticJavaNode(call_type, call_addr, call_name,
bci(), adr_type);
} else if (flags & RC_NO_FP) {
- call = new(C) CallLeafNoFPNode(call_type, call_addr, call_name, adr_type);
+ call = new CallLeafNoFPNode(call_type, call_addr, call_name, adr_type);
} else {
- call = new(C) CallLeafNode(call_type, call_addr, call_name, adr_type);
+ call = new CallLeafNode(call_type, call_addr, call_name, adr_type);
}
// The following is similar to set_edges_for_java_call,
@@ -2476,7 +2476,7 @@ Node* GraphKit::make_runtime_call(int flags,
}
if (has_io) {
- set_i_o(_gvn.transform(new (C) ProjNode(call, TypeFunc::I_O)));
+ set_i_o(_gvn.transform(new ProjNode(call, TypeFunc::I_O)));
}
return call;
@@ -2517,10 +2517,10 @@ void GraphKit::make_slow_call_ex(Node* call, ciInstanceKlass* ex_klass, bool sep
if (stopped()) return;
// Make a catch node with just two handlers: fall-through and catch-all
- Node* i_o = _gvn.transform( new (C) ProjNode(call, TypeFunc::I_O, separate_io_proj) );
- Node* catc = _gvn.transform( new (C) CatchNode(control(), i_o, 2) );
- Node* norm = _gvn.transform( new (C) CatchProjNode(catc, CatchProjNode::fall_through_index, CatchProjNode::no_handler_bci) );
- Node* excp = _gvn.transform( new (C) CatchProjNode(catc, CatchProjNode::catch_all_index, CatchProjNode::no_handler_bci) );
+ Node* i_o = _gvn.transform( new ProjNode(call, TypeFunc::I_O, separate_io_proj) );
+ Node* catc = _gvn.transform( new CatchNode(control(), i_o, 2) );
+ Node* norm = _gvn.transform( new CatchProjNode(catc, CatchProjNode::fall_through_index, CatchProjNode::no_handler_bci) );
+ Node* excp = _gvn.transform( new CatchProjNode(catc, CatchProjNode::catch_all_index, CatchProjNode::no_handler_bci) );
{ PreserveJVMState pjvms(this);
set_control(excp);
@@ -2530,7 +2530,7 @@ void GraphKit::make_slow_call_ex(Node* call, ciInstanceKlass* ex_klass, bool sep
// Create an exception state also.
// Use an exact type if the caller has specified a specific exception.
const Type* ex_type = TypeOopPtr::make_from_klass_unique(ex_klass)->cast_to_ptr_type(TypePtr::NotNull);
- Node* ex_oop = new (C) CreateExNode(ex_type, control(), i_o);
+ Node* ex_oop = new CreateExNode(ex_type, control(), i_o);
add_exception_state(make_exception_state(_gvn.transform(ex_oop)));
}
}
@@ -2580,11 +2580,11 @@ Node* GraphKit::gen_subtype_check(Node* subklass, Node* superklass) {
case SSC_easy_test:
{
// Just do a direct pointer compare and be done.
- Node* cmp = _gvn.transform( new(C) CmpPNode(subklass, superklass) );
- Node* bol = _gvn.transform( new(C) BoolNode(cmp, BoolTest::eq) );
+ Node* cmp = _gvn.transform( new CmpPNode(subklass, superklass) );
+ Node* bol = _gvn.transform( new BoolNode(cmp, BoolTest::eq) );
IfNode* iff = create_and_xform_if(control(), bol, PROB_STATIC_FREQUENT, COUNT_UNKNOWN);
- set_control( _gvn.transform( new(C) IfTrueNode (iff) ) );
- return _gvn.transform( new(C) IfFalseNode(iff) );
+ set_control( _gvn.transform( new IfTrueNode (iff) ) );
+ return _gvn.transform( new IfFalseNode(iff) );
}
case SSC_full_test:
break;
@@ -2599,7 +2599,7 @@ Node* GraphKit::gen_subtype_check(Node* subklass, Node* superklass) {
// First load the super-klass's check-offset
Node *p1 = basic_plus_adr( superklass, superklass, in_bytes(Klass::super_check_offset_offset()) );
- Node *chk_off = _gvn.transform(new (C) LoadINode(NULL, memory(p1), p1, _gvn.type(p1)->is_ptr(),
+ Node *chk_off = _gvn.transform(new LoadINode(NULL, memory(p1), p1, _gvn.type(p1)->is_ptr(),
TypeInt::INT, MemNode::unordered));
int cacheoff_con = in_bytes(Klass::secondary_super_cache_offset());
bool might_be_cache = (find_int_con(chk_off, cacheoff_con) == cacheoff_con);
@@ -2611,7 +2611,7 @@ Node* GraphKit::gen_subtype_check(Node* subklass, Node* superklass) {
// Worst-case type is a little odd: NULL is allowed as a result (usually
// klass loads can never produce a NULL).
Node *chk_off_X = ConvI2X(chk_off);
- Node *p2 = _gvn.transform( new (C) AddPNode(subklass,subklass,chk_off_X) );
+ Node *p2 = _gvn.transform( new AddPNode(subklass,subklass,chk_off_X) );
// For some types like interfaces the following loadKlass is from a 1-word
// cache which is mutable so can't use immutable memory. Other
// types load from the super-class display table which is immutable.
@@ -2625,11 +2625,11 @@ Node* GraphKit::gen_subtype_check(Node* subklass, Node* superklass) {
// See if we get an immediate positive hit. Happens roughly 83% of the
// time. Test to see if the value loaded just previously from the subklass
// is exactly the superklass.
- Node *cmp1 = _gvn.transform( new (C) CmpPNode( superklass, nkls ) );
- Node *bol1 = _gvn.transform( new (C) BoolNode( cmp1, BoolTest::eq ) );
+ Node *cmp1 = _gvn.transform( new CmpPNode( superklass, nkls ) );
+ Node *bol1 = _gvn.transform( new BoolNode( cmp1, BoolTest::eq ) );
IfNode *iff1 = create_and_xform_if( control(), bol1, PROB_LIKELY(0.83f), COUNT_UNKNOWN );
- Node *iftrue1 = _gvn.transform( new (C) IfTrueNode ( iff1 ) );
- set_control( _gvn.transform( new (C) IfFalseNode( iff1 ) ) );
+ Node *iftrue1 = _gvn.transform( new IfTrueNode ( iff1 ) );
+ set_control( _gvn.transform( new IfFalseNode( iff1 ) ) );
// Compile speed common case: Check for being deterministic right now. If
// chk_off is a constant and not equal to cacheoff then we are NOT a
@@ -2642,9 +2642,9 @@ Node* GraphKit::gen_subtype_check(Node* subklass, Node* superklass) {
}
// Gather the various success & failures here
- RegionNode *r_ok_subtype = new (C) RegionNode(4);
+ RegionNode *r_ok_subtype = new RegionNode(4);
record_for_igvn(r_ok_subtype);
- RegionNode *r_not_subtype = new (C) RegionNode(3);
+ RegionNode *r_not_subtype = new RegionNode(3);
record_for_igvn(r_not_subtype);
r_ok_subtype->init_req(1, iftrue1);
@@ -2655,20 +2655,20 @@ Node* GraphKit::gen_subtype_check(Node* subklass, Node* superklass) {
// cache. If it points to the display (and NOT the cache) and the display
// missed then it's not a subtype.
Node *cacheoff = _gvn.intcon(cacheoff_con);
- Node *cmp2 = _gvn.transform( new (C) CmpINode( chk_off, cacheoff ) );
- Node *bol2 = _gvn.transform( new (C) BoolNode( cmp2, BoolTest::ne ) );
+ Node *cmp2 = _gvn.transform( new CmpINode( chk_off, cacheoff ) );
+ Node *bol2 = _gvn.transform( new BoolNode( cmp2, BoolTest::ne ) );
IfNode *iff2 = create_and_xform_if( control(), bol2, PROB_LIKELY(0.63f), COUNT_UNKNOWN );
- r_not_subtype->init_req(1, _gvn.transform( new (C) IfTrueNode (iff2) ) );
- set_control( _gvn.transform( new (C) IfFalseNode(iff2) ) );
+ r_not_subtype->init_req(1, _gvn.transform( new IfTrueNode (iff2) ) );
+ set_control( _gvn.transform( new IfFalseNode(iff2) ) );
// Check for self. Very rare to get here, but it is taken 1/3 the time.
// No performance impact (too rare) but allows sharing of secondary arrays
// which has some footprint reduction.
- Node *cmp3 = _gvn.transform( new (C) CmpPNode( subklass, superklass ) );
- Node *bol3 = _gvn.transform( new (C) BoolNode( cmp3, BoolTest::eq ) );
+ Node *cmp3 = _gvn.transform( new CmpPNode( subklass, superklass ) );
+ Node *bol3 = _gvn.transform( new BoolNode( cmp3, BoolTest::eq ) );
IfNode *iff3 = create_and_xform_if( control(), bol3, PROB_LIKELY(0.36f), COUNT_UNKNOWN );
- r_ok_subtype->init_req(2, _gvn.transform( new (C) IfTrueNode ( iff3 ) ) );
- set_control( _gvn.transform( new (C) IfFalseNode( iff3 ) ) );
+ r_ok_subtype->init_req(2, _gvn.transform( new IfTrueNode ( iff3 ) ) );
+ set_control( _gvn.transform( new IfFalseNode( iff3 ) ) );
// -- Roads not taken here: --
// We could also have chosen to perform the self-check at the beginning
@@ -2692,13 +2692,13 @@ Node* GraphKit::gen_subtype_check(Node* subklass, Node* superklass) {
// The decision to inline or out-of-line this final check is platform
// dependent, and is found in the AD file definition of PartialSubtypeCheck.
Node* psc = _gvn.transform(
- new (C) PartialSubtypeCheckNode(control(), subklass, superklass) );
+ new PartialSubtypeCheckNode(control(), subklass, superklass) );
- Node *cmp4 = _gvn.transform( new (C) CmpPNode( psc, null() ) );
- Node *bol4 = _gvn.transform( new (C) BoolNode( cmp4, BoolTest::ne ) );
+ Node *cmp4 = _gvn.transform( new CmpPNode( psc, null() ) );
+ Node *bol4 = _gvn.transform( new BoolNode( cmp4, BoolTest::ne ) );
IfNode *iff4 = create_and_xform_if( control(), bol4, PROB_FAIR, COUNT_UNKNOWN );
- r_not_subtype->init_req(2, _gvn.transform( new (C) IfTrueNode (iff4) ) );
- r_ok_subtype ->init_req(3, _gvn.transform( new (C) IfFalseNode(iff4) ) );
+ r_not_subtype->init_req(2, _gvn.transform( new IfTrueNode (iff4) ) );
+ r_ok_subtype ->init_req(3, _gvn.transform( new IfFalseNode(iff4) ) );
// Return false path; set default control to true path.
set_control( _gvn.transform(r_ok_subtype) );
@@ -2762,18 +2762,18 @@ Node* GraphKit::type_check_receiver(Node* receiver, ciKlass* klass,
const TypeKlassPtr* tklass = TypeKlassPtr::make(klass);
Node* recv_klass = load_object_klass(receiver);
Node* want_klass = makecon(tklass);
- Node* cmp = _gvn.transform( new(C) CmpPNode(recv_klass, want_klass) );
- Node* bol = _gvn.transform( new(C) BoolNode(cmp, BoolTest::eq) );
+ Node* cmp = _gvn.transform( new CmpPNode(recv_klass, want_klass) );
+ Node* bol = _gvn.transform( new BoolNode(cmp, BoolTest::eq) );
IfNode* iff = create_and_xform_if(control(), bol, prob, COUNT_UNKNOWN);
- set_control( _gvn.transform( new(C) IfTrueNode (iff) ));
- Node* fail = _gvn.transform( new(C) IfFalseNode(iff) );
+ set_control( _gvn.transform( new IfTrueNode (iff) ));
+ Node* fail = _gvn.transform( new IfFalseNode(iff) );
const TypeOopPtr* recv_xtype = tklass->as_instance_type();
assert(recv_xtype->klass_is_exact(), "");
// Subsume downstream occurrences of receiver with a cast to
// recv_xtype, since now we know what the type will be.
- Node* cast = new(C) CheckCastPPNode(control(), receiver, recv_xtype);
+ Node* cast = new CheckCastPPNode(control(), receiver, recv_xtype);
(*casted_receiver) = _gvn.transform(cast);
// (User must make the replace_in_map call.)
@@ -2920,8 +2920,8 @@ Node* GraphKit::gen_instanceof(Node* obj, Node* superklass, bool safe_for_replac
// Make the merge point
enum { _obj_path = 1, _fail_path, _null_path, PATH_LIMIT };
- RegionNode* region = new(C) RegionNode(PATH_LIMIT);
- Node* phi = new(C) PhiNode(region, TypeInt::BOOL);
+ RegionNode* region = new RegionNode(PATH_LIMIT);
+ Node* phi = new PhiNode(region, TypeInt::BOOL);
C->set_has_split_ifs(true); // Has chance for split-if optimization
ciProfileData* data = NULL;
@@ -3052,8 +3052,8 @@ Node* GraphKit::gen_checkcast(Node *obj, Node* superklass,
// Make the merge point
enum { _obj_path = 1, _null_path, PATH_LIMIT };
- RegionNode* region = new (C) RegionNode(PATH_LIMIT);
- Node* phi = new (C) PhiNode(region, toop);
+ RegionNode* region = new RegionNode(PATH_LIMIT);
+ Node* phi = new PhiNode(region, toop);
C->set_has_split_ifs(true); // Has chance for split-if optimization
// Use null-cast information if it is available
@@ -3114,8 +3114,7 @@ Node* GraphKit::gen_checkcast(Node *obj, Node* superklass,
Node* not_subtype_ctrl = gen_subtype_check( obj_klass, superklass );
// Plug in success path into the merge
- cast_obj = _gvn.transform(new (C) CheckCastPPNode(control(),
- not_null_obj, toop));
+ cast_obj = _gvn.transform(new CheckCastPPNode(control(), not_null_obj, toop));
// Failure path ends in uncommon trap (or may be dead - failure impossible)
if (failure_control == NULL) {
if (not_subtype_ctrl != top()) { // If failure is possible
@@ -3168,7 +3167,7 @@ Node* GraphKit::insert_mem_bar(int opcode, Node* precedent) {
mb->init_req(TypeFunc::Control, control());
mb->init_req(TypeFunc::Memory, reset_memory());
Node* membar = _gvn.transform(mb);
- set_control(_gvn.transform(new (C) ProjNode(membar, TypeFunc::Control)));
+ set_control(_gvn.transform(new ProjNode(membar, TypeFunc::Control)));
set_all_memory_call(membar);
return membar;
}
@@ -3197,11 +3196,11 @@ Node* GraphKit::insert_mem_bar_volatile(int opcode, int alias_idx, Node* precede
mb->set_req(TypeFunc::Memory, memory(alias_idx));
}
Node* membar = _gvn.transform(mb);
- set_control(_gvn.transform(new (C) ProjNode(membar, TypeFunc::Control)));
+ set_control(_gvn.transform(new ProjNode(membar, TypeFunc::Control)));
if (alias_idx == Compile::AliasIdxBot) {
- merged_memory()->set_base_memory(_gvn.transform(new (C) ProjNode(membar, TypeFunc::Memory)));
+ merged_memory()->set_base_memory(_gvn.transform(new ProjNode(membar, TypeFunc::Memory)));
} else {
- set_memory(_gvn.transform(new (C) ProjNode(membar, TypeFunc::Memory)),alias_idx);
+ set_memory(_gvn.transform(new ProjNode(membar, TypeFunc::Memory)),alias_idx);
}
return membar;
}
@@ -3221,10 +3220,10 @@ FastLockNode* GraphKit::shared_lock(Node* obj) {
assert(dead_locals_are_killed(), "should kill locals before sync. point");
// Box the stack location
- Node* box = _gvn.transform(new (C) BoxLockNode(next_monitor()));
+ Node* box = _gvn.transform(new BoxLockNode(next_monitor()));
Node* mem = reset_memory();
- FastLockNode * flock = _gvn.transform(new (C) FastLockNode(0, obj, box) )->as_FastLock();
+ FastLockNode * flock = _gvn.transform(new FastLockNode(0, obj, box) )->as_FastLock();
if (UseBiasedLocking && PrintPreciseBiasedLockingStatistics) {
// Create the counters for this fast lock.
flock->create_lock_counter(sync_jvms()); // sync_jvms used to get current bci
@@ -3238,7 +3237,7 @@ FastLockNode* GraphKit::shared_lock(Node* obj) {
map()->push_monitor( flock );
const TypeFunc *tf = LockNode::lock_type();
- LockNode *lock = new (C) LockNode(C, tf);
+ LockNode *lock = new LockNode(C, tf);
lock->init_req( TypeFunc::Control, control() );
lock->init_req( TypeFunc::Memory , mem );
@@ -3292,7 +3291,7 @@ void GraphKit::shared_unlock(Node* box, Node* obj) {
insert_mem_bar(Op_MemBarReleaseLock);
const TypeFunc *tf = OptoRuntime::complete_monitor_exit_Type();
- UnlockNode *unlock = new (C) UnlockNode(C, tf);
+ UnlockNode *unlock = new UnlockNode(C, tf);
uint raw_idx = Compile::AliasIdxRaw;
unlock->init_req( TypeFunc::Control, control() );
unlock->init_req( TypeFunc::Memory , memory(raw_idx) );
@@ -3358,19 +3357,19 @@ Node* GraphKit::set_output_for_allocation(AllocateNode* alloc,
alloc->set_req( TypeFunc::FramePtr, frameptr() );
add_safepoint_edges(alloc);
Node* allocx = _gvn.transform(alloc);
- set_control( _gvn.transform(new (C) ProjNode(allocx, TypeFunc::Control) ) );
+ set_control( _gvn.transform(new ProjNode(allocx, TypeFunc::Control) ) );
// create memory projection for i_o
- set_memory ( _gvn.transform( new (C) ProjNode(allocx, TypeFunc::Memory, true) ), rawidx );
+ set_memory ( _gvn.transform( new ProjNode(allocx, TypeFunc::Memory, true) ), rawidx );
make_slow_call_ex(allocx, env()->Throwable_klass(), true);
// create a memory projection as for the normal control path
- Node* malloc = _gvn.transform(new (C) ProjNode(allocx, TypeFunc::Memory));
+ Node* malloc = _gvn.transform(new ProjNode(allocx, TypeFunc::Memory));
set_memory(malloc, rawidx);
// a normal slow-call doesn't change i_o, but an allocation does
// we create a separate i_o projection for the normal control path
- set_i_o(_gvn.transform( new (C) ProjNode(allocx, TypeFunc::I_O, false) ) );
- Node* rawoop = _gvn.transform( new (C) ProjNode(allocx, TypeFunc::Parms) );
+ set_i_o(_gvn.transform( new ProjNode(allocx, TypeFunc::I_O, false) ) );
+ Node* rawoop = _gvn.transform( new ProjNode(allocx, TypeFunc::Parms) );
// put in an initialization barrier
InitializeNode* init = insert_mem_bar_volatile(Op_Initialize, rawidx,
@@ -3406,7 +3405,7 @@ Node* GraphKit::set_output_for_allocation(AllocateNode* alloc,
}
// Cast raw oop to the real thing...
- Node* javaoop = new (C) CheckCastPPNode(control(), rawoop, oop_type);
+ Node* javaoop = new CheckCastPPNode(control(), rawoop, oop_type);
javaoop = _gvn.transform(javaoop);
C->set_recent_alloc(control(), javaoop);
assert(just_allocated_object(control()) == javaoop, "just allocated");
@@ -3465,9 +3464,9 @@ Node* GraphKit::new_instance(Node* klass_node,
// (It may be stress-tested by specifying StressReflectiveCode.)
// Basically, we want to get into the VM is there's an illegal argument.
Node* bit = intcon(Klass::_lh_instance_slow_path_bit);
- initial_slow_test = _gvn.transform( new (C) AndINode(layout_val, bit) );
+ initial_slow_test = _gvn.transform( new AndINode(layout_val, bit) );
if (extra_slow_test != intcon(0)) {
- initial_slow_test = _gvn.transform( new (C) OrINode(initial_slow_test, extra_slow_test) );
+ initial_slow_test = _gvn.transform( new OrINode(initial_slow_test, extra_slow_test) );
}
// (Macro-expander will further convert this to a Bool, if necessary.)
}
@@ -3484,7 +3483,7 @@ Node* GraphKit::new_instance(Node* klass_node,
// Clear the low bits to extract layout_helper_size_in_bytes:
assert((int)Klass::_lh_instance_slow_path_bit < BytesPerLong, "clear bit");
Node* mask = MakeConX(~ (intptr_t)right_n_bits(LogBytesPerLong));
- size = _gvn.transform( new (C) AndXNode(size, mask) );
+ size = _gvn.transform( new AndXNode(size, mask) );
}
if (return_size_val != NULL) {
(*return_size_val) = size;
@@ -3504,11 +3503,10 @@ Node* GraphKit::new_instance(Node* klass_node,
Node *mem = reset_memory();
set_all_memory(mem); // Create new memory state
- AllocateNode* alloc
- = new (C) AllocateNode(C, AllocateNode::alloc_type(Type::TOP),
- control(), mem, i_o(),
- size, klass_node,
- initial_slow_test);
+ AllocateNode* alloc = new AllocateNode(C, AllocateNode::alloc_type(Type::TOP),
+ control(), mem, i_o(),
+ size, klass_node,
+ initial_slow_test);
return set_output_for_allocation(alloc, oop_type);
}
@@ -3531,8 +3529,8 @@ Node* GraphKit::new_array(Node* klass_node, // array klass (maybe variable)
// Optimistically assume that it is a subtype of Object[],
// so that we can fold up all the address arithmetic.
layout_con = Klass::array_layout_helper(T_OBJECT);
- Node* cmp_lh = _gvn.transform( new(C) CmpINode(layout_val, intcon(layout_con)) );
- Node* bol_lh = _gvn.transform( new(C) BoolNode(cmp_lh, BoolTest::eq) );
+ Node* cmp_lh = _gvn.transform( new CmpINode(layout_val, intcon(layout_con)) );
+ Node* bol_lh = _gvn.transform( new BoolNode(cmp_lh, BoolTest::eq) );
{ BuildCutout unless(this, bol_lh, PROB_MAX);
inc_sp(nargs);
uncommon_trap(Deoptimization::Reason_class_check,
@@ -3556,8 +3554,8 @@ Node* GraphKit::new_array(Node* klass_node, // array klass (maybe variable)
fast_size_limit <<= (LogBytesPerLong - log2_esize);
}
- Node* initial_slow_cmp = _gvn.transform( new (C) CmpUNode( length, intcon( fast_size_limit ) ) );
- Node* initial_slow_test = _gvn.transform( new (C) BoolNode( initial_slow_cmp, BoolTest::gt ) );
+ Node* initial_slow_cmp = _gvn.transform( new CmpUNode( length, intcon( fast_size_limit ) ) );
+ Node* initial_slow_test = _gvn.transform( new BoolNode( initial_slow_cmp, BoolTest::gt ) );
if (initial_slow_test->is_Bool()) {
// Hide it behind a CMoveI, or else PhaseIdealLoop::split_up will get sick.
initial_slow_test = initial_slow_test->as_Bool()->as_int_value(&_gvn);
@@ -3585,10 +3583,10 @@ Node* GraphKit::new_array(Node* klass_node, // array klass (maybe variable)
} else {
Node* hss = intcon(Klass::_lh_header_size_shift);
Node* hsm = intcon(Klass::_lh_header_size_mask);
- Node* hsize = _gvn.transform( new(C) URShiftINode(layout_val, hss) );
- hsize = _gvn.transform( new(C) AndINode(hsize, hsm) );
+ Node* hsize = _gvn.transform( new URShiftINode(layout_val, hss) );
+ hsize = _gvn.transform( new AndINode(hsize, hsm) );
Node* mask = intcon(round_mask);
- header_size = _gvn.transform( new(C) AddINode(hsize, mask) );
+ header_size = _gvn.transform( new AddINode(hsize, mask) );
}
Node* elem_shift = NULL;
@@ -3613,7 +3611,7 @@ Node* GraphKit::new_array(Node* klass_node, // array klass (maybe variable)
jlong size_max = arrayOopDesc::max_array_length(T_BYTE);
if (size_max > tllen->_hi) size_max = tllen->_hi;
const TypeLong* tlcon = TypeLong::make(CONST64(0), size_max, Type::WidenMin);
- lengthx = _gvn.transform( new (C) ConvI2LNode(length, tlcon));
+ lengthx = _gvn.transform( new ConvI2LNode(length, tlcon));
}
}
#endif
@@ -3624,11 +3622,11 @@ Node* GraphKit::new_array(Node* klass_node, // array klass (maybe variable)
// after a successful allocation.
Node* abody = lengthx;
if (elem_shift != NULL)
- abody = _gvn.transform( new(C) LShiftXNode(lengthx, elem_shift) );
- Node* size = _gvn.transform( new(C) AddXNode(headerx, abody) );
+ abody = _gvn.transform( new LShiftXNode(lengthx, elem_shift) );
+ Node* size = _gvn.transform( new AddXNode(headerx, abody) );
if (round_mask != 0) {
Node* mask = MakeConX(~round_mask);
- size = _gvn.transform( new(C) AndXNode(size, mask) );
+ size = _gvn.transform( new AndXNode(size, mask) );
}
// else if round_mask == 0, the size computation is self-rounding
@@ -3646,11 +3644,11 @@ Node* GraphKit::new_array(Node* klass_node, // array klass (maybe variable)
// Create the AllocateArrayNode and its result projections
AllocateArrayNode* alloc
- = new (C) AllocateArrayNode(C, AllocateArrayNode::alloc_type(TypeInt::INT),
- control(), mem, i_o(),
- size, klass_node,
- initial_slow_test,
- length);
+ = new AllocateArrayNode(C, AllocateArrayNode::alloc_type(TypeInt::INT),
+ control(), mem, i_o(),
+ size, klass_node,
+ initial_slow_test,
+ length);
// Cast to correct type. Note that the klass_node may be constant or not,
// and in the latter case the actual array type will be inexact also.
@@ -3760,10 +3758,10 @@ void GraphKit::add_predicate_impl(Deoptimization::DeoptReason reason, int nargs)
}
Node *cont = _gvn.intcon(1);
- Node* opq = _gvn.transform(new (C) Opaque1Node(C, cont));
- Node *bol = _gvn.transform(new (C) Conv2BNode(opq));
+ Node* opq = _gvn.transform(new Opaque1Node(C, cont));
+ Node *bol = _gvn.transform(new Conv2BNode(opq));
IfNode* iff = create_and_map_if(control(), bol, PROB_MAX, COUNT_UNKNOWN);
- Node* iffalse = _gvn.transform(new (C) IfFalseNode(iff));
+ Node* iffalse = _gvn.transform(new IfFalseNode(iff));
C->add_predicate_opaq(opq);
{
PreserveJVMState pjvms(this);
@@ -3771,7 +3769,7 @@ void GraphKit::add_predicate_impl(Deoptimization::DeoptReason reason, int nargs)
inc_sp(nargs);
uncommon_trap(reason, Deoptimization::Action_maybe_recompile);
}
- Node* iftrue = _gvn.transform(new (C) IfTrueNode(iff));
+ Node* iftrue = _gvn.transform(new IfTrueNode(iff));
set_control(iftrue);
}
@@ -3963,7 +3961,7 @@ void GraphKit::g1_write_barrier_pre(bool do_load,
__ if_then(index, BoolTest::ne, zeroX, likely); {
// decrement the index
- Node* next_index = _gvn.transform(new (C) SubXNode(index, __ ConX(sizeof(intptr_t))));
+ Node* next_index = _gvn.transform(new SubXNode(index, __ ConX(sizeof(intptr_t))));
// Now get the buffer location we will log the previous value into and store it
Node *log_addr = __ AddP(no_base, buffer, next_index);
@@ -4006,7 +4004,7 @@ void GraphKit::g1_mark_card(IdealKit& ideal,
// Now do the queue work
__ if_then(index, BoolTest::ne, zeroX); {
- Node* next_index = _gvn.transform(new (C) SubXNode(index, __ ConX(sizeof(intptr_t))));
+ Node* next_index = _gvn.transform(new SubXNode(index, __ ConX(sizeof(intptr_t))));
Node* log_addr = __ AddP(no_base, buffer, next_index);
// Order, see storeCM.
@@ -4213,5 +4211,5 @@ void GraphKit::store_String_length(Node* ctrl, Node* str, Node* value) {
Node* GraphKit::cast_array_to_stable(Node* ary, const TypeAryPtr* ary_type) {
// Reify the property as a CastPP node in Ideal graph to comply with monotonicity
// assumption of CCP analysis.
- return _gvn.transform(new(C) CastPPNode(ary, ary_type->cast_to_stable(true)));
+ return _gvn.transform(new CastPPNode(ary, ary_type->cast_to_stable(true)));
}
diff --git a/hotspot/src/share/vm/opto/graphKit.hpp b/hotspot/src/share/vm/opto/graphKit.hpp
index 0d2c6b07a81..2433c95d2ab 100644
--- a/hotspot/src/share/vm/opto/graphKit.hpp
+++ b/hotspot/src/share/vm/opto/graphKit.hpp
@@ -309,31 +309,31 @@ class GraphKit : public Phase {
// Some convenient shortcuts for common nodes
- Node* IfTrue(IfNode* iff) { return _gvn.transform(new (C) IfTrueNode(iff)); }
- Node* IfFalse(IfNode* iff) { return _gvn.transform(new (C) IfFalseNode(iff)); }
+ Node* IfTrue(IfNode* iff) { return _gvn.transform(new IfTrueNode(iff)); }
+ Node* IfFalse(IfNode* iff) { return _gvn.transform(new IfFalseNode(iff)); }
- Node* AddI(Node* l, Node* r) { return _gvn.transform(new (C) AddINode(l, r)); }
- Node* SubI(Node* l, Node* r) { return _gvn.transform(new (C) SubINode(l, r)); }
- Node* MulI(Node* l, Node* r) { return _gvn.transform(new (C) MulINode(l, r)); }
- Node* DivI(Node* ctl, Node* l, Node* r) { return _gvn.transform(new (C) DivINode(ctl, l, r)); }
+ Node* AddI(Node* l, Node* r) { return _gvn.transform(new AddINode(l, r)); }
+ Node* SubI(Node* l, Node* r) { return _gvn.transform(new SubINode(l, r)); }
+ Node* MulI(Node* l, Node* r) { return _gvn.transform(new MulINode(l, r)); }
+ Node* DivI(Node* ctl, Node* l, Node* r) { return _gvn.transform(new DivINode(ctl, l, r)); }
- Node* AndI(Node* l, Node* r) { return _gvn.transform(new (C) AndINode(l, r)); }
- Node* OrI(Node* l, Node* r) { return _gvn.transform(new (C) OrINode(l, r)); }
- Node* XorI(Node* l, Node* r) { return _gvn.transform(new (C) XorINode(l, r)); }
+ Node* AndI(Node* l, Node* r) { return _gvn.transform(new AndINode(l, r)); }
+ Node* OrI(Node* l, Node* r) { return _gvn.transform(new OrINode(l, r)); }
+ Node* XorI(Node* l, Node* r) { return _gvn.transform(new XorINode(l, r)); }
- Node* MaxI(Node* l, Node* r) { return _gvn.transform(new (C) MaxINode(l, r)); }
- Node* MinI(Node* l, Node* r) { return _gvn.transform(new (C) MinINode(l, r)); }
+ Node* MaxI(Node* l, Node* r) { return _gvn.transform(new MaxINode(l, r)); }
+ Node* MinI(Node* l, Node* r) { return _gvn.transform(new MinINode(l, r)); }
- Node* LShiftI(Node* l, Node* r) { return _gvn.transform(new (C) LShiftINode(l, r)); }
- Node* RShiftI(Node* l, Node* r) { return _gvn.transform(new (C) RShiftINode(l, r)); }
- Node* URShiftI(Node* l, Node* r) { return _gvn.transform(new (C) URShiftINode(l, r)); }
+ Node* LShiftI(Node* l, Node* r) { return _gvn.transform(new LShiftINode(l, r)); }
+ Node* RShiftI(Node* l, Node* r) { return _gvn.transform(new RShiftINode(l, r)); }
+ Node* URShiftI(Node* l, Node* r) { return _gvn.transform(new URShiftINode(l, r)); }
- Node* CmpI(Node* l, Node* r) { return _gvn.transform(new (C) CmpINode(l, r)); }
- Node* CmpL(Node* l, Node* r) { return _gvn.transform(new (C) CmpLNode(l, r)); }
- Node* CmpP(Node* l, Node* r) { return _gvn.transform(new (C) CmpPNode(l, r)); }
- Node* Bool(Node* cmp, BoolTest::mask relop) { return _gvn.transform(new (C) BoolNode(cmp, relop)); }
+ Node* CmpI(Node* l, Node* r) { return _gvn.transform(new CmpINode(l, r)); }
+ Node* CmpL(Node* l, Node* r) { return _gvn.transform(new CmpLNode(l, r)); }
+ Node* CmpP(Node* l, Node* r) { return _gvn.transform(new CmpPNode(l, r)); }
+ Node* Bool(Node* cmp, BoolTest::mask relop) { return _gvn.transform(new BoolNode(cmp, relop)); }
- Node* AddP(Node* b, Node* a, Node* o) { return _gvn.transform(new (C) AddPNode(b, a, o)); }
+ Node* AddP(Node* b, Node* a, Node* o) { return _gvn.transform(new AddPNode(b, a, o)); }
// Convert between int and long, and size_t.
// (See macros ConvI2X, etc., in type.hpp for ConvI2X, etc.)
@@ -867,7 +867,7 @@ class GraphKit : public Phase {
// Handy for making control flow
IfNode* create_and_map_if(Node* ctrl, Node* tst, float prob, float cnt) {
- IfNode* iff = new (C) IfNode(ctrl, tst, prob, cnt);// New IfNode's
+ IfNode* iff = new IfNode(ctrl, tst, prob, cnt);// New IfNode's
_gvn.set_type(iff, iff->Value(&_gvn)); // Value may be known at parse-time
// Place 'if' on worklist if it will be in graph
if (!tst->is_Con()) record_for_igvn(iff); // Range-check and Null-check removal is later
@@ -875,7 +875,7 @@ class GraphKit : public Phase {
}
IfNode* create_and_xform_if(Node* ctrl, Node* tst, float prob, float cnt) {
- IfNode* iff = new (C) IfNode(ctrl, tst, prob, cnt);// New IfNode's
+ IfNode* iff = new IfNode(ctrl, tst, prob, cnt);// New IfNode's
_gvn.transform(iff); // Value may be known at parse-time
// Place 'if' on worklist if it will be in graph
if (!tst->is_Con()) record_for_igvn(iff); // Range-check and Null-check removal is later
diff --git a/hotspot/src/share/vm/opto/idealKit.cpp b/hotspot/src/share/vm/opto/idealKit.cpp
index ee4c212d1ca..a0a9cbe62cc 100644
--- a/hotspot/src/share/vm/opto/idealKit.cpp
+++ b/hotspot/src/share/vm/opto/idealKit.cpp
@@ -86,7 +86,7 @@ void IdealKit::if_then(Node* left, BoolTest::mask relop,
}
// Delay gvn.tranform on if-nodes until construction is finished
// to prevent a constant bool input from discarding a control output.
- IfNode* iff = delay_transform(new (C) IfNode(ctrl(), bol, prob, cnt))->as_If();
+ IfNode* iff = delay_transform(new IfNode(ctrl(), bol, prob, cnt))->as_If();
Node* then = IfTrue(iff);
Node* elsen = IfFalse(iff);
Node* else_cvstate = copy_cvstate();
@@ -205,7 +205,7 @@ Node* IdealKit::make_label(int goto_ct) {
assert(_cvstate != NULL, "must declare variables before labels");
Node* lab = new_cvstate();
int sz = 1 + goto_ct + 1 /* fall thru */;
- Node* reg = delay_transform(new (C) RegionNode(sz));
+ Node* reg = delay_transform(new RegionNode(sz));
lab->init_req(TypeFunc::Control, reg);
return lab;
}
@@ -312,7 +312,7 @@ Node* IdealKit::delay_transform(Node* n) {
//-----------------------------new_cvstate-----------------------------------
Node* IdealKit::new_cvstate() {
uint sz = _var_ct + first_var;
- return new (C) Node(sz);
+ return new Node(sz);
}
//-----------------------------copy_cvstate-----------------------------------
@@ -397,7 +397,7 @@ Node* IdealKit::storeCM(Node* ctl, Node* adr, Node *val, Node* oop_store, int oo
// Add required edge to oop_store, optimizer does not support precedence edges.
// Convert required edge to precedence edge before allocation.
- Node* st = new (C) StoreCMNode(ctl, mem, adr, adr_type, val, oop_store, oop_adr_idx);
+ Node* st = new StoreCMNode(ctl, mem, adr, adr_type, val, oop_store, oop_adr_idx);
st = transform(st);
set_memory(st, adr_idx);
@@ -497,7 +497,7 @@ void IdealKit::make_leaf_call(const TypeFunc *slow_call_type,
uint adr_idx = C->get_alias_index(adr_type);
// Slow-path leaf call
- CallNode *call = (CallNode*)new (C) CallLeafNode( slow_call_type, slow_call, leaf_name, adr_type);
+ CallNode *call = (CallNode*)new CallLeafNode( slow_call_type, slow_call, leaf_name, adr_type);
// Set fixed predefined input arguments
call->init_req( TypeFunc::Control, ctrl() );
@@ -518,10 +518,10 @@ void IdealKit::make_leaf_call(const TypeFunc *slow_call_type,
// Slow leaf call has no side-effects, sets few values
- set_ctrl(transform( new (C) ProjNode(call,TypeFunc::Control) ));
+ set_ctrl(transform( new ProjNode(call,TypeFunc::Control) ));
// Make memory for the call
- Node* mem = _gvn.transform( new (C) ProjNode(call, TypeFunc::Memory) );
+ Node* mem = _gvn.transform( new ProjNode(call, TypeFunc::Memory) );
// Set the RawPtr memory state only.
set_memory(mem, adr_idx);
@@ -544,7 +544,7 @@ void IdealKit::make_leaf_call_no_fp(const TypeFunc *slow_call_type,
uint adr_idx = C->get_alias_index(adr_type);
// Slow-path leaf call
- CallNode *call = (CallNode*)new (C) CallLeafNoFPNode( slow_call_type, slow_call, leaf_name, adr_type);
+ CallNode *call = (CallNode*)new CallLeafNoFPNode( slow_call_type, slow_call, leaf_name, adr_type);
// Set fixed predefined input arguments
call->init_req( TypeFunc::Control, ctrl() );
@@ -565,10 +565,10 @@ void IdealKit::make_leaf_call_no_fp(const TypeFunc *slow_call_type,
// Slow leaf call has no side-effects, sets few values
- set_ctrl(transform( new (C) ProjNode(call,TypeFunc::Control) ));
+ set_ctrl(transform( new ProjNode(call,TypeFunc::Control) ));
// Make memory for the call
- Node* mem = _gvn.transform( new (C) ProjNode(call, TypeFunc::Memory) );
+ Node* mem = _gvn.transform( new ProjNode(call, TypeFunc::Memory) );
// Set the RawPtr memory state only.
set_memory(mem, adr_idx);
diff --git a/hotspot/src/share/vm/opto/idealKit.hpp b/hotspot/src/share/vm/opto/idealKit.hpp
index f20d6bfee57..3828d30cc0b 100644
--- a/hotspot/src/share/vm/opto/idealKit.hpp
+++ b/hotspot/src/share/vm/opto/idealKit.hpp
@@ -173,43 +173,43 @@ class IdealKit: public StackObj {
void goto_(Node* lab, bool bind = false);
void declarations_done();
- Node* IfTrue(IfNode* iff) { return transform(new (C) IfTrueNode(iff)); }
- Node* IfFalse(IfNode* iff) { return transform(new (C) IfFalseNode(iff)); }
+ Node* IfTrue(IfNode* iff) { return transform(new IfTrueNode(iff)); }
+ Node* IfFalse(IfNode* iff) { return transform(new IfFalseNode(iff)); }
// Data
Node* ConI(jint k) { return (Node*)gvn().intcon(k); }
Node* makecon(const Type *t) const { return _gvn.makecon(t); }
- Node* AddI(Node* l, Node* r) { return transform(new (C) AddINode(l, r)); }
- Node* SubI(Node* l, Node* r) { return transform(new (C) SubINode(l, r)); }
- Node* AndI(Node* l, Node* r) { return transform(new (C) AndINode(l, r)); }
- Node* MaxI(Node* l, Node* r) { return transform(new (C) MaxINode(l, r)); }
- Node* LShiftI(Node* l, Node* r) { return transform(new (C) LShiftINode(l, r)); }
- Node* CmpI(Node* l, Node* r) { return transform(new (C) CmpINode(l, r)); }
- Node* Bool(Node* cmp, BoolTest::mask relop) { return transform(new (C) BoolNode(cmp, relop)); }
+ Node* AddI(Node* l, Node* r) { return transform(new AddINode(l, r)); }
+ Node* SubI(Node* l, Node* r) { return transform(new SubINode(l, r)); }
+ Node* AndI(Node* l, Node* r) { return transform(new AndINode(l, r)); }
+ Node* MaxI(Node* l, Node* r) { return transform(new MaxINode(l, r)); }
+ Node* LShiftI(Node* l, Node* r) { return transform(new LShiftINode(l, r)); }
+ Node* CmpI(Node* l, Node* r) { return transform(new CmpINode(l, r)); }
+ Node* Bool(Node* cmp, BoolTest::mask relop) { return transform(new BoolNode(cmp, relop)); }
void increment(IdealVariable& v, Node* j) { set(v, AddI(value(v), j)); }
void decrement(IdealVariable& v, Node* j) { set(v, SubI(value(v), j)); }
- Node* CmpL(Node* l, Node* r) { return transform(new (C) CmpLNode(l, r)); }
+ Node* CmpL(Node* l, Node* r) { return transform(new CmpLNode(l, r)); }
// TLS
- Node* thread() { return gvn().transform(new (C) ThreadLocalNode()); }
+ Node* thread() { return gvn().transform(new ThreadLocalNode()); }
// Pointers
// Raw address should be transformed regardless 'delay_transform' flag
// to produce canonical form CastX2P(offset).
- Node* AddP(Node *base, Node *ptr, Node *off) { return _gvn.transform(new (C) AddPNode(base, ptr, off)); }
+ Node* AddP(Node *base, Node *ptr, Node *off) { return _gvn.transform(new AddPNode(base, ptr, off)); }
- Node* CmpP(Node* l, Node* r) { return transform(new (C) CmpPNode(l, r)); }
+ Node* CmpP(Node* l, Node* r) { return transform(new CmpPNode(l, r)); }
#ifdef _LP64
- Node* XorX(Node* l, Node* r) { return transform(new (C) XorLNode(l, r)); }
+ Node* XorX(Node* l, Node* r) { return transform(new XorLNode(l, r)); }
#else // _LP64
- Node* XorX(Node* l, Node* r) { return transform(new (C) XorINode(l, r)); }
+ Node* XorX(Node* l, Node* r) { return transform(new XorINode(l, r)); }
#endif // _LP64
- Node* URShiftX(Node* l, Node* r) { return transform(new (C) URShiftXNode(l, r)); }
+ Node* URShiftX(Node* l, Node* r) { return transform(new URShiftXNode(l, r)); }
Node* ConX(jint k) { return (Node*)gvn().MakeConX(k); }
- Node* CastPX(Node* ctl, Node* p) { return transform(new (C) CastP2XNode(ctl, p)); }
+ Node* CastPX(Node* ctl, Node* p) { return transform(new CastP2XNode(ctl, p)); }
// Memory operations
diff --git a/hotspot/src/share/vm/opto/ifnode.cpp b/hotspot/src/share/vm/opto/ifnode.cpp
index 587c3b8c864..96551a804d2 100644
--- a/hotspot/src/share/vm/opto/ifnode.cpp
+++ b/hotspot/src/share/vm/opto/ifnode.cpp
@@ -238,10 +238,10 @@ static Node* split_if(IfNode *iff, PhaseIterGVN *igvn) {
Node* predicate_x = NULL;
bool counted_loop = r->is_CountedLoop();
- Node *region_c = new (igvn->C) RegionNode(req_c + 1);
+ Node *region_c = new RegionNode(req_c + 1);
Node *phi_c = con1;
uint len = r->req();
- Node *region_x = new (igvn->C) RegionNode(len - req_c);
+ Node *region_x = new RegionNode(len - req_c);
Node *phi_x = PhiNode::make_blank(region_x, phi);
for (uint i = 1, i_c = 1, i_x = 1; i < len; i++) {
if (phi->in(i) == con1) {
@@ -272,7 +272,7 @@ static Node* split_if(IfNode *iff, PhaseIterGVN *igvn) {
// Prevent the untimely death of phi_x. Currently he has no uses. He is
// about to get one. If this only use goes away, then phi_x will look dead.
// However, he will be picking up some more uses down below.
- Node *hook = new (igvn->C) Node(4);
+ Node *hook = new Node(4);
hook->init_req(0, phi_x);
hook->init_req(1, phi_c);
phi_x = phase->transform( phi_x );
@@ -284,30 +284,30 @@ static Node* split_if(IfNode *iff, PhaseIterGVN *igvn) {
cmp_x->set_req(2,con2);
cmp_x = phase->transform(cmp_x);
// Make the bool
- Node *b_c = phase->transform(new (igvn->C) BoolNode(cmp_c,b->_test._test));
- Node *b_x = phase->transform(new (igvn->C) BoolNode(cmp_x,b->_test._test));
+ Node *b_c = phase->transform(new BoolNode(cmp_c,b->_test._test));
+ Node *b_x = phase->transform(new BoolNode(cmp_x,b->_test._test));
// Make the IfNode
- IfNode *iff_c = new (igvn->C) IfNode(region_c,b_c,iff->_prob,iff->_fcnt);
+ IfNode *iff_c = new IfNode(region_c,b_c,iff->_prob,iff->_fcnt);
igvn->set_type_bottom(iff_c);
igvn->_worklist.push(iff_c);
hook->init_req(2, iff_c);
- IfNode *iff_x = new (igvn->C) IfNode(region_x,b_x,iff->_prob, iff->_fcnt);
+ IfNode *iff_x = new IfNode(region_x,b_x,iff->_prob, iff->_fcnt);
igvn->set_type_bottom(iff_x);
igvn->_worklist.push(iff_x);
hook->init_req(3, iff_x);
// Make the true/false arms
- Node *iff_c_t = phase->transform(new (igvn->C) IfTrueNode (iff_c));
- Node *iff_c_f = phase->transform(new (igvn->C) IfFalseNode(iff_c));
+ Node *iff_c_t = phase->transform(new IfTrueNode (iff_c));
+ Node *iff_c_f = phase->transform(new IfFalseNode(iff_c));
if (predicate_c != NULL) {
assert(predicate_x == NULL, "only one predicate entry expected");
// Clone loop predicates to each path
iff_c_t = igvn->clone_loop_predicates(predicate_c, iff_c_t, !counted_loop);
iff_c_f = igvn->clone_loop_predicates(predicate_c, iff_c_f, !counted_loop);
}
- Node *iff_x_t = phase->transform(new (igvn->C) IfTrueNode (iff_x));
- Node *iff_x_f = phase->transform(new (igvn->C) IfFalseNode(iff_x));
+ Node *iff_x_t = phase->transform(new IfTrueNode (iff_x));
+ Node *iff_x_f = phase->transform(new IfFalseNode(iff_x));
if (predicate_x != NULL) {
assert(predicate_c == NULL, "only one predicate entry expected");
// Clone loop predicates to each path
@@ -316,14 +316,14 @@ static Node* split_if(IfNode *iff, PhaseIterGVN *igvn) {
}
// Merge the TRUE paths
- Node *region_s = new (igvn->C) RegionNode(3);
+ Node *region_s = new RegionNode(3);
igvn->_worklist.push(region_s);
region_s->init_req(1, iff_c_t);
region_s->init_req(2, iff_x_t);
igvn->register_new_node_with_optimizer( region_s );
// Merge the FALSE paths
- Node *region_f = new (igvn->C) RegionNode(3);
+ Node *region_f = new RegionNode(3);
igvn->_worklist.push(region_f);
region_f->init_req(1, iff_c_f);
region_f->init_req(2, iff_x_f);
@@ -438,7 +438,7 @@ static Node* split_if(IfNode *iff, PhaseIterGVN *igvn) {
// Must return either the original node (now dead) or a new node
// (Do not return a top here, since that would break the uniqueness of top.)
- return new (igvn->C) ConINode(TypeInt::ZERO);
+ return new ConINode(TypeInt::ZERO);
}
//------------------------------is_range_check---------------------------------
@@ -541,16 +541,16 @@ static void adjust_check(Node* proj, Node* range, Node* index,
// Compute a new check
Node *new_add = gvn->intcon(off_lo);
if( index ) {
- new_add = off_lo ? gvn->transform(new (gvn->C) AddINode( index, new_add )) : index;
+ new_add = off_lo ? gvn->transform(new AddINode( index, new_add )) : index;
}
Node *new_cmp = (flip == 1)
- ? new (gvn->C) CmpUNode( new_add, range )
- : new (gvn->C) CmpUNode( range, new_add );
+ ? new CmpUNode( new_add, range )
+ : new CmpUNode( range, new_add );
new_cmp = gvn->transform(new_cmp);
// See if no need to adjust the existing check
if( new_cmp == cmp ) return;
// Else, adjust existing check
- Node *new_bol = gvn->transform( new (gvn->C) BoolNode( new_cmp, bol->as_Bool()->_test._test ) );
+ Node *new_bol = gvn->transform( new BoolNode( new_cmp, bol->as_Bool()->_test._test ) );
igvn->rehash_node_delayed( iff );
iff->set_req_X( 1, new_bol, igvn );
}
@@ -728,9 +728,9 @@ Node* IfNode::fold_compares(PhaseGVN* phase) {
if (failtype->_hi != max_jint && failtype->_lo != min_jint && bound > 1) {
// Merge the two compares into a single unsigned compare by building (CmpU (n - lo) hi)
BoolTest::mask cond = fail->as_Proj()->_con ? BoolTest::lt : BoolTest::ge;
- Node* adjusted = phase->transform(new (phase->C) SubINode(n, phase->intcon(failtype->_lo)));
- Node* newcmp = phase->transform(new (phase->C) CmpUNode(adjusted, phase->intcon(bound)));
- Node* newbool = phase->transform(new (phase->C) BoolNode(newcmp, cond));
+ Node* adjusted = phase->transform(new SubINode(n, phase->intcon(failtype->_lo)));
+ Node* newcmp = phase->transform(new CmpUNode(adjusted, phase->intcon(bound)));
+ Node* newbool = phase->transform(new BoolNode(newcmp, cond));
phase->is_IterGVN()->replace_input_of(dom_iff, 1, phase->intcon(ctrl->as_Proj()->_con));
phase->hash_delete(this);
set_req(1, newbool);
@@ -1003,7 +1003,7 @@ Node *IfNode::Ideal(PhaseGVN *phase, bool can_reshape) {
// Must return either the original node (now dead) or a new node
// (Do not return a top here, since that would break the uniqueness of top.)
- return new (phase->C) ConINode(TypeInt::ZERO);
+ return new ConINode(TypeInt::ZERO);
}
//------------------------------dominated_by-----------------------------------
@@ -1099,7 +1099,7 @@ static IfNode* idealize_test(PhaseGVN* phase, IfNode* iff) {
// Flip test to be canonical. Requires flipping the IfFalse/IfTrue and
// cloning the IfNode.
- Node* new_b = phase->transform( new (phase->C) BoolNode(b->in(1), bt.negate()) );
+ Node* new_b = phase->transform( new BoolNode(b->in(1), bt.negate()) );
if( !new_b->is_Bool() ) return NULL;
b = new_b->as_Bool();
@@ -1107,7 +1107,7 @@ static IfNode* idealize_test(PhaseGVN* phase, IfNode* iff) {
assert( igvn, "Test is not canonical in parser?" );
// The IF node never really changes, but it needs to be cloned
- iff = new (phase->C) IfNode( iff->in(0), b, 1.0-iff->_prob, iff->_fcnt);
+ iff = new IfNode( iff->in(0), b, 1.0-iff->_prob, iff->_fcnt);
Node *prior = igvn->hash_find_insert(iff);
if( prior ) {
@@ -1120,8 +1120,8 @@ static IfNode* idealize_test(PhaseGVN* phase, IfNode* iff) {
igvn->_worklist.push(iff);
// Now handle projections. Cloning not required.
- Node* new_if_f = (Node*)(new (phase->C) IfFalseNode( iff ));
- Node* new_if_t = (Node*)(new (phase->C) IfTrueNode ( iff ));
+ Node* new_if_f = (Node*)(new IfFalseNode( iff ));
+ Node* new_if_t = (Node*)(new IfTrueNode ( iff ));
igvn->register_new_node_with_optimizer(new_if_f);
igvn->register_new_node_with_optimizer(new_if_t);
diff --git a/hotspot/src/share/vm/opto/lcm.cpp b/hotspot/src/share/vm/opto/lcm.cpp
index 8398bb3d254..10daf5694f9 100644
--- a/hotspot/src/share/vm/opto/lcm.cpp
+++ b/hotspot/src/share/vm/opto/lcm.cpp
@@ -419,7 +419,7 @@ void PhaseCFG::implicit_null_check(Block* block, Node *proj, Node *val, int allo
Node *tmp2 = block->get_node(block->end_idx()+2);
block->map_node(tmp2, block->end_idx()+1);
block->map_node(tmp1, block->end_idx()+2);
- Node *tmp = new (C) Node(C->top()); // Use not NULL input
+ Node *tmp = new Node(C->top()); // Use not NULL input
tmp1->replace_by(tmp);
tmp2->replace_by(tmp1);
tmp->replace_by(tmp2);
@@ -430,7 +430,7 @@ void PhaseCFG::implicit_null_check(Block* block, Node *proj, Node *val, int allo
// Since schedule-local needs precise def-use info, we need to correct
// it as well.
Node *old_tst = proj->in(0);
- MachNode *nul_chk = new (C) MachNullCheckNode(old_tst->in(0),best,bidx);
+ MachNode *nul_chk = new MachNullCheckNode(old_tst->in(0),best,bidx);
block->map_node(nul_chk, block->end_idx());
map_node_to_block(nul_chk, block);
// Redirect users of old_test to nul_chk
@@ -671,7 +671,7 @@ uint PhaseCFG::sched_call(Block* block, uint node_cnt, Node_List& worklist, Grow
// Set all registers killed and not already defined by the call.
uint r_cnt = mcall->tf()->range()->cnt();
int op = mcall->ideal_Opcode();
- MachProjNode *proj = new (C) MachProjNode( mcall, r_cnt+1, RegMask::Empty, MachProjNode::fat_proj );
+ MachProjNode *proj = new MachProjNode( mcall, r_cnt+1, RegMask::Empty, MachProjNode::fat_proj );
map_node_to_block(proj, block);
block->insert_node(proj, node_cnt++);
@@ -900,7 +900,7 @@ bool PhaseCFG::schedule_local(Block* block, GrowableArray& ready_cnt, Vecto
regs.Insert(_matcher.c_frame_pointer());
regs.OR(n->out_RegMask());
- MachProjNode *proj = new (C) MachProjNode( n, 1, RegMask::Empty, MachProjNode::fat_proj );
+ MachProjNode *proj = new MachProjNode( n, 1, RegMask::Empty, MachProjNode::fat_proj );
map_node_to_block(proj, block);
block->insert_node(proj, phi_cnt++);
diff --git a/hotspot/src/share/vm/opto/library_call.cpp b/hotspot/src/share/vm/opto/library_call.cpp
index 8489fcf42c0..5199e224a49 100644
--- a/hotspot/src/share/vm/opto/library_call.cpp
+++ b/hotspot/src/share/vm/opto/library_call.cpp
@@ -969,7 +969,7 @@ Node* LibraryCallKit::generate_guard(Node* test, RegionNode* region, float true_
IfNode* iff = create_and_map_if(control(), test, true_prob, COUNT_UNKNOWN);
- Node* if_slow = _gvn.transform(new (C) IfTrueNode(iff));
+ Node* if_slow = _gvn.transform(new IfTrueNode(iff));
if (if_slow == top()) {
// The slow branch is never taken. No need to build this guard.
return NULL;
@@ -978,7 +978,7 @@ Node* LibraryCallKit::generate_guard(Node* test, RegionNode* region, float true_
if (region != NULL)
region->add_req(if_slow);
- Node* if_fast = _gvn.transform(new (C) IfFalseNode(iff));
+ Node* if_fast = _gvn.transform(new IfFalseNode(iff));
set_control(if_fast);
return if_slow;
@@ -997,12 +997,12 @@ inline Node* LibraryCallKit::generate_negative_guard(Node* index, RegionNode* re
return NULL; // already stopped
if (_gvn.type(index)->higher_equal(TypeInt::POS)) // [0,maxint]
return NULL; // index is already adequately typed
- Node* cmp_lt = _gvn.transform(new (C) CmpINode(index, intcon(0)));
- Node* bol_lt = _gvn.transform(new (C) BoolNode(cmp_lt, BoolTest::lt));
+ Node* cmp_lt = _gvn.transform(new CmpINode(index, intcon(0)));
+ Node* bol_lt = _gvn.transform(new BoolNode(cmp_lt, BoolTest::lt));
Node* is_neg = generate_guard(bol_lt, region, PROB_MIN);
if (is_neg != NULL && pos_index != NULL) {
// Emulate effect of Parse::adjust_map_after_if.
- Node* ccast = new (C) CastIINode(index, TypeInt::POS);
+ Node* ccast = new CastIINode(index, TypeInt::POS);
ccast->set_req(0, control());
(*pos_index) = _gvn.transform(ccast);
}
@@ -1015,13 +1015,13 @@ inline Node* LibraryCallKit::generate_nonpositive_guard(Node* index, bool never_
return NULL; // already stopped
if (_gvn.type(index)->higher_equal(TypeInt::POS1)) // [1,maxint]
return NULL; // index is already adequately typed
- Node* cmp_le = _gvn.transform(new (C) CmpINode(index, intcon(0)));
+ Node* cmp_le = _gvn.transform(new CmpINode(index, intcon(0)));
BoolTest::mask le_or_eq = (never_negative ? BoolTest::eq : BoolTest::le);
- Node* bol_le = _gvn.transform(new (C) BoolNode(cmp_le, le_or_eq));
+ Node* bol_le = _gvn.transform(new BoolNode(cmp_le, le_or_eq));
Node* is_notp = generate_guard(bol_le, NULL, PROB_MIN);
if (is_notp != NULL && pos_index != NULL) {
// Emulate effect of Parse::adjust_map_after_if.
- Node* ccast = new (C) CastIINode(index, TypeInt::POS1);
+ Node* ccast = new CastIINode(index, TypeInt::POS1);
ccast->set_req(0, control());
(*pos_index) = _gvn.transform(ccast);
}
@@ -1053,9 +1053,9 @@ inline Node* LibraryCallKit::generate_limit_guard(Node* offset,
return NULL; // common case of whole-array copy
Node* last = subseq_length;
if (!zero_offset) // last += offset
- last = _gvn.transform(new (C) AddINode(last, offset));
- Node* cmp_lt = _gvn.transform(new (C) CmpUNode(array_length, last));
- Node* bol_lt = _gvn.transform(new (C) BoolNode(cmp_lt, BoolTest::lt));
+ last = _gvn.transform(new AddINode(last, offset));
+ Node* cmp_lt = _gvn.transform(new CmpUNode(array_length, last));
+ Node* bol_lt = _gvn.transform(new BoolNode(cmp_lt, BoolTest::lt));
Node* is_over = generate_guard(bol_lt, region, PROB_MIN);
return is_over;
}
@@ -1065,7 +1065,7 @@ inline Node* LibraryCallKit::generate_limit_guard(Node* offset,
Node* LibraryCallKit::generate_current_thread(Node* &tls_output) {
ciKlass* thread_klass = env()->Thread_klass();
const Type* thread_type = TypeOopPtr::make_from_klass(thread_klass)->cast_to_ptr_type(TypePtr::NotNull);
- Node* thread = _gvn.transform(new (C) ThreadLocalNode());
+ Node* thread = _gvn.transform(new ThreadLocalNode());
Node* p = basic_plus_adr(top()/*!oop*/, thread, in_bytes(JavaThread::threadObj_offset()));
Node* threadObj = make_load(NULL, p, thread_type, T_OBJECT, MemNode::unordered);
tls_output = thread;
@@ -1100,18 +1100,18 @@ Node* LibraryCallKit::make_string_method_node(int opcode, Node* str1, Node* str2
// Get length of string 2
str2_len = load_String_length(no_ctrl, str2);
- result = new (C) StrIndexOfNode(control(), memory(TypeAryPtr::CHARS),
- str1_start, str1_len, str2_start, str2_len);
+ result = new StrIndexOfNode(control(), memory(TypeAryPtr::CHARS),
+ str1_start, str1_len, str2_start, str2_len);
break;
case Op_StrComp:
// Get length of string 2
str2_len = load_String_length(no_ctrl, str2);
- result = new (C) StrCompNode(control(), memory(TypeAryPtr::CHARS),
- str1_start, str1_len, str2_start, str2_len);
+ result = new StrCompNode(control(), memory(TypeAryPtr::CHARS),
+ str1_start, str1_len, str2_start, str2_len);
break;
case Op_StrEquals:
- result = new (C) StrEqualsNode(control(), memory(TypeAryPtr::CHARS),
+ result = new StrEqualsNode(control(), memory(TypeAryPtr::CHARS),
str1_start, str2_start, str1_len);
break;
default:
@@ -1133,16 +1133,16 @@ Node* LibraryCallKit::make_string_method_node(int opcode, Node* str1_start, Node
Node* result = NULL;
switch (opcode) {
case Op_StrIndexOf:
- result = new (C) StrIndexOfNode(control(), memory(TypeAryPtr::CHARS),
- str1_start, cnt1, str2_start, cnt2);
+ result = new StrIndexOfNode(control(), memory(TypeAryPtr::CHARS),
+ str1_start, cnt1, str2_start, cnt2);
break;
case Op_StrComp:
- result = new (C) StrCompNode(control(), memory(TypeAryPtr::CHARS),
- str1_start, cnt1, str2_start, cnt2);
+ result = new StrCompNode(control(), memory(TypeAryPtr::CHARS),
+ str1_start, cnt1, str2_start, cnt2);
break;
case Op_StrEquals:
- result = new (C) StrEqualsNode(control(), memory(TypeAryPtr::CHARS),
- str1_start, str2_start, cnt1);
+ result = new StrEqualsNode(control(), memory(TypeAryPtr::CHARS),
+ str1_start, str2_start, cnt1);
break;
default:
ShouldNotReachHere();
@@ -1178,12 +1178,12 @@ bool LibraryCallKit::inline_string_equals() {
}
// paths (plus control) merge
- RegionNode* region = new (C) RegionNode(5);
- Node* phi = new (C) PhiNode(region, TypeInt::BOOL);
+ RegionNode* region = new RegionNode(5);
+ Node* phi = new PhiNode(region, TypeInt::BOOL);
// does source == target string?
- Node* cmp = _gvn.transform(new (C) CmpPNode(receiver, argument));
- Node* bol = _gvn.transform(new (C) BoolNode(cmp, BoolTest::eq));
+ Node* cmp = _gvn.transform(new CmpPNode(receiver, argument));
+ Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::eq));
Node* if_eq = generate_slow_guard(bol, NULL);
if (if_eq != NULL) {
@@ -1197,8 +1197,8 @@ bool LibraryCallKit::inline_string_equals() {
if (!stopped()) {
Node* inst = gen_instanceof(argument, makecon(TypeKlassPtr::make(klass)));
- Node* cmp = _gvn.transform(new (C) CmpINode(inst, intcon(1)));
- Node* bol = _gvn.transform(new (C) BoolNode(cmp, BoolTest::ne));
+ Node* cmp = _gvn.transform(new CmpINode(inst, intcon(1)));
+ Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::ne));
Node* inst_false = generate_guard(bol, NULL, PROB_MIN);
//instanceOf == true, fallthrough
@@ -1213,7 +1213,7 @@ bool LibraryCallKit::inline_string_equals() {
const TypeOopPtr* string_type = TypeOopPtr::make_from_klass(klass);
// Properly cast the argument to String
- argument = _gvn.transform(new (C) CheckCastPPNode(control(), argument, string_type));
+ argument = _gvn.transform(new CheckCastPPNode(control(), argument, string_type));
// This path is taken only when argument's type is String:NotNull.
argument = cast_not_null(argument, false);
@@ -1236,8 +1236,8 @@ bool LibraryCallKit::inline_string_equals() {
Node* argument_cnt = load_String_length(no_ctrl, argument);
// Check for receiver count != argument count
- Node* cmp = _gvn.transform(new(C) CmpINode(receiver_cnt, argument_cnt));
- Node* bol = _gvn.transform(new(C) BoolNode(cmp, BoolTest::ne));
+ Node* cmp = _gvn.transform(new CmpINode(receiver_cnt, argument_cnt));
+ Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::ne));
Node* if_ne = generate_slow_guard(bol, NULL);
if (if_ne != NULL) {
phi->init_req(4, intcon(0));
@@ -1265,7 +1265,7 @@ bool LibraryCallKit::inline_string_equals() {
bool LibraryCallKit::inline_array_equals() {
Node* arg1 = argument(0);
Node* arg2 = argument(1);
- set_result(_gvn.transform(new (C) AryEqNode(control(), memory(TypeAryPtr::CHARS), arg1, arg2)));
+ set_result(_gvn.transform(new AryEqNode(control(), memory(TypeAryPtr::CHARS), arg1, arg2)));
return true;
}
@@ -1434,8 +1434,8 @@ bool LibraryCallKit::inline_string_indexOf() {
const TypeOopPtr* string_type = TypeOopPtr::make_from_klass(str_klass);
// Make the merge point
- RegionNode* result_rgn = new (C) RegionNode(4);
- Node* result_phi = new (C) PhiNode(result_rgn, TypeInt::INT);
+ RegionNode* result_rgn = new RegionNode(4);
+ Node* result_phi = new PhiNode(result_rgn, TypeInt::INT);
Node* no_ctrl = NULL;
// Get start addr of source string
@@ -1455,8 +1455,8 @@ bool LibraryCallKit::inline_string_indexOf() {
Node* substr_cnt = load_String_length(no_ctrl, arg);
// Check for substr count > string count
- Node* cmp = _gvn.transform(new(C) CmpINode(substr_cnt, source_cnt));
- Node* bol = _gvn.transform(new(C) BoolNode(cmp, BoolTest::gt));
+ Node* cmp = _gvn.transform(new CmpINode(substr_cnt, source_cnt));
+ Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::gt));
Node* if_gt = generate_slow_guard(bol, NULL);
if (if_gt != NULL) {
result_phi->init_req(2, intcon(-1));
@@ -1465,8 +1465,8 @@ bool LibraryCallKit::inline_string_indexOf() {
if (!stopped()) {
// Check for substr count == 0
- cmp = _gvn.transform(new(C) CmpINode(substr_cnt, intcon(0)));
- bol = _gvn.transform(new(C) BoolNode(cmp, BoolTest::eq));
+ cmp = _gvn.transform(new CmpINode(substr_cnt, intcon(0)));
+ bol = _gvn.transform(new BoolNode(cmp, BoolTest::eq));
Node* if_zero = generate_slow_guard(bol, NULL);
if (if_zero != NULL) {
result_phi->init_req(3, intcon(0));
@@ -1558,7 +1558,7 @@ bool LibraryCallKit::inline_string_indexOf() {
// Round a double node if necessary.
Node* LibraryCallKit::round_double_node(Node* n) {
if (Matcher::strict_fp_requires_explicit_rounding && UseSSE <= 1)
- n = _gvn.transform(new (C) RoundDoubleNode(0, n));
+ n = _gvn.transform(new RoundDoubleNode(0, n));
return n;
}
@@ -1571,10 +1571,10 @@ bool LibraryCallKit::inline_math(vmIntrinsics::ID id) {
Node* arg = round_double_node(argument(0));
Node* n;
switch (id) {
- case vmIntrinsics::_dabs: n = new (C) AbsDNode( arg); break;
- case vmIntrinsics::_dsqrt: n = new (C) SqrtDNode(C, control(), arg); break;
- case vmIntrinsics::_dlog: n = new (C) LogDNode(C, control(), arg); break;
- case vmIntrinsics::_dlog10: n = new (C) Log10DNode(C, control(), arg); break;
+ case vmIntrinsics::_dabs: n = new AbsDNode( arg); break;
+ case vmIntrinsics::_dsqrt: n = new SqrtDNode(C, control(), arg); break;
+ case vmIntrinsics::_dlog: n = new LogDNode(C, control(), arg); break;
+ case vmIntrinsics::_dlog10: n = new Log10DNode(C, control(), arg); break;
default: fatal_unexpected_iid(id); break;
}
set_result(_gvn.transform(n));
@@ -1589,9 +1589,9 @@ bool LibraryCallKit::inline_trig(vmIntrinsics::ID id) {
Node* n = NULL;
switch (id) {
- case vmIntrinsics::_dsin: n = new (C) SinDNode(C, control(), arg); break;
- case vmIntrinsics::_dcos: n = new (C) CosDNode(C, control(), arg); break;
- case vmIntrinsics::_dtan: n = new (C) TanDNode(C, control(), arg); break;
+ case vmIntrinsics::_dsin: n = new SinDNode(C, control(), arg); break;
+ case vmIntrinsics::_dcos: n = new CosDNode(C, control(), arg); break;
+ case vmIntrinsics::_dtan: n = new TanDNode(C, control(), arg); break;
default: fatal_unexpected_iid(id); break;
}
n = _gvn.transform(n);
@@ -1632,17 +1632,17 @@ bool LibraryCallKit::inline_trig(vmIntrinsics::ID id) {
// probably do the math inside the SIN encoding.
// Make the merge point
- RegionNode* r = new (C) RegionNode(3);
- Node* phi = new (C) PhiNode(r, Type::DOUBLE);
+ RegionNode* r = new RegionNode(3);
+ Node* phi = new PhiNode(r, Type::DOUBLE);
// Flatten arg so we need only 1 test
- Node *abs = _gvn.transform(new (C) AbsDNode(arg));
+ Node *abs = _gvn.transform(new AbsDNode(arg));
// Node for PI/4 constant
Node *pi4 = makecon(TypeD::make(pi_4));
// Check PI/4 : abs(arg)
- Node *cmp = _gvn.transform(new (C) CmpDNode(pi4,abs));
+ Node *cmp = _gvn.transform(new CmpDNode(pi4,abs));
// Check: If PI/4 < abs(arg) then go slow
- Node *bol = _gvn.transform(new (C) BoolNode( cmp, BoolTest::lt ));
+ Node *bol = _gvn.transform(new BoolNode( cmp, BoolTest::lt ));
// Branch either way
IfNode *iff = create_and_xform_if(control(),bol, PROB_STATIC_FREQUENT, COUNT_UNKNOWN);
set_control(opt_iff(r,iff));
@@ -1670,7 +1670,7 @@ bool LibraryCallKit::inline_trig(vmIntrinsics::ID id) {
break;
}
assert(control()->in(0) == call, "");
- Node* slow_result = _gvn.transform(new (C) ProjNode(call, TypeFunc::Parms));
+ Node* slow_result = _gvn.transform(new ProjNode(call, TypeFunc::Parms));
r->init_req(1, control());
phi->init_req(1, slow_result);
@@ -1690,9 +1690,9 @@ Node* LibraryCallKit::finish_pow_exp(Node* result, Node* x, Node* y, const TypeF
//result=(result.isNaN())? funcAddr():result;
// Check: If isNaN() by checking result!=result? then either trap
// or go to runtime
- Node* cmpisnan = _gvn.transform(new (C) CmpDNode(result, result));
+ Node* cmpisnan = _gvn.transform(new CmpDNode(result, result));
// Build the boolean node
- Node* bolisnum = _gvn.transform(new (C) BoolNode(cmpisnan, BoolTest::eq));
+ Node* bolisnum = _gvn.transform(new BoolNode(cmpisnan, BoolTest::eq));
if (!too_many_traps(Deoptimization::Reason_intrinsic)) {
{ BuildCutout unless(this, bolisnum, PROB_STATIC_FREQUENT);
@@ -1707,12 +1707,12 @@ Node* LibraryCallKit::finish_pow_exp(Node* result, Node* x, Node* y, const TypeF
// to the runtime to properly handle corner cases
IfNode* iff = create_and_xform_if(control(), bolisnum, PROB_STATIC_FREQUENT, COUNT_UNKNOWN);
- Node* if_slow = _gvn.transform(new (C) IfFalseNode(iff));
- Node* if_fast = _gvn.transform(new (C) IfTrueNode(iff));
+ Node* if_slow = _gvn.transform(new IfFalseNode(iff));
+ Node* if_fast = _gvn.transform(new IfTrueNode(iff));
if (!if_slow->is_top()) {
- RegionNode* result_region = new (C) RegionNode(3);
- PhiNode* result_val = new (C) PhiNode(result_region, Type::DOUBLE);
+ RegionNode* result_region = new RegionNode(3);
+ PhiNode* result_val = new PhiNode(result_region, Type::DOUBLE);
result_region->init_req(1, if_fast);
result_val->init_req(1, result);
@@ -1723,9 +1723,9 @@ Node* LibraryCallKit::finish_pow_exp(Node* result, Node* x, Node* y, const TypeF
Node* rt = make_runtime_call(RC_LEAF, call_type, funcAddr, funcName,
no_memory_effects,
x, top(), y, y ? top() : NULL);
- Node* value = _gvn.transform(new (C) ProjNode(rt, TypeFunc::Parms+0));
+ Node* value = _gvn.transform(new ProjNode(rt, TypeFunc::Parms+0));
#ifdef ASSERT
- Node* value_top = _gvn.transform(new (C) ProjNode(rt, TypeFunc::Parms+1));
+ Node* value_top = _gvn.transform(new ProjNode(rt, TypeFunc::Parms+1));
assert(value_top == top(), "second value must be top");
#endif
@@ -1744,7 +1744,7 @@ Node* LibraryCallKit::finish_pow_exp(Node* result, Node* x, Node* y, const TypeF
// really odd corner cases (+/- Infinity). Just uncommon-trap them.
bool LibraryCallKit::inline_exp() {
Node* arg = round_double_node(argument(0));
- Node* n = _gvn.transform(new (C) ExpDNode(C, control(), arg));
+ Node* n = _gvn.transform(new ExpDNode(C, control(), arg));
n = finish_pow_exp(n, arg, NULL, OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dexp), "EXP");
set_result(n);
@@ -1783,76 +1783,76 @@ bool LibraryCallKit::inline_pow() {
Node* result = NULL;
Node* const_two_node = makecon(TypeD::make(2.0));
- Node* cmp_node = _gvn.transform(new (C) CmpDNode(y, const_two_node));
- Node* bool_node = _gvn.transform(new (C) BoolNode(cmp_node, BoolTest::eq));
+ Node* cmp_node = _gvn.transform(new CmpDNode(y, const_two_node));
+ Node* bool_node = _gvn.transform(new BoolNode(cmp_node, BoolTest::eq));
IfNode* if_node = create_and_xform_if(control(), bool_node, PROB_STATIC_INFREQUENT, COUNT_UNKNOWN);
- Node* if_true = _gvn.transform(new (C) IfTrueNode(if_node));
- Node* if_false = _gvn.transform(new (C) IfFalseNode(if_node));
+ Node* if_true = _gvn.transform(new IfTrueNode(if_node));
+ Node* if_false = _gvn.transform(new IfFalseNode(if_node));
- RegionNode* region_node = new (C) RegionNode(3);
+ RegionNode* region_node = new RegionNode(3);
region_node->init_req(1, if_true);
- Node* phi_node = new (C) PhiNode(region_node, Type::DOUBLE);
+ Node* phi_node = new PhiNode(region_node, Type::DOUBLE);
// special case for x^y where y == 2, we can convert it to x * x
- phi_node->init_req(1, _gvn.transform(new (C) MulDNode(x, x)));
+ phi_node->init_req(1, _gvn.transform(new MulDNode(x, x)));
// set control to if_false since we will now process the false branch
set_control(if_false);
if (!too_many_traps(Deoptimization::Reason_intrinsic)) {
// Short form: skip the fancy tests and just check for NaN result.
- result = _gvn.transform(new (C) PowDNode(C, control(), x, y));
+ result = _gvn.transform(new PowDNode(C, control(), x, y));
} else {
// If this inlining ever returned NaN in the past, include all
// checks + call to the runtime.
// Set the merge point for If node with condition of (x <= 0.0)
// There are four possible paths to region node and phi node
- RegionNode *r = new (C) RegionNode(4);
- Node *phi = new (C) PhiNode(r, Type::DOUBLE);
+ RegionNode *r = new RegionNode(4);
+ Node *phi = new PhiNode(r, Type::DOUBLE);
// Build the first if node: if (x <= 0.0)
// Node for 0 constant
Node *zeronode = makecon(TypeD::ZERO);
// Check x:0
- Node *cmp = _gvn.transform(new (C) CmpDNode(x, zeronode));
+ Node *cmp = _gvn.transform(new CmpDNode(x, zeronode));
// Check: If (x<=0) then go complex path
- Node *bol1 = _gvn.transform(new (C) BoolNode( cmp, BoolTest::le ));
+ Node *bol1 = _gvn.transform(new BoolNode( cmp, BoolTest::le ));
// Branch either way
IfNode *if1 = create_and_xform_if(control(),bol1, PROB_STATIC_INFREQUENT, COUNT_UNKNOWN);
// Fast path taken; set region slot 3
- Node *fast_taken = _gvn.transform(new (C) IfFalseNode(if1));
+ Node *fast_taken = _gvn.transform(new IfFalseNode(if1));
r->init_req(3,fast_taken); // Capture fast-control
// Fast path not-taken, i.e. slow path
- Node *complex_path = _gvn.transform(new (C) IfTrueNode(if1));
+ Node *complex_path = _gvn.transform(new IfTrueNode(if1));
// Set fast path result
- Node *fast_result = _gvn.transform(new (C) PowDNode(C, control(), x, y));
+ Node *fast_result = _gvn.transform(new PowDNode(C, control(), x, y));
phi->init_req(3, fast_result);
// Complex path
// Build the second if node (if y is long)
// Node for (long)y
- Node *longy = _gvn.transform(new (C) ConvD2LNode(y));
+ Node *longy = _gvn.transform(new ConvD2LNode(y));
// Node for (double)((long) y)
- Node *doublelongy= _gvn.transform(new (C) ConvL2DNode(longy));
+ Node *doublelongy= _gvn.transform(new ConvL2DNode(longy));
// Check (double)((long) y) : y
- Node *cmplongy= _gvn.transform(new (C) CmpDNode(doublelongy, y));
+ Node *cmplongy= _gvn.transform(new CmpDNode(doublelongy, y));
// Check if (y isn't long) then go to slow path
- Node *bol2 = _gvn.transform(new (C) BoolNode( cmplongy, BoolTest::ne ));
+ Node *bol2 = _gvn.transform(new BoolNode( cmplongy, BoolTest::ne ));
// Branch either way
IfNode *if2 = create_and_xform_if(complex_path,bol2, PROB_STATIC_INFREQUENT, COUNT_UNKNOWN);
- Node* ylong_path = _gvn.transform(new (C) IfFalseNode(if2));
+ Node* ylong_path = _gvn.transform(new IfFalseNode(if2));
- Node *slow_path = _gvn.transform(new (C) IfTrueNode(if2));
+ Node *slow_path = _gvn.transform(new IfTrueNode(if2));
// Calculate DPow(abs(x), y)*(1 & (long)y)
// Node for constant 1
Node *conone = longcon(1);
// 1& (long)y
- Node *signnode= _gvn.transform(new (C) AndLNode(conone, longy));
+ Node *signnode= _gvn.transform(new AndLNode(conone, longy));
// A huge number is always even. Detect a huge number by checking
// if y + 1 == y and set integer to be tested for parity to 0.
@@ -1860,18 +1860,18 @@ bool LibraryCallKit::inline_pow() {
// (long)9.223372036854776E18 = max_jlong
// (double)(long)9.223372036854776E18 = 9.223372036854776E18
// max_jlong is odd but 9.223372036854776E18 is even
- Node* yplus1 = _gvn.transform(new (C) AddDNode(y, makecon(TypeD::make(1))));
- Node *cmpyplus1= _gvn.transform(new (C) CmpDNode(yplus1, y));
- Node *bolyplus1 = _gvn.transform(new (C) BoolNode( cmpyplus1, BoolTest::eq ));
+ Node* yplus1 = _gvn.transform(new AddDNode(y, makecon(TypeD::make(1))));
+ Node *cmpyplus1= _gvn.transform(new CmpDNode(yplus1, y));
+ Node *bolyplus1 = _gvn.transform(new BoolNode( cmpyplus1, BoolTest::eq ));
Node* correctedsign = NULL;
if (ConditionalMoveLimit != 0) {
correctedsign = _gvn.transform( CMoveNode::make(C, NULL, bolyplus1, signnode, longcon(0), TypeLong::LONG));
} else {
IfNode *ifyplus1 = create_and_xform_if(ylong_path,bolyplus1, PROB_FAIR, COUNT_UNKNOWN);
- RegionNode *r = new (C) RegionNode(3);
- Node *phi = new (C) PhiNode(r, TypeLong::LONG);
- r->init_req(1, _gvn.transform(new (C) IfFalseNode(ifyplus1)));
- r->init_req(2, _gvn.transform(new (C) IfTrueNode(ifyplus1)));
+ RegionNode *r = new RegionNode(3);
+ Node *phi = new PhiNode(r, TypeLong::LONG);
+ r->init_req(1, _gvn.transform(new IfFalseNode(ifyplus1)));
+ r->init_req(2, _gvn.transform(new IfTrueNode(ifyplus1)));
phi->init_req(1, signnode);
phi->init_req(2, longcon(0));
correctedsign = _gvn.transform(phi);
@@ -1882,25 +1882,25 @@ bool LibraryCallKit::inline_pow() {
// zero node
Node *conzero = longcon(0);
// Check (1&(long)y)==0?
- Node *cmpeq1 = _gvn.transform(new (C) CmpLNode(correctedsign, conzero));
+ Node *cmpeq1 = _gvn.transform(new CmpLNode(correctedsign, conzero));
// Check if (1&(long)y)!=0?, if so the result is negative
- Node *bol3 = _gvn.transform(new (C) BoolNode( cmpeq1, BoolTest::ne ));
+ Node *bol3 = _gvn.transform(new BoolNode( cmpeq1, BoolTest::ne ));
// abs(x)
- Node *absx=_gvn.transform(new (C) AbsDNode(x));
+ Node *absx=_gvn.transform(new AbsDNode(x));
// abs(x)^y
- Node *absxpowy = _gvn.transform(new (C) PowDNode(C, control(), absx, y));
+ Node *absxpowy = _gvn.transform(new PowDNode(C, control(), absx, y));
// -abs(x)^y
- Node *negabsxpowy = _gvn.transform(new (C) NegDNode (absxpowy));
+ Node *negabsxpowy = _gvn.transform(new NegDNode (absxpowy));
// (1&(long)y)==1?-DPow(abs(x), y):DPow(abs(x), y)
Node *signresult = NULL;
if (ConditionalMoveLimit != 0) {
signresult = _gvn.transform( CMoveNode::make(C, NULL, bol3, absxpowy, negabsxpowy, Type::DOUBLE));
} else {
IfNode *ifyeven = create_and_xform_if(ylong_path,bol3, PROB_FAIR, COUNT_UNKNOWN);
- RegionNode *r = new (C) RegionNode(3);
- Node *phi = new (C) PhiNode(r, Type::DOUBLE);
- r->init_req(1, _gvn.transform(new (C) IfFalseNode(ifyeven)));
- r->init_req(2, _gvn.transform(new (C) IfTrueNode(ifyeven)));
+ RegionNode *r = new RegionNode(3);
+ Node *phi = new PhiNode(r, Type::DOUBLE);
+ r->init_req(1, _gvn.transform(new IfFalseNode(ifyeven)));
+ r->init_req(2, _gvn.transform(new IfTrueNode(ifyeven)));
phi->init_req(1, absxpowy);
phi->init_req(2, negabsxpowy);
signresult = _gvn.transform(phi);
@@ -1949,9 +1949,9 @@ bool LibraryCallKit::runtime_math(const TypeFunc* call_type, address funcAddr, c
Node* trig = make_runtime_call(RC_LEAF, call_type, funcAddr, funcName,
no_memory_effects,
a, top(), b, b ? top() : NULL);
- Node* value = _gvn.transform(new (C) ProjNode(trig, TypeFunc::Parms+0));
+ Node* value = _gvn.transform(new ProjNode(trig, TypeFunc::Parms+0));
#ifdef ASSERT
- Node* value_top = _gvn.transform(new (C) ProjNode(trig, TypeFunc::Parms+1));
+ Node* value_top = _gvn.transform(new ProjNode(trig, TypeFunc::Parms+1));
assert(value_top == top(), "second value must be top");
#endif
@@ -2011,10 +2011,10 @@ bool LibraryCallKit::inline_min_max(vmIntrinsics::ID id) {
}
void LibraryCallKit::inline_math_mathExact(Node* math, Node *test) {
- Node* bol = _gvn.transform( new (C) BoolNode(test, BoolTest::overflow) );
+ Node* bol = _gvn.transform( new BoolNode(test, BoolTest::overflow) );
IfNode* check = create_and_map_if(control(), bol, PROB_UNLIKELY_MAG(3), COUNT_UNKNOWN);
- Node* fast_path = _gvn.transform( new (C) IfFalseNode(check));
- Node* slow_path = _gvn.transform( new (C) IfTrueNode(check) );
+ Node* fast_path = _gvn.transform( new IfFalseNode(check));
+ Node* slow_path = _gvn.transform( new IfTrueNode(check) );
{
PreserveJVMState pjvms(this);
@@ -2036,9 +2036,9 @@ template
bool LibraryCallKit::inline_math_overflow(Node* arg1, Node* arg2) {
typedef typename OverflowOp::MathOp MathOp;
- MathOp* mathOp = new(C) MathOp(arg1, arg2);
+ MathOp* mathOp = new MathOp(arg1, arg2);
Node* operation = _gvn.transform( mathOp );
- Node* ofcheck = _gvn.transform( new(C) OverflowOp(arg1, arg2) );
+ Node* ofcheck = _gvn.transform( new OverflowOp(arg1, arg2) );
inline_math_mathExact(operation, ofcheck);
return true;
}
@@ -2106,7 +2106,7 @@ LibraryCallKit::generate_min_max(vmIntrinsics::ID id, Node* x0, Node* y0) {
int cmp_op = Op_CmpI;
Node* xkey = xvalue;
Node* ykey = yvalue;
- Node* ideal_cmpxy = _gvn.transform(new(C) CmpINode(xkey, ykey));
+ Node* ideal_cmpxy = _gvn.transform(new CmpINode(xkey, ykey));
if (ideal_cmpxy->is_Cmp()) {
// E.g., if we have CmpI(length - offset, count),
// it might idealize to CmpI(length, count + offset)
@@ -2199,7 +2199,7 @@ LibraryCallKit::generate_min_max(vmIntrinsics::ID id, Node* x0, Node* y0) {
default:
if (cmpxy == NULL)
cmpxy = ideal_cmpxy;
- best_bol = _gvn.transform(new(C) BoolNode(cmpxy, BoolTest::lt));
+ best_bol = _gvn.transform(new BoolNode(cmpxy, BoolTest::lt));
// and fall through:
case BoolTest::lt: // x < y
case BoolTest::le: // x <= y
@@ -2259,7 +2259,7 @@ LibraryCallKit::classify_unsafe_addr(Node* &base, Node* &offset) {
return Type::AnyPtr;
} else if (base_type == TypePtr::NULL_PTR) {
// Since this is a NULL+long form, we have to switch to a rawptr.
- base = _gvn.transform(new (C) CastX2PNode(offset));
+ base = _gvn.transform(new CastX2PNode(offset));
offset = MakeConX(0);
return Type::RawPtr;
} else if (base_type->base() == Type::RawPtr) {
@@ -2312,16 +2312,16 @@ bool LibraryCallKit::inline_number_methods(vmIntrinsics::ID id) {
Node* arg = argument(0);
Node* n;
switch (id) {
- case vmIntrinsics::_numberOfLeadingZeros_i: n = new (C) CountLeadingZerosINode( arg); break;
- case vmIntrinsics::_numberOfLeadingZeros_l: n = new (C) CountLeadingZerosLNode( arg); break;
- case vmIntrinsics::_numberOfTrailingZeros_i: n = new (C) CountTrailingZerosINode(arg); break;
- case vmIntrinsics::_numberOfTrailingZeros_l: n = new (C) CountTrailingZerosLNode(arg); break;
- case vmIntrinsics::_bitCount_i: n = new (C) PopCountINode( arg); break;
- case vmIntrinsics::_bitCount_l: n = new (C) PopCountLNode( arg); break;
- case vmIntrinsics::_reverseBytes_c: n = new (C) ReverseBytesUSNode(0, arg); break;
- case vmIntrinsics::_reverseBytes_s: n = new (C) ReverseBytesSNode( 0, arg); break;
- case vmIntrinsics::_reverseBytes_i: n = new (C) ReverseBytesINode( 0, arg); break;
- case vmIntrinsics::_reverseBytes_l: n = new (C) ReverseBytesLNode( 0, arg); break;
+ case vmIntrinsics::_numberOfLeadingZeros_i: n = new CountLeadingZerosINode( arg); break;
+ case vmIntrinsics::_numberOfLeadingZeros_l: n = new CountLeadingZerosLNode( arg); break;
+ case vmIntrinsics::_numberOfTrailingZeros_i: n = new CountTrailingZerosINode(arg); break;
+ case vmIntrinsics::_numberOfTrailingZeros_l: n = new CountTrailingZerosLNode(arg); break;
+ case vmIntrinsics::_bitCount_i: n = new PopCountINode( arg); break;
+ case vmIntrinsics::_bitCount_l: n = new PopCountLNode( arg); break;
+ case vmIntrinsics::_reverseBytes_c: n = new ReverseBytesUSNode(0, arg); break;
+ case vmIntrinsics::_reverseBytes_s: n = new ReverseBytesSNode( 0, arg); break;
+ case vmIntrinsics::_reverseBytes_i: n = new ReverseBytesINode( 0, arg); break;
+ case vmIntrinsics::_reverseBytes_l: n = new ReverseBytesLNode( 0, arg); break;
default: fatal_unexpected_iid(id); break;
}
set_result(_gvn.transform(n));
@@ -2637,7 +2637,7 @@ bool LibraryCallKit::inline_unsafe_access(bool is_native_ptr, bool is_store, Bas
break;
case T_ADDRESS:
// Cast to an int type.
- p = _gvn.transform(new (C) CastP2XNode(NULL, p));
+ p = _gvn.transform(new CastP2XNode(NULL, p));
p = ConvX2UL(p);
break;
default:
@@ -2658,7 +2658,7 @@ bool LibraryCallKit::inline_unsafe_access(bool is_native_ptr, bool is_store, Bas
case T_ADDRESS:
// Repackage the long as a pointer.
val = ConvL2X(val);
- val = _gvn.transform(new (C) CastX2PNode(val));
+ val = _gvn.transform(new CastX2PNode(val));
break;
}
@@ -2766,9 +2766,9 @@ bool LibraryCallKit::inline_unsafe_prefetch(bool is_native_ptr, bool is_store, b
// Generate the read or write prefetch
Node *prefetch;
if (is_store) {
- prefetch = new (C) PrefetchWriteNode(i_o(), adr);
+ prefetch = new PrefetchWriteNode(i_o(), adr);
} else {
- prefetch = new (C) PrefetchReadNode(i_o(), adr);
+ prefetch = new PrefetchReadNode(i_o(), adr);
}
prefetch->init_req(0, control());
set_i_o(_gvn.transform(prefetch));
@@ -2906,22 +2906,22 @@ bool LibraryCallKit::inline_unsafe_load_store(BasicType type, LoadStoreKind kind
switch(type) {
case T_INT:
if (kind == LS_xadd) {
- load_store = _gvn.transform(new (C) GetAndAddINode(control(), mem, adr, newval, adr_type));
+ load_store = _gvn.transform(new GetAndAddINode(control(), mem, adr, newval, adr_type));
} else if (kind == LS_xchg) {
- load_store = _gvn.transform(new (C) GetAndSetINode(control(), mem, adr, newval, adr_type));
+ load_store = _gvn.transform(new GetAndSetINode(control(), mem, adr, newval, adr_type));
} else if (kind == LS_cmpxchg) {
- load_store = _gvn.transform(new (C) CompareAndSwapINode(control(), mem, adr, newval, oldval));
+ load_store = _gvn.transform(new CompareAndSwapINode(control(), mem, adr, newval, oldval));
} else {
ShouldNotReachHere();
}
break;
case T_LONG:
if (kind == LS_xadd) {
- load_store = _gvn.transform(new (C) GetAndAddLNode(control(), mem, adr, newval, adr_type));
+ load_store = _gvn.transform(new GetAndAddLNode(control(), mem, adr, newval, adr_type));
} else if (kind == LS_xchg) {
- load_store = _gvn.transform(new (C) GetAndSetLNode(control(), mem, adr, newval, adr_type));
+ load_store = _gvn.transform(new GetAndSetLNode(control(), mem, adr, newval, adr_type));
} else if (kind == LS_cmpxchg) {
- load_store = _gvn.transform(new (C) CompareAndSwapLNode(control(), mem, adr, newval, oldval));
+ load_store = _gvn.transform(new CompareAndSwapLNode(control(), mem, adr, newval, oldval));
} else {
ShouldNotReachHere();
}
@@ -2958,24 +2958,24 @@ bool LibraryCallKit::inline_unsafe_load_store(BasicType type, LoadStoreKind kind
#ifdef _LP64
if (adr->bottom_type()->is_ptr_to_narrowoop()) {
- Node *newval_enc = _gvn.transform(new (C) EncodePNode(newval, newval->bottom_type()->make_narrowoop()));
+ Node *newval_enc = _gvn.transform(new EncodePNode(newval, newval->bottom_type()->make_narrowoop()));
if (kind == LS_xchg) {
- load_store = _gvn.transform(new (C) GetAndSetNNode(control(), mem, adr,
- newval_enc, adr_type, value_type->make_narrowoop()));
+ load_store = _gvn.transform(new GetAndSetNNode(control(), mem, adr,
+ newval_enc, adr_type, value_type->make_narrowoop()));
} else {
assert(kind == LS_cmpxchg, "wrong LoadStore operation");
- Node *oldval_enc = _gvn.transform(new (C) EncodePNode(oldval, oldval->bottom_type()->make_narrowoop()));
- load_store = _gvn.transform(new (C) CompareAndSwapNNode(control(), mem, adr,
+ Node *oldval_enc = _gvn.transform(new EncodePNode(oldval, oldval->bottom_type()->make_narrowoop()));
+ load_store = _gvn.transform(new CompareAndSwapNNode(control(), mem, adr,
newval_enc, oldval_enc));
}
} else
#endif
{
if (kind == LS_xchg) {
- load_store = _gvn.transform(new (C) GetAndSetPNode(control(), mem, adr, newval, adr_type, value_type->is_oopptr()));
+ load_store = _gvn.transform(new GetAndSetPNode(control(), mem, adr, newval, adr_type, value_type->is_oopptr()));
} else {
assert(kind == LS_cmpxchg, "wrong LoadStore operation");
- load_store = _gvn.transform(new (C) CompareAndSwapPNode(control(), mem, adr, newval, oldval));
+ load_store = _gvn.transform(new CompareAndSwapPNode(control(), mem, adr, newval, oldval));
}
}
post_barrier(control(), load_store, base, adr, alias_idx, newval, T_OBJECT, true);
@@ -2988,13 +2988,13 @@ bool LibraryCallKit::inline_unsafe_load_store(BasicType type, LoadStoreKind kind
// SCMemProjNodes represent the memory state of a LoadStore. Their
// main role is to prevent LoadStore nodes from being optimized away
// when their results aren't used.
- Node* proj = _gvn.transform(new (C) SCMemProjNode(load_store));
+ Node* proj = _gvn.transform(new SCMemProjNode(load_store));
set_memory(proj, alias_idx);
if (type == T_OBJECT && kind == LS_xchg) {
#ifdef _LP64
if (adr->bottom_type()->is_ptr_to_narrowoop()) {
- load_store = _gvn.transform(new (C) DecodeNNode(load_store, load_store->get_ptr_type()));
+ load_store = _gvn.transform(new DecodeNNode(load_store, load_store->get_ptr_type()));
}
#endif
if (can_move_pre_barrier()) {
@@ -3136,7 +3136,7 @@ bool LibraryCallKit::inline_unsafe_allocate() {
// can generate code to load it as unsigned byte.
Node* inst = make_load(NULL, insp, TypeInt::UBYTE, T_BOOLEAN, MemNode::unordered);
Node* bits = intcon(InstanceKlass::fully_initialized);
- test = _gvn.transform(new (C) SubINode(inst, bits));
+ test = _gvn.transform(new SubINode(inst, bits));
// The 'test' is non-zero if we need to take a slow path.
}
@@ -3160,9 +3160,9 @@ bool LibraryCallKit::inline_native_classID() {
Node* insp = basic_plus_adr(kls, in_bytes(offset));
Node* tvalue = make_load(NULL, insp, TypeLong::LONG, T_LONG, MemNode::unordered);
Node* bits = longcon(~0x03l); // ignore bit 0 & 1
- Node* andl = _gvn.transform(new (C) AndLNode(tvalue, bits));
+ Node* andl = _gvn.transform(new AndLNode(tvalue, bits));
Node* clsused = longcon(0x01l); // set the class bit
- Node* orl = _gvn.transform(new (C) OrLNode(tvalue, clsused));
+ Node* orl = _gvn.transform(new OrLNode(tvalue, clsused));
const TypePtr *adr_type = _gvn.type(insp)->isa_ptr();
store_to_memory(control(), insp, orl, T_LONG, adr_type, MemNode::unordered);
@@ -3198,9 +3198,9 @@ bool LibraryCallKit::inline_native_time_funcs(address funcAddr, const char* func
const TypeFunc* tf = OptoRuntime::void_long_Type();
const TypePtr* no_memory_effects = NULL;
Node* time = make_runtime_call(RC_LEAF, tf, funcAddr, funcName, no_memory_effects);
- Node* value = _gvn.transform(new (C) ProjNode(time, TypeFunc::Parms+0));
+ Node* value = _gvn.transform(new ProjNode(time, TypeFunc::Parms+0));
#ifdef ASSERT
- Node* value_top = _gvn.transform(new (C) ProjNode(time, TypeFunc::Parms+1));
+ Node* value_top = _gvn.transform(new ProjNode(time, TypeFunc::Parms+1));
assert(value_top == top(), "second value must be top");
#endif
set_result(value);
@@ -3241,18 +3241,18 @@ bool LibraryCallKit::inline_native_isInterrupted() {
// out of the function.
insert_mem_bar(Op_MemBarCPUOrder);
- RegionNode* result_rgn = new (C) RegionNode(PATH_LIMIT);
- PhiNode* result_val = new (C) PhiNode(result_rgn, TypeInt::BOOL);
+ RegionNode* result_rgn = new RegionNode(PATH_LIMIT);
+ PhiNode* result_val = new PhiNode(result_rgn, TypeInt::BOOL);
- RegionNode* slow_region = new (C) RegionNode(1);
+ RegionNode* slow_region = new RegionNode(1);
record_for_igvn(slow_region);
// (a) Receiving thread must be the current thread.
Node* rec_thr = argument(0);
Node* tls_ptr = NULL;
Node* cur_thr = generate_current_thread(tls_ptr);
- Node* cmp_thr = _gvn.transform(new (C) CmpPNode(cur_thr, rec_thr));
- Node* bol_thr = _gvn.transform(new (C) BoolNode(cmp_thr, BoolTest::ne));
+ Node* cmp_thr = _gvn.transform(new CmpPNode(cur_thr, rec_thr));
+ Node* bol_thr = _gvn.transform(new BoolNode(cmp_thr, BoolTest::ne));
generate_slow_guard(bol_thr, slow_region);
@@ -3263,33 +3263,33 @@ bool LibraryCallKit::inline_native_isInterrupted() {
// Set the control input on the field _interrupted read to prevent it floating up.
Node* int_bit = make_load(control(), p, TypeInt::BOOL, T_INT, MemNode::unordered);
- Node* cmp_bit = _gvn.transform(new (C) CmpINode(int_bit, intcon(0)));
- Node* bol_bit = _gvn.transform(new (C) BoolNode(cmp_bit, BoolTest::ne));
+ Node* cmp_bit = _gvn.transform(new CmpINode(int_bit, intcon(0)));
+ Node* bol_bit = _gvn.transform(new BoolNode(cmp_bit, BoolTest::ne));
IfNode* iff_bit = create_and_map_if(control(), bol_bit, PROB_UNLIKELY_MAG(3), COUNT_UNKNOWN);
// First fast path: if (!TLS._interrupted) return false;
- Node* false_bit = _gvn.transform(new (C) IfFalseNode(iff_bit));
+ Node* false_bit = _gvn.transform(new IfFalseNode(iff_bit));
result_rgn->init_req(no_int_result_path, false_bit);
result_val->init_req(no_int_result_path, intcon(0));
// drop through to next case
- set_control( _gvn.transform(new (C) IfTrueNode(iff_bit)));
+ set_control( _gvn.transform(new IfTrueNode(iff_bit)));
#ifndef TARGET_OS_FAMILY_windows
// (c) Or, if interrupt bit is set and clear_int is false, use 2nd fast path.
Node* clr_arg = argument(1);
- Node* cmp_arg = _gvn.transform(new (C) CmpINode(clr_arg, intcon(0)));
- Node* bol_arg = _gvn.transform(new (C) BoolNode(cmp_arg, BoolTest::ne));
+ Node* cmp_arg = _gvn.transform(new CmpINode(clr_arg, intcon(0)));
+ Node* bol_arg = _gvn.transform(new BoolNode(cmp_arg, BoolTest::ne));
IfNode* iff_arg = create_and_map_if(control(), bol_arg, PROB_FAIR, COUNT_UNKNOWN);
// Second fast path: ... else if (!clear_int) return true;
- Node* false_arg = _gvn.transform(new (C) IfFalseNode(iff_arg));
+ Node* false_arg = _gvn.transform(new IfFalseNode(iff_arg));
result_rgn->init_req(no_clear_result_path, false_arg);
result_val->init_req(no_clear_result_path, intcon(1));
// drop through to next case
- set_control( _gvn.transform(new (C) IfTrueNode(iff_arg)));
+ set_control( _gvn.transform(new IfTrueNode(iff_arg)));
#else
// To return true on Windows you must read the _interrupted field
// and check the the event state i.e. take the slow path.
@@ -3375,9 +3375,9 @@ Node* LibraryCallKit::generate_access_flags_guard(Node* kls, int modifier_mask,
Node* mods = make_load(NULL, modp, TypeInt::INT, T_INT, MemNode::unordered);
Node* mask = intcon(modifier_mask);
Node* bits = intcon(modifier_bits);
- Node* mbit = _gvn.transform(new (C) AndINode(mods, mask));
- Node* cmp = _gvn.transform(new (C) CmpINode(mbit, bits));
- Node* bol = _gvn.transform(new (C) BoolNode(cmp, BoolTest::ne));
+ Node* mbit = _gvn.transform(new AndINode(mods, mask));
+ Node* cmp = _gvn.transform(new CmpINode(mbit, bits));
+ Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::ne));
return generate_fair_guard(bol, region);
}
Node* LibraryCallKit::generate_interface_guard(Node* kls, RegionNode* region) {
@@ -3450,9 +3450,9 @@ bool LibraryCallKit::inline_native_Class_query(vmIntrinsics::ID id) {
#endif
// Null-check the mirror, and the mirror's klass ptr (in case it is a primitive).
- RegionNode* region = new (C) RegionNode(PATH_LIMIT);
+ RegionNode* region = new RegionNode(PATH_LIMIT);
record_for_igvn(region);
- PhiNode* phi = new (C) PhiNode(region, return_type);
+ PhiNode* phi = new PhiNode(region, return_type);
// The mirror will never be null of Reflection.getClassAccessFlags, however
// it may be null for Class.isInstance or Class.getModifiers. Throw a NPE
@@ -3594,8 +3594,8 @@ bool LibraryCallKit::inline_native_subtype_check() {
PATH_LIMIT
};
- RegionNode* region = new (C) RegionNode(PATH_LIMIT);
- Node* phi = new (C) PhiNode(region, TypeInt::BOOL);
+ RegionNode* region = new RegionNode(PATH_LIMIT);
+ Node* phi = new PhiNode(region, TypeInt::BOOL);
record_for_igvn(region);
const TypePtr* adr_type = TypeRawPtr::BOTTOM; // memory type of loads
@@ -3642,8 +3642,8 @@ bool LibraryCallKit::inline_native_subtype_check() {
set_control(region->in(_prim_0_path)); // go back to first null check
if (!stopped()) {
// Since superc is primitive, make a guard for the superc==subc case.
- Node* cmp_eq = _gvn.transform(new (C) CmpPNode(args[0], args[1]));
- Node* bol_eq = _gvn.transform(new (C) BoolNode(cmp_eq, BoolTest::eq));
+ Node* cmp_eq = _gvn.transform(new CmpPNode(args[0], args[1]));
+ Node* bol_eq = _gvn.transform(new BoolNode(cmp_eq, BoolTest::eq));
generate_guard(bol_eq, region, PROB_FAIR);
if (region->req() == PATH_LIMIT+1) {
// A guard was added. If the added guard is taken, superc==subc.
@@ -3708,11 +3708,11 @@ Node* LibraryCallKit::generate_array_guard_common(Node* kls, RegionNode* region,
? ((jint)Klass::_lh_array_tag_type_value
<< Klass::_lh_array_tag_shift)
: Klass::_lh_neutral_value);
- Node* cmp = _gvn.transform(new(C) CmpINode(layout_val, intcon(nval)));
+ Node* cmp = _gvn.transform(new CmpINode(layout_val, intcon(nval)));
BoolTest::mask btest = BoolTest::lt; // correct for testing is_[obj]array
// invert the test if we are looking for a non-array
if (not_array) btest = BoolTest(btest).negate();
- Node* bol = _gvn.transform(new(C) BoolNode(cmp, btest));
+ Node* bol = _gvn.transform(new BoolNode(cmp, btest));
return generate_fair_guard(bol, region);
}
@@ -3728,12 +3728,10 @@ bool LibraryCallKit::inline_native_newArray() {
if (stopped()) return true;
enum { _normal_path = 1, _slow_path = 2, PATH_LIMIT };
- RegionNode* result_reg = new(C) RegionNode(PATH_LIMIT);
- PhiNode* result_val = new(C) PhiNode(result_reg,
- TypeInstPtr::NOTNULL);
- PhiNode* result_io = new(C) PhiNode(result_reg, Type::ABIO);
- PhiNode* result_mem = new(C) PhiNode(result_reg, Type::MEMORY,
- TypePtr::BOTTOM);
+ RegionNode* result_reg = new RegionNode(PATH_LIMIT);
+ PhiNode* result_val = new PhiNode(result_reg, TypeInstPtr::NOTNULL);
+ PhiNode* result_io = new PhiNode(result_reg, Type::ABIO);
+ PhiNode* result_mem = new PhiNode(result_reg, Type::MEMORY, TypePtr::BOTTOM);
bool never_see_null = !too_many_traps(Deoptimization::Reason_null_check);
Node* klass_node = load_array_klass_from_mirror(mirror, never_see_null,
@@ -3840,7 +3838,7 @@ bool LibraryCallKit::inline_array_copyOf(bool is_copyOfRange) {
Node* klass_node = load_klass_from_mirror(array_type_mirror, false, NULL, 0);
klass_node = null_check(klass_node);
- RegionNode* bailout = new (C) RegionNode(1);
+ RegionNode* bailout = new RegionNode(1);
record_for_igvn(bailout);
// Despite the generic type of Arrays.copyOf, the mirror might be int, int[], etc.
@@ -3850,7 +3848,7 @@ bool LibraryCallKit::inline_array_copyOf(bool is_copyOfRange) {
// Improve the klass node's type from the new optimistic assumption:
ciKlass* ak = ciArrayKlass::make(env()->Object_klass());
const Type* akls = TypeKlassPtr::make(TypePtr::NotNull, ak, 0/*offset*/);
- Node* cast = new (C) CastPPNode(klass_node, akls);
+ Node* cast = new CastPPNode(klass_node, akls);
cast->init_req(0, control());
klass_node = _gvn.transform(cast);
}
@@ -3861,7 +3859,7 @@ bool LibraryCallKit::inline_array_copyOf(bool is_copyOfRange) {
Node* length = end;
if (_gvn.type(start) != TypeInt::ZERO) {
- length = _gvn.transform(new (C) SubINode(end, start));
+ length = _gvn.transform(new SubINode(end, start));
}
// Bail out if length is negative.
@@ -3880,7 +3878,7 @@ bool LibraryCallKit::inline_array_copyOf(bool is_copyOfRange) {
if (!stopped()) {
// How many elements will we copy from the original?
// The answer is MinI(orig_length - start, length).
- Node* orig_tail = _gvn.transform(new (C) SubINode(orig_length, start));
+ Node* orig_tail = _gvn.transform(new SubINode(orig_length, start));
Node* moved = generate_min_max(vmIntrinsics::_min, orig_tail, length);
newcopy = new_array(klass_node, length, 0); // no argments to push
@@ -3927,8 +3925,8 @@ Node* LibraryCallKit::generate_virtual_guard(Node* obj_klass,
const TypePtr* native_call_addr = TypeMetadataPtr::make(method);
Node* native_call = makecon(native_call_addr);
- Node* chk_native = _gvn.transform(new(C) CmpPNode(target_call, native_call));
- Node* test_native = _gvn.transform(new(C) BoolNode(chk_native, BoolTest::ne));
+ Node* chk_native = _gvn.transform(new CmpPNode(target_call, native_call));
+ Node* test_native = _gvn.transform(new BoolNode(chk_native, BoolTest::ne));
return generate_slow_guard(test_native, slow_region);
}
@@ -3953,7 +3951,7 @@ LibraryCallKit::generate_method_call(vmIntrinsics::ID method_id, bool is_virtual
CallJavaNode* slow_call;
if (is_static) {
assert(!is_virtual, "");
- slow_call = new(C) CallStaticJavaNode(C, tf,
+ slow_call = new CallStaticJavaNode(C, tf,
SharedRuntime::get_resolve_static_call_stub(),
method, bci());
} else if (is_virtual) {
@@ -3969,12 +3967,12 @@ LibraryCallKit::generate_method_call(vmIntrinsics::ID method_id, bool is_virtual
assert(vtable_index >= 0 || vtable_index == Method::nonvirtual_vtable_index,
err_msg_res("bad index %d", vtable_index));
}
- slow_call = new(C) CallDynamicJavaNode(tf,
+ slow_call = new CallDynamicJavaNode(tf,
SharedRuntime::get_resolve_virtual_call_stub(),
method, vtable_index, bci());
} else { // neither virtual nor static: opt_virtual
null_check_receiver();
- slow_call = new(C) CallStaticJavaNode(C, tf,
+ slow_call = new CallStaticJavaNode(C, tf,
SharedRuntime::get_resolve_opt_virtual_call_stub(),
method, bci());
slow_call->set_optimized_virtual(true);
@@ -3996,10 +3994,10 @@ bool LibraryCallKit::inline_native_hashcode(bool is_virtual, bool is_static) {
enum { _slow_path = 1, _fast_path, _null_path, PATH_LIMIT };
- RegionNode* result_reg = new(C) RegionNode(PATH_LIMIT);
- PhiNode* result_val = new(C) PhiNode(result_reg, TypeInt::INT);
- PhiNode* result_io = new(C) PhiNode(result_reg, Type::ABIO);
- PhiNode* result_mem = new(C) PhiNode(result_reg, Type::MEMORY, TypePtr::BOTTOM);
+ RegionNode* result_reg = new RegionNode(PATH_LIMIT);
+ PhiNode* result_val = new PhiNode(result_reg, TypeInt::INT);
+ PhiNode* result_io = new PhiNode(result_reg, Type::ABIO);
+ PhiNode* result_mem = new PhiNode(result_reg, Type::MEMORY, TypePtr::BOTTOM);
Node* obj = NULL;
if (!is_static) {
// Check for hashing null object
@@ -4027,7 +4025,7 @@ bool LibraryCallKit::inline_native_hashcode(bool is_virtual, bool is_static) {
// We only go to the fast case code if we pass a number of guards. The
// paths which do not pass are accumulated in the slow_region.
- RegionNode* slow_region = new (C) RegionNode(1);
+ RegionNode* slow_region = new RegionNode(1);
record_for_igvn(slow_region);
// If this is a virtual call, we generate a funny guard. We pull out
@@ -4050,11 +4048,11 @@ bool LibraryCallKit::inline_native_hashcode(bool is_virtual, bool is_static) {
Node* header = make_load(no_ctrl, header_addr, TypeX_X, TypeX_X->basic_type(), MemNode::unordered);
// Test the header to see if it is unlocked.
- Node* lock_mask = _gvn.MakeConX(markOopDesc::biased_lock_mask_in_place);
- Node* lmasked_header = _gvn.transform(new (C) AndXNode(header, lock_mask));
- Node* unlocked_val = _gvn.MakeConX(markOopDesc::unlocked_value);
- Node* chk_unlocked = _gvn.transform(new (C) CmpXNode( lmasked_header, unlocked_val));
- Node* test_unlocked = _gvn.transform(new (C) BoolNode( chk_unlocked, BoolTest::ne));
+ Node *lock_mask = _gvn.MakeConX(markOopDesc::biased_lock_mask_in_place);
+ Node *lmasked_header = _gvn.transform(new AndXNode(header, lock_mask));
+ Node *unlocked_val = _gvn.MakeConX(markOopDesc::unlocked_value);
+ Node *chk_unlocked = _gvn.transform(new CmpXNode( lmasked_header, unlocked_val));
+ Node *test_unlocked = _gvn.transform(new BoolNode( chk_unlocked, BoolTest::ne));
generate_slow_guard(test_unlocked, slow_region);
@@ -4062,19 +4060,19 @@ bool LibraryCallKit::inline_native_hashcode(bool is_virtual, bool is_static) {
// We depend on hash_mask being at most 32 bits and avoid the use of
// hash_mask_in_place because it could be larger than 32 bits in a 64-bit
// vm: see markOop.hpp.
- Node* hash_mask = _gvn.intcon(markOopDesc::hash_mask);
- Node* hash_shift = _gvn.intcon(markOopDesc::hash_shift);
- Node* hshifted_header= _gvn.transform(new (C) URShiftXNode(header, hash_shift));
+ Node *hash_mask = _gvn.intcon(markOopDesc::hash_mask);
+ Node *hash_shift = _gvn.intcon(markOopDesc::hash_shift);
+ Node *hshifted_header= _gvn.transform(new URShiftXNode(header, hash_shift));
// This hack lets the hash bits live anywhere in the mark object now, as long
// as the shift drops the relevant bits into the low 32 bits. Note that
// Java spec says that HashCode is an int so there's no point in capturing
// an 'X'-sized hashcode (32 in 32-bit build or 64 in 64-bit build).
hshifted_header = ConvX2I(hshifted_header);
- Node* hash_val = _gvn.transform(new (C) AndINode(hshifted_header, hash_mask));
+ Node *hash_val = _gvn.transform(new AndINode(hshifted_header, hash_mask));
- Node* no_hash_val = _gvn.intcon(markOopDesc::no_hash);
- Node* chk_assigned = _gvn.transform(new (C) CmpINode( hash_val, no_hash_val));
- Node* test_assigned = _gvn.transform(new (C) BoolNode( chk_assigned, BoolTest::eq));
+ Node *no_hash_val = _gvn.intcon(markOopDesc::no_hash);
+ Node *chk_assigned = _gvn.transform(new CmpINode( hash_val, no_hash_val));
+ Node *test_assigned = _gvn.transform(new BoolNode( chk_assigned, BoolTest::eq));
generate_slow_guard(test_assigned, slow_region);
@@ -4213,19 +4211,19 @@ bool LibraryCallKit::inline_fp_conversions(vmIntrinsics::ID id) {
Node* result;
switch (id) {
- case vmIntrinsics::_floatToRawIntBits: result = new (C) MoveF2INode(arg); break;
- case vmIntrinsics::_intBitsToFloat: result = new (C) MoveI2FNode(arg); break;
- case vmIntrinsics::_doubleToRawLongBits: result = new (C) MoveD2LNode(arg); break;
- case vmIntrinsics::_longBitsToDouble: result = new (C) MoveL2DNode(arg); break;
+ case vmIntrinsics::_floatToRawIntBits: result = new MoveF2INode(arg); break;
+ case vmIntrinsics::_intBitsToFloat: result = new MoveI2FNode(arg); break;
+ case vmIntrinsics::_doubleToRawLongBits: result = new MoveD2LNode(arg); break;
+ case vmIntrinsics::_longBitsToDouble: result = new MoveL2DNode(arg); break;
case vmIntrinsics::_doubleToLongBits: {
// two paths (plus control) merge in a wood
- RegionNode *r = new (C) RegionNode(3);
- Node *phi = new (C) PhiNode(r, TypeLong::LONG);
+ RegionNode *r = new RegionNode(3);
+ Node *phi = new PhiNode(r, TypeLong::LONG);
- Node *cmpisnan = _gvn.transform(new (C) CmpDNode(arg, arg));
+ Node *cmpisnan = _gvn.transform(new CmpDNode(arg, arg));
// Build the boolean node
- Node *bolisnan = _gvn.transform(new (C) BoolNode(cmpisnan, BoolTest::ne));
+ Node *bolisnan = _gvn.transform(new BoolNode(cmpisnan, BoolTest::ne));
// Branch either way.
// NaN case is less traveled, which makes all the difference.
@@ -4233,7 +4231,7 @@ bool LibraryCallKit::inline_fp_conversions(vmIntrinsics::ID id) {
Node *opt_isnan = _gvn.transform(ifisnan);
assert( opt_isnan->is_If(), "Expect an IfNode");
IfNode *opt_ifisnan = (IfNode*)opt_isnan;
- Node *iftrue = _gvn.transform(new (C) IfTrueNode(opt_ifisnan));
+ Node *iftrue = _gvn.transform(new IfTrueNode(opt_ifisnan));
set_control(iftrue);
@@ -4243,10 +4241,10 @@ bool LibraryCallKit::inline_fp_conversions(vmIntrinsics::ID id) {
r->init_req(1, iftrue);
// Else fall through
- Node *iffalse = _gvn.transform(new (C) IfFalseNode(opt_ifisnan));
+ Node *iffalse = _gvn.transform(new IfFalseNode(opt_ifisnan));
set_control(iffalse);
- phi->init_req(2, _gvn.transform(new (C) MoveD2LNode(arg)));
+ phi->init_req(2, _gvn.transform(new MoveD2LNode(arg)));
r->init_req(2, iffalse);
// Post merge
@@ -4261,12 +4259,12 @@ bool LibraryCallKit::inline_fp_conversions(vmIntrinsics::ID id) {
case vmIntrinsics::_floatToIntBits: {
// two paths (plus control) merge in a wood
- RegionNode *r = new (C) RegionNode(3);
- Node *phi = new (C) PhiNode(r, TypeInt::INT);
+ RegionNode *r = new RegionNode(3);
+ Node *phi = new PhiNode(r, TypeInt::INT);
- Node *cmpisnan = _gvn.transform(new (C) CmpFNode(arg, arg));
+ Node *cmpisnan = _gvn.transform(new CmpFNode(arg, arg));
// Build the boolean node
- Node *bolisnan = _gvn.transform(new (C) BoolNode(cmpisnan, BoolTest::ne));
+ Node *bolisnan = _gvn.transform(new BoolNode(cmpisnan, BoolTest::ne));
// Branch either way.
// NaN case is less traveled, which makes all the difference.
@@ -4274,7 +4272,7 @@ bool LibraryCallKit::inline_fp_conversions(vmIntrinsics::ID id) {
Node *opt_isnan = _gvn.transform(ifisnan);
assert( opt_isnan->is_If(), "Expect an IfNode");
IfNode *opt_ifisnan = (IfNode*)opt_isnan;
- Node *iftrue = _gvn.transform(new (C) IfTrueNode(opt_ifisnan));
+ Node *iftrue = _gvn.transform(new IfTrueNode(opt_ifisnan));
set_control(iftrue);
@@ -4284,10 +4282,10 @@ bool LibraryCallKit::inline_fp_conversions(vmIntrinsics::ID id) {
r->init_req(1, iftrue);
// Else fall through
- Node *iffalse = _gvn.transform(new (C) IfFalseNode(opt_ifisnan));
+ Node *iffalse = _gvn.transform(new IfFalseNode(opt_ifisnan));
set_control(iffalse);
- phi->init_req(2, _gvn.transform(new (C) MoveF2INode(arg)));
+ phi->init_req(2, _gvn.transform(new MoveF2INode(arg)));
r->init_req(2, iffalse);
// Post merge
@@ -4403,8 +4401,8 @@ void LibraryCallKit::copy_to_clone(Node* obj, Node* alloc_obj, Node* obj_size, b
// Compute the length also, if needed:
Node* countx = size;
- countx = _gvn.transform(new (C) SubXNode(countx, MakeConX(base_off)));
- countx = _gvn.transform(new (C) URShiftXNode(countx, intcon(LogBytesPerLong) ));
+ countx = _gvn.transform(new SubXNode(countx, MakeConX(base_off)));
+ countx = _gvn.transform(new URShiftXNode(countx, intcon(LogBytesPerLong) ));
const TypePtr* raw_adr_type = TypeRawPtr::BOTTOM;
bool disjoint_bases = true;
@@ -4493,12 +4491,10 @@ bool LibraryCallKit::inline_native_clone(bool is_virtual) {
_instance_path, // plain instance allocation, plus arrayof_long_arraycopy
PATH_LIMIT
};
- RegionNode* result_reg = new(C) RegionNode(PATH_LIMIT);
- result_val = new(C) PhiNode(result_reg,
- TypeInstPtr::NOTNULL);
- PhiNode* result_i_o = new(C) PhiNode(result_reg, Type::ABIO);
- PhiNode* result_mem = new(C) PhiNode(result_reg, Type::MEMORY,
- TypePtr::BOTTOM);
+ RegionNode* result_reg = new RegionNode(PATH_LIMIT);
+ result_val = new PhiNode(result_reg, TypeInstPtr::NOTNULL);
+ PhiNode* result_i_o = new PhiNode(result_reg, Type::ABIO);
+ PhiNode* result_mem = new PhiNode(result_reg, Type::MEMORY, TypePtr::BOTTOM);
record_for_igvn(result_reg);
const TypePtr* raw_adr_type = TypeRawPtr::BOTTOM;
@@ -4554,7 +4550,7 @@ bool LibraryCallKit::inline_native_clone(bool is_virtual) {
// We only go to the instance fast case code if we pass a number of guards.
// The paths which do not pass are accumulated in the slow_region.
- RegionNode* slow_region = new (C) RegionNode(1);
+ RegionNode* slow_region = new RegionNode(1);
record_for_igvn(slow_region);
if (!stopped()) {
// It's an instance (we did array above). Make the slow-path tests.
@@ -4811,7 +4807,7 @@ bool LibraryCallKit::inline_arraycopy() {
// (8) dest_offset + length must not exceed length of dest.
// (9) each element of an oop array must be assignable
- RegionNode* slow_region = new (C) RegionNode(1);
+ RegionNode* slow_region = new RegionNode(1);
record_for_igvn(slow_region);
// (3) operands must not be null
@@ -4899,7 +4895,7 @@ LibraryCallKit::generate_arraycopy(const TypePtr* adr_type,
RegionNode* slow_region) {
if (slow_region == NULL) {
- slow_region = new(C) RegionNode(1);
+ slow_region = new RegionNode(1);
record_for_igvn(slow_region);
}
@@ -4947,9 +4943,9 @@ LibraryCallKit::generate_arraycopy(const TypePtr* adr_type,
bcopy_path = 5, // copy primitive array by 64-bit blocks
PATH_LIMIT = 6
};
- RegionNode* result_region = new(C) RegionNode(PATH_LIMIT);
- PhiNode* result_i_o = new(C) PhiNode(result_region, Type::ABIO);
- PhiNode* result_memory = new(C) PhiNode(result_region, Type::MEMORY, adr_type);
+ RegionNode* result_region = new RegionNode(PATH_LIMIT);
+ PhiNode* result_i_o = new PhiNode(result_region, Type::ABIO);
+ PhiNode* result_memory = new PhiNode(result_region, Type::MEMORY, adr_type);
record_for_igvn(result_region);
_gvn.set_type_bottom(result_i_o);
_gvn.set_type_bottom(result_memory);
@@ -5023,8 +5019,7 @@ LibraryCallKit::generate_arraycopy(const TypePtr* adr_type,
// are dest_head = dest[0..off] and dest_tail = dest[off+len..dest.length].
Node* dest_size = alloc->in(AllocateNode::AllocSize);
Node* dest_length = alloc->in(AllocateNode::ALength);
- Node* dest_tail = _gvn.transform(new(C) AddINode(dest_offset,
- copy_length));
+ Node* dest_tail = _gvn.transform(new AddINode(dest_offset, copy_length));
// If there is a head section that needs zeroing, do it now.
if (find_int_con(dest_offset, -1) != 0) {
@@ -5040,8 +5035,8 @@ LibraryCallKit::generate_arraycopy(const TypePtr* adr_type,
// the copy to a more hardware-friendly word size of 64 bits.
Node* tail_ctl = NULL;
if (!stopped() && !dest_tail->eqv_uncast(dest_length)) {
- Node* cmp_lt = _gvn.transform(new(C) CmpINode(dest_tail, dest_length));
- Node* bol_lt = _gvn.transform(new(C) BoolNode(cmp_lt, BoolTest::lt));
+ Node* cmp_lt = _gvn.transform(new CmpINode(dest_tail, dest_length));
+ Node* bol_lt = _gvn.transform(new BoolNode(cmp_lt, BoolTest::lt));
tail_ctl = generate_slow_guard(bol_lt, NULL);
assert(tail_ctl != NULL || !stopped(), "must be an outcome");
}
@@ -5075,8 +5070,8 @@ LibraryCallKit::generate_arraycopy(const TypePtr* adr_type,
dest_size);
} else {
// Make a local merge.
- Node* done_ctl = new(C) RegionNode(3);
- Node* done_mem = new(C) PhiNode(done_ctl, Type::MEMORY, adr_type);
+ Node* done_ctl = new RegionNode(3);
+ Node* done_mem = new PhiNode(done_ctl, Type::MEMORY, adr_type);
done_ctl->init_req(1, notail_ctl);
done_mem->init_req(1, memory(adr_type));
generate_clear_array(adr_type, dest, basic_elem_type,
@@ -5171,21 +5166,21 @@ LibraryCallKit::generate_arraycopy(const TypePtr* adr_type,
// Clean up after the checked call.
// The returned value is either 0 or -1^K,
// where K = number of partially transferred array elements.
- Node* cmp = _gvn.transform(new(C) CmpINode(checked_value, intcon(0)));
- Node* bol = _gvn.transform(new(C) BoolNode(cmp, BoolTest::eq));
+ Node* cmp = _gvn.transform(new CmpINode(checked_value, intcon(0)));
+ Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::eq));
IfNode* iff = create_and_map_if(control(), bol, PROB_MAX, COUNT_UNKNOWN);
// If it is 0, we are done, so transfer to the end.
- Node* checks_done = _gvn.transform(new(C) IfTrueNode(iff));
+ Node* checks_done = _gvn.transform(new IfTrueNode(iff));
result_region->init_req(checked_path, checks_done);
result_i_o ->init_req(checked_path, checked_i_o);
result_memory->init_req(checked_path, checked_mem);
// If it is not zero, merge into the slow call.
- set_control( _gvn.transform(new(C) IfFalseNode(iff) ));
- RegionNode* slow_reg2 = new(C) RegionNode(3);
- PhiNode* slow_i_o2 = new(C) PhiNode(slow_reg2, Type::ABIO);
- PhiNode* slow_mem2 = new(C) PhiNode(slow_reg2, Type::MEMORY, adr_type);
+ set_control( _gvn.transform(new IfFalseNode(iff) ));
+ RegionNode* slow_reg2 = new RegionNode(3);
+ PhiNode* slow_i_o2 = new PhiNode(slow_reg2, Type::ABIO);
+ PhiNode* slow_mem2 = new PhiNode(slow_reg2, Type::MEMORY, adr_type);
record_for_igvn(slow_reg2);
slow_reg2 ->init_req(1, slow_control);
slow_i_o2 ->init_req(1, slow_i_o);
@@ -5205,16 +5200,16 @@ LibraryCallKit::generate_arraycopy(const TypePtr* adr_type,
} else {
// We must continue the copy exactly where it failed, or else
// another thread might see the wrong number of writes to dest.
- Node* checked_offset = _gvn.transform(new(C) XorINode(checked_value, intcon(-1)));
- Node* slow_offset = new(C) PhiNode(slow_reg2, TypeInt::INT);
+ Node* checked_offset = _gvn.transform(new XorINode(checked_value, intcon(-1)));
+ Node* slow_offset = new PhiNode(slow_reg2, TypeInt::INT);
slow_offset->init_req(1, intcon(0));
slow_offset->init_req(2, checked_offset);
slow_offset = _gvn.transform(slow_offset);
// Adjust the arguments by the conditionally incoming offset.
- Node* src_off_plus = _gvn.transform(new(C) AddINode(src_offset, slow_offset));
- Node* dest_off_plus = _gvn.transform(new(C) AddINode(dest_offset, slow_offset));
- Node* length_minus = _gvn.transform(new(C) SubINode(copy_length, slow_offset));
+ Node* src_off_plus = _gvn.transform(new AddINode(src_offset, slow_offset));
+ Node* dest_off_plus = _gvn.transform(new AddINode(dest_offset, slow_offset));
+ Node* length_minus = _gvn.transform(new SubINode(copy_length, slow_offset));
// Tweak the node variables to adjust the code produced below:
src_offset = src_off_plus;
@@ -5435,10 +5430,10 @@ LibraryCallKit::generate_clear_array(const TypePtr* adr_type,
int end_round = (-1 << scale) & (BytesPerLong - 1);
Node* end = ConvI2X(slice_len);
if (scale != 0)
- end = _gvn.transform(new(C) LShiftXNode(end, intcon(scale) ));
+ end = _gvn.transform(new LShiftXNode(end, intcon(scale) ));
end_base += end_round;
- end = _gvn.transform(new(C) AddXNode(end, MakeConX(end_base)));
- end = _gvn.transform(new(C) AndXNode(end, MakeConX(~end_round)));
+ end = _gvn.transform(new AddXNode(end, MakeConX(end_base)));
+ end = _gvn.transform(new AndXNode(end, MakeConX(~end_round)));
mem = ClearArrayNode::clear_memory(control(), mem, dest,
start_con, end, &_gvn);
} else if (start_con < 0 && dest_size != top()) {
@@ -5447,8 +5442,8 @@ LibraryCallKit::generate_clear_array(const TypePtr* adr_type,
Node* start = slice_idx;
start = ConvI2X(start);
if (scale != 0)
- start = _gvn.transform(new(C) LShiftXNode( start, intcon(scale) ));
- start = _gvn.transform(new(C) AddXNode(start, MakeConX(abase)));
+ start = _gvn.transform(new LShiftXNode( start, intcon(scale) ));
+ start = _gvn.transform(new AddXNode(start, MakeConX(abase)));
if ((bump_bit | clear_low) != 0) {
int to_clear = (bump_bit | clear_low);
// Align up mod 8, then store a jint zero unconditionally
@@ -5459,14 +5454,14 @@ LibraryCallKit::generate_clear_array(const TypePtr* adr_type,
assert((abase & to_clear) == 0, "array base must be long-aligned");
} else {
// Bump 'start' up to (or past) the next jint boundary:
- start = _gvn.transform(new(C) AddXNode(start, MakeConX(bump_bit)));
+ start = _gvn.transform(new AddXNode(start, MakeConX(bump_bit)));
assert((abase & clear_low) == 0, "array base must be int-aligned");
}
// Round bumped 'start' down to jlong boundary in body of array.
- start = _gvn.transform(new(C) AndXNode(start, MakeConX(~to_clear)));
+ start = _gvn.transform(new AndXNode(start, MakeConX(~to_clear)));
if (bump_bit != 0) {
// Store a zero to the immediately preceding jint:
- Node* x1 = _gvn.transform(new(C) AddXNode(start, MakeConX(-bump_bit)));
+ Node* x1 = _gvn.transform(new AddXNode(start, MakeConX(-bump_bit)));
Node* p1 = basic_plus_adr(dest, x1);
mem = StoreNode::make(_gvn, control(), mem, p1, adr_type, intcon(0), T_INT, MemNode::unordered);
mem = _gvn.transform(mem);
@@ -5533,8 +5528,8 @@ LibraryCallKit::generate_block_arraycopy(const TypePtr* adr_type,
Node* sptr = basic_plus_adr(src, src_off);
Node* dptr = basic_plus_adr(dest, dest_off);
Node* countx = dest_size;
- countx = _gvn.transform(new (C) SubXNode(countx, MakeConX(dest_off)));
- countx = _gvn.transform(new (C) URShiftXNode(countx, intcon(LogBytesPerLong)));
+ countx = _gvn.transform(new SubXNode(countx, MakeConX(dest_off)));
+ countx = _gvn.transform(new URShiftXNode(countx, intcon(LogBytesPerLong)));
bool disjoint_bases = true; // since alloc != NULL
generate_unchecked_arraycopy(adr_type, T_LONG, disjoint_bases,
@@ -5584,7 +5579,7 @@ LibraryCallKit::generate_checkcast_arraycopy(const TypePtr* adr_type,
// super_check_offset, for the desired klass.
int sco_offset = in_bytes(Klass::super_check_offset_offset());
Node* p3 = basic_plus_adr(dest_elem_klass, sco_offset);
- Node* n3 = new(C) LoadINode(NULL, memory(p3), p3, _gvn.type(p3)->is_ptr(), TypeInt::INT, MemNode::unordered);
+ Node* n3 = new LoadINode(NULL, memory(p3), p3, _gvn.type(p3)->is_ptr(), TypeInt::INT, MemNode::unordered);
Node* check_offset = ConvI2X(_gvn.transform(n3));
Node* check_value = dest_elem_klass;
@@ -5602,7 +5597,7 @@ LibraryCallKit::generate_checkcast_arraycopy(const TypePtr* adr_type,
check_offset XTOP,
check_value);
- return _gvn.transform(new (C) ProjNode(call, TypeFunc::Parms));
+ return _gvn.transform(new ProjNode(call, TypeFunc::Parms));
}
@@ -5624,7 +5619,7 @@ LibraryCallKit::generate_generic_arraycopy(const TypePtr* adr_type,
copyfunc_addr, "generic_arraycopy", adr_type,
src, src_offset, dest, dest_offset, copy_length);
- return _gvn.transform(new (C) ProjNode(call, TypeFunc::Parms));
+ return _gvn.transform(new ProjNode(call, TypeFunc::Parms));
}
// Helper function; generates the fast out-of-line call to an arraycopy stub.
@@ -5691,9 +5686,9 @@ bool LibraryCallKit::inline_encodeISOArray() {
// 'dst_start' points to dst array + scaled offset
const TypeAryPtr* mtype = TypeAryPtr::BYTES;
- Node* enc = new (C) EncodeISOArrayNode(control(), memory(mtype), src_start, dst_start, length);
+ Node* enc = new EncodeISOArrayNode(control(), memory(mtype), src_start, dst_start, length);
enc = _gvn.transform(enc);
- Node* res_mem = _gvn.transform(new (C) SCMemProjNode(enc));
+ Node* res_mem = _gvn.transform(new SCMemProjNode(enc));
set_memory(res_mem, mtype);
set_result(enc);
return true;
@@ -5718,18 +5713,18 @@ bool LibraryCallKit::inline_updateCRC32() {
*/
Node* M1 = intcon(-1);
- crc = _gvn.transform(new (C) XorINode(crc, M1));
- Node* result = _gvn.transform(new (C) XorINode(crc, b));
- result = _gvn.transform(new (C) AndINode(result, intcon(0xFF)));
+ crc = _gvn.transform(new XorINode(crc, M1));
+ Node* result = _gvn.transform(new XorINode(crc, b));
+ result = _gvn.transform(new AndINode(result, intcon(0xFF)));
Node* base = makecon(TypeRawPtr::make(StubRoutines::crc_table_addr()));
- Node* offset = _gvn.transform(new (C) LShiftINode(result, intcon(0x2)));
+ Node* offset = _gvn.transform(new LShiftINode(result, intcon(0x2)));
Node* adr = basic_plus_adr(top(), base, ConvI2X(offset));
result = make_load(control(), adr, TypeInt::INT, T_INT, MemNode::unordered);
- crc = _gvn.transform(new (C) URShiftINode(crc, intcon(8)));
- result = _gvn.transform(new (C) XorINode(crc, result));
- result = _gvn.transform(new (C) XorINode(result, M1));
+ crc = _gvn.transform(new URShiftINode(crc, intcon(8)));
+ result = _gvn.transform(new XorINode(crc, result));
+ result = _gvn.transform(new XorINode(result, M1));
set_result(result);
return true;
}
@@ -5773,7 +5768,7 @@ bool LibraryCallKit::inline_updateBytesCRC32() {
Node* call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::updateBytesCRC32_Type(),
stubAddr, stubName, TypePtr::BOTTOM,
crc, src_start, length);
- Node* result = _gvn.transform(new (C) ProjNode(call, TypeFunc::Parms));
+ Node* result = _gvn.transform(new ProjNode(call, TypeFunc::Parms));
set_result(result);
return true;
}
@@ -5792,7 +5787,7 @@ bool LibraryCallKit::inline_updateByteBufferCRC32() {
Node* length = argument(4); // type: int
src = ConvL2X(src); // adjust Java long to machine word
- Node* base = _gvn.transform(new (C) CastX2PNode(src));
+ Node* base = _gvn.transform(new CastX2PNode(src));
offset = ConvI2X(offset);
// 'src_start' points to src array + scaled offset
@@ -5805,7 +5800,7 @@ bool LibraryCallKit::inline_updateByteBufferCRC32() {
Node* call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::updateBytesCRC32_Type(),
stubAddr, stubName, TypePtr::BOTTOM,
crc, src_start, length);
- Node* result = _gvn.transform(new (C) ProjNode(call, TypeFunc::Parms));
+ Node* result = _gvn.transform(new ProjNode(call, TypeFunc::Parms));
set_result(result);
return true;
}
@@ -6005,7 +6000,7 @@ bool LibraryCallKit::inline_cipherBlockChaining_AESCrypt(vmIntrinsics::ID id) {
ciInstanceKlass* instklass_AESCrypt = klass_AESCrypt->as_instance_klass();
const TypeKlassPtr* aklass = TypeKlassPtr::make(instklass_AESCrypt);
const TypeOopPtr* xtype = aklass->as_instance_type();
- Node* aescrypt_object = new(C) CheckCastPPNode(control(), embeddedCipherObj, xtype);
+ Node* aescrypt_object = new CheckCastPPNode(control(), embeddedCipherObj, xtype);
aescrypt_object = _gvn.transform(aescrypt_object);
// we need to get the start of the aescrypt_object's expanded key array
@@ -6038,7 +6033,7 @@ bool LibraryCallKit::inline_cipherBlockChaining_AESCrypt(vmIntrinsics::ID id) {
}
// return cipher length (int)
- Node* retvalue = _gvn.transform(new (C) ProjNode(cbcCrypt, TypeFunc::Parms));
+ Node* retvalue = _gvn.transform(new ProjNode(cbcCrypt, TypeFunc::Parms));
set_result(retvalue);
return true;
}
@@ -6102,8 +6097,8 @@ Node* LibraryCallKit::inline_cipherBlockChaining_AESCrypt_predicate(bool decrypt
ciInstanceKlass* instklass_AESCrypt = klass_AESCrypt->as_instance_klass();
Node* instof = gen_instanceof(embeddedCipherObj, makecon(TypeKlassPtr::make(instklass_AESCrypt)));
- Node* cmp_instof = _gvn.transform(new (C) CmpINode(instof, intcon(1)));
- Node* bool_instof = _gvn.transform(new (C) BoolNode(cmp_instof, BoolTest::ne));
+ Node* cmp_instof = _gvn.transform(new CmpINode(instof, intcon(1)));
+ Node* bool_instof = _gvn.transform(new BoolNode(cmp_instof, BoolTest::ne));
Node* instof_false = generate_guard(bool_instof, NULL, PROB_MIN);
@@ -6114,12 +6109,12 @@ Node* LibraryCallKit::inline_cipherBlockChaining_AESCrypt_predicate(bool decrypt
// for decryption, we need to add a further check to avoid
// taking the intrinsic path when cipher and plain are the same
// see the original java code for why.
- RegionNode* region = new(C) RegionNode(3);
+ RegionNode* region = new RegionNode(3);
region->init_req(1, instof_false);
Node* src = argument(1);
Node* dest = argument(4);
- Node* cmp_src_dest = _gvn.transform(new (C) CmpPNode(src, dest));
- Node* bool_src_dest = _gvn.transform(new (C) BoolNode(cmp_src_dest, BoolTest::eq));
+ Node* cmp_src_dest = _gvn.transform(new CmpPNode(src, dest));
+ Node* bool_src_dest = _gvn.transform(new BoolNode(cmp_src_dest, BoolTest::eq));
Node* src_dest_conjoint = generate_guard(bool_src_dest, NULL, PROB_MIN);
region->init_req(2, src_dest_conjoint);
diff --git a/hotspot/src/share/vm/opto/loopPredicate.cpp b/hotspot/src/share/vm/opto/loopPredicate.cpp
index aeb3ffad0d5..4f2ddd3d068 100644
--- a/hotspot/src/share/vm/opto/loopPredicate.cpp
+++ b/hotspot/src/share/vm/opto/loopPredicate.cpp
@@ -104,7 +104,7 @@ ProjNode* PhaseIdealLoop::create_new_if_for_predicate(ProjNode* cont_proj, Node*
assert(rgn->is_Call(), "must be call uct");
CallNode* call = rgn->as_Call();
IdealLoopTree* loop = get_loop(call);
- rgn = new (C) RegionNode(1);
+ rgn = new RegionNode(1);
rgn->add_req(uncommon_proj);
register_control(rgn, loop, uncommon_proj);
_igvn.hash_delete(call);
@@ -130,8 +130,8 @@ ProjNode* PhaseIdealLoop::create_new_if_for_predicate(ProjNode* cont_proj, Node*
IfNode *new_iff = iff->clone()->as_If();
new_iff->set_req(0, entry);
register_control(new_iff, lp, entry);
- Node *if_cont = new (C) IfTrueNode(new_iff);
- Node *if_uct = new (C) IfFalseNode(new_iff);
+ Node *if_cont = new IfTrueNode(new_iff);
+ Node *if_uct = new IfFalseNode(new_iff);
if (cont_proj->is_IfFalse()) {
// Swap
Node* tmp = if_uct; if_uct = if_cont; if_cont = tmp;
@@ -191,7 +191,7 @@ ProjNode* PhaseIterGVN::create_new_if_for_predicate(ProjNode* cont_proj, Node* n
if (!rgn->is_Region()) { // create a region to guard the call
assert(rgn->is_Call(), "must be call uct");
CallNode* call = rgn->as_Call();
- rgn = new (C) RegionNode(1);
+ rgn = new RegionNode(1);
register_new_node_with_optimizer(rgn);
rgn->add_req(uncommon_proj);
hash_delete(call);
@@ -208,8 +208,8 @@ ProjNode* PhaseIterGVN::create_new_if_for_predicate(ProjNode* cont_proj, Node* n
new_iff->set_req(0, new_entry);
register_new_node_with_optimizer(new_iff);
- Node *if_cont = new (C) IfTrueNode(new_iff);
- Node *if_uct = new (C) IfFalseNode(new_iff);
+ Node *if_cont = new IfTrueNode(new_iff);
+ Node *if_uct = new IfFalseNode(new_iff);
if (cont_proj->is_IfFalse()) {
// Swap
Node* tmp = if_uct; if_uct = if_cont; if_cont = tmp;
@@ -254,10 +254,10 @@ ProjNode* PhaseIdealLoop::clone_predicate(ProjNode* predicate_proj, Node* new_en
// Match original condition since predicate's projections could be swapped.
assert(predicate_proj->in(0)->in(1)->in(1)->Opcode()==Op_Opaque1, "must be");
- Node* opq = new (igvn->C) Opaque1Node(igvn->C, predicate_proj->in(0)->in(1)->in(1)->in(1));
+ Node* opq = new Opaque1Node(igvn->C, predicate_proj->in(0)->in(1)->in(1)->in(1));
igvn->C->add_predicate_opaq(opq);
- Node* bol = new (igvn->C) Conv2BNode(opq);
+ Node* bol = new Conv2BNode(opq);
if (loop_phase != NULL) {
loop_phase->register_new_node(opq, ctrl);
loop_phase->register_new_node(bol, ctrl);
@@ -605,11 +605,11 @@ BoolNode* PhaseIdealLoop::rc_predicate(IdealLoopTree *loop, Node* ctrl,
// Calculate exact limit here.
// Note, counted loop's test is '<' or '>'.
limit = exact_limit(loop);
- max_idx_expr = new (C) SubINode(limit, stride);
+ max_idx_expr = new SubINode(limit, stride);
register_new_node(max_idx_expr, ctrl);
if (TraceLoopPredicate) predString->print("(limit - stride) ");
} else {
- max_idx_expr = new (C) SubINode(limit, stride);
+ max_idx_expr = new SubINode(limit, stride);
register_new_node(max_idx_expr, ctrl);
if (TraceLoopPredicate) predString->print("(limit - stride) ");
}
@@ -619,22 +619,22 @@ BoolNode* PhaseIdealLoop::rc_predicate(IdealLoopTree *loop, Node* ctrl,
if (scale != 1) {
ConNode* con_scale = _igvn.intcon(scale);
- max_idx_expr = new (C) MulINode(max_idx_expr, con_scale);
+ max_idx_expr = new MulINode(max_idx_expr, con_scale);
register_new_node(max_idx_expr, ctrl);
if (TraceLoopPredicate) predString->print("* %d ", scale);
}
if (offset && (!offset->is_Con() || offset->get_int() != 0)){
- max_idx_expr = new (C) AddINode(max_idx_expr, offset);
+ max_idx_expr = new AddINode(max_idx_expr, offset);
register_new_node(max_idx_expr, ctrl);
if (TraceLoopPredicate)
if (offset->is_Con()) predString->print("+ %d ", offset->get_int());
else predString->print("+ offset ");
}
- CmpUNode* cmp = new (C) CmpUNode(max_idx_expr, range);
+ CmpUNode* cmp = new CmpUNode(max_idx_expr, range);
register_new_node(cmp, ctrl);
- BoolNode* bol = new (C) BoolNode(cmp, BoolTest::lt);
+ BoolNode* bol = new BoolNode(cmp, BoolTest::lt);
register_new_node(bol, ctrl);
if (TraceLoopPredicate) {
@@ -750,7 +750,7 @@ bool PhaseIdealLoop::loop_predication_impl(IdealLoopTree *loop) {
// Negate test if necessary
bool negated = false;
if (proj->_con != predicate_proj->_con) {
- new_predicate_bol = new (C) BoolNode(new_predicate_bol->in(1), new_predicate_bol->_test.negate());
+ new_predicate_bol = new BoolNode(new_predicate_bol->in(1), new_predicate_bol->_test.negate());
register_new_node(new_predicate_bol, ctrl);
negated = true;
}
diff --git a/hotspot/src/share/vm/opto/loopTransform.cpp b/hotspot/src/share/vm/opto/loopTransform.cpp
index 0893981abac..73ec0617370 100644
--- a/hotspot/src/share/vm/opto/loopTransform.cpp
+++ b/hotspot/src/share/vm/opto/loopTransform.cpp
@@ -227,24 +227,24 @@ Node* IdealLoopTree::reassociate_add_sub(Node* n1, PhaseIdealLoop *phase) {
if (neg_inv1) {
Node *zero = phase->_igvn.intcon(0);
phase->set_ctrl(zero, phase->C->root());
- n_inv1 = new (phase->C) SubINode(zero, inv1);
+ n_inv1 = new SubINode(zero, inv1);
phase->register_new_node(n_inv1, inv1_c);
} else {
n_inv1 = inv1;
}
Node* inv;
if (neg_inv2) {
- inv = new (phase->C) SubINode(n_inv1, inv2);
+ inv = new SubINode(n_inv1, inv2);
} else {
- inv = new (phase->C) AddINode(n_inv1, inv2);
+ inv = new AddINode(n_inv1, inv2);
}
phase->register_new_node(inv, phase->get_early_ctrl(inv));
Node* addx;
if (neg_x) {
- addx = new (phase->C) SubINode(inv, x);
+ addx = new SubINode(inv, x);
} else {
- addx = new (phase->C) AddINode(x, inv);
+ addx = new AddINode(x, inv);
}
phase->register_new_node(addx, phase->get_ctrl(x));
phase->_igvn.replace_node(n1, addx);
@@ -953,7 +953,7 @@ void PhaseIdealLoop::insert_pre_post_loops( IdealLoopTree *loop, Node_List &old_
post_end->_prob = PROB_FAIR;
// Build the main-loop normal exit.
- IfFalseNode *new_main_exit = new (C) IfFalseNode(main_end);
+ IfFalseNode *new_main_exit = new IfFalseNode(main_end);
_igvn.register_new_node_with_optimizer( new_main_exit );
set_idom(new_main_exit, main_end, dd_main_exit );
set_loop(new_main_exit, loop->_parent);
@@ -963,15 +963,15 @@ void PhaseIdealLoop::insert_pre_post_loops( IdealLoopTree *loop, Node_List &old_
// (the main-loop trip-counter exit value) because we will be changing
// the exit value (via unrolling) so we cannot constant-fold away the zero
// trip guard until all unrolling is done.
- Node *zer_opaq = new (C) Opaque1Node(C, incr);
- Node *zer_cmp = new (C) CmpINode( zer_opaq, limit );
- Node *zer_bol = new (C) BoolNode( zer_cmp, b_test );
+ Node *zer_opaq = new Opaque1Node(C, incr);
+ Node *zer_cmp = new CmpINode( zer_opaq, limit );
+ Node *zer_bol = new BoolNode( zer_cmp, b_test );
register_new_node( zer_opaq, new_main_exit );
register_new_node( zer_cmp , new_main_exit );
register_new_node( zer_bol , new_main_exit );
// Build the IfNode
- IfNode *zer_iff = new (C) IfNode( new_main_exit, zer_bol, PROB_FAIR, COUNT_UNKNOWN );
+ IfNode *zer_iff = new IfNode( new_main_exit, zer_bol, PROB_FAIR, COUNT_UNKNOWN );
_igvn.register_new_node_with_optimizer( zer_iff );
set_idom(zer_iff, new_main_exit, dd_main_exit);
set_loop(zer_iff, loop->_parent);
@@ -981,7 +981,7 @@ void PhaseIdealLoop::insert_pre_post_loops( IdealLoopTree *loop, Node_List &old_
set_idom(main_exit, zer_iff, dd_main_exit);
set_idom(main_exit->unique_out(), zer_iff, dd_main_exit);
// Make the true-path, must enter the post loop
- Node *zer_taken = new (C) IfTrueNode( zer_iff );
+ Node *zer_taken = new IfTrueNode( zer_iff );
_igvn.register_new_node_with_optimizer( zer_taken );
set_idom(zer_taken, zer_iff, dd_main_exit);
set_loop(zer_taken, loop->_parent);
@@ -1029,7 +1029,7 @@ void PhaseIdealLoop::insert_pre_post_loops( IdealLoopTree *loop, Node_List &old_
// Find the pre-loop normal exit.
Node* pre_exit = pre_end->proj_out(false);
assert( pre_exit->Opcode() == Op_IfFalse, "" );
- IfFalseNode *new_pre_exit = new (C) IfFalseNode(pre_end);
+ IfFalseNode *new_pre_exit = new IfFalseNode(pre_end);
_igvn.register_new_node_with_optimizer( new_pre_exit );
set_idom(new_pre_exit, pre_end, dd_main_head);
set_loop(new_pre_exit, loop->_parent);
@@ -1038,15 +1038,15 @@ void PhaseIdealLoop::insert_pre_post_loops( IdealLoopTree *loop, Node_List &old_
// pre-loop, the main-loop may not execute at all. Later in life this
// zero-trip guard will become the minimum-trip guard when we unroll
// the main-loop.
- Node *min_opaq = new (C) Opaque1Node(C, limit);
- Node *min_cmp = new (C) CmpINode( pre_incr, min_opaq );
- Node *min_bol = new (C) BoolNode( min_cmp, b_test );
+ Node *min_opaq = new Opaque1Node(C, limit);
+ Node *min_cmp = new CmpINode( pre_incr, min_opaq );
+ Node *min_bol = new BoolNode( min_cmp, b_test );
register_new_node( min_opaq, new_pre_exit );
register_new_node( min_cmp , new_pre_exit );
register_new_node( min_bol , new_pre_exit );
// Build the IfNode (assume the main-loop is executed always).
- IfNode *min_iff = new (C) IfNode( new_pre_exit, min_bol, PROB_ALWAYS, COUNT_UNKNOWN );
+ IfNode *min_iff = new IfNode( new_pre_exit, min_bol, PROB_ALWAYS, COUNT_UNKNOWN );
_igvn.register_new_node_with_optimizer( min_iff );
set_idom(min_iff, new_pre_exit, dd_main_head);
set_loop(min_iff, loop->_parent);
@@ -1057,7 +1057,7 @@ void PhaseIdealLoop::insert_pre_post_loops( IdealLoopTree *loop, Node_List &old_
set_idom(pre_exit, min_iff, dd_main_head);
set_idom(pre_exit->unique_out(), min_iff, dd_main_head);
// Make the true-path, must enter the main loop
- Node *min_taken = new (C) IfTrueNode( min_iff );
+ Node *min_taken = new IfTrueNode( min_iff );
_igvn.register_new_node_with_optimizer( min_taken );
set_idom(min_taken, min_iff, dd_main_head);
set_loop(min_taken, loop->_parent);
@@ -1087,11 +1087,11 @@ void PhaseIdealLoop::insert_pre_post_loops( IdealLoopTree *loop, Node_List &old_
// RCE and alignment may change this later.
Node *cmp_end = pre_end->cmp_node();
assert( cmp_end->in(2) == limit, "" );
- Node *pre_limit = new (C) AddINode( init, stride );
+ Node *pre_limit = new AddINode( init, stride );
// Save the original loop limit in this Opaque1 node for
// use by range check elimination.
- Node *pre_opaq = new (C) Opaque1Node(C, pre_limit, limit);
+ Node *pre_opaq = new Opaque1Node(C, pre_limit, limit);
register_new_node( pre_limit, pre_head->in(0) );
register_new_node( pre_opaq , pre_head->in(0) );
@@ -1116,19 +1116,19 @@ void PhaseIdealLoop::insert_pre_post_loops( IdealLoopTree *loop, Node_List &old_
BoolTest::mask new_test = (main_end->stride_con() > 0) ? BoolTest::lt : BoolTest::gt;
// Modify pre loop end condition
Node* pre_bol = pre_end->in(CountedLoopEndNode::TestValue)->as_Bool();
- BoolNode* new_bol0 = new (C) BoolNode(pre_bol->in(1), new_test);
+ BoolNode* new_bol0 = new BoolNode(pre_bol->in(1), new_test);
register_new_node( new_bol0, pre_head->in(0) );
_igvn.hash_delete(pre_end);
pre_end->set_req(CountedLoopEndNode::TestValue, new_bol0);
// Modify main loop guard condition
assert(min_iff->in(CountedLoopEndNode::TestValue) == min_bol, "guard okay");
- BoolNode* new_bol1 = new (C) BoolNode(min_bol->in(1), new_test);
+ BoolNode* new_bol1 = new BoolNode(min_bol->in(1), new_test);
register_new_node( new_bol1, new_pre_exit );
_igvn.hash_delete(min_iff);
min_iff->set_req(CountedLoopEndNode::TestValue, new_bol1);
// Modify main loop end condition
BoolNode* main_bol = main_end->in(CountedLoopEndNode::TestValue)->as_Bool();
- BoolNode* new_bol2 = new (C) BoolNode(main_bol->in(1), new_test);
+ BoolNode* new_bol2 = new BoolNode(main_bol->in(1), new_test);
register_new_node( new_bol2, main_end->in(CountedLoopEndNode::TestControl) );
_igvn.hash_delete(main_end);
main_end->set_req(CountedLoopEndNode::TestValue, new_bol2);
@@ -1279,13 +1279,13 @@ void PhaseIdealLoop::do_unroll( IdealLoopTree *loop, Node_List &old_new, bool ad
// zero trip guard limit will be different from loop limit.
assert(has_ctrl(opaq), "should have it");
Node* opaq_ctrl = get_ctrl(opaq);
- limit = new (C) Opaque2Node( C, limit );
+ limit = new Opaque2Node( C, limit );
register_new_node( limit, opaq_ctrl );
}
if (stride_con > 0 && ((limit_type->_lo - stride_con) < limit_type->_lo) ||
stride_con < 0 && ((limit_type->_hi - stride_con) > limit_type->_hi)) {
// No underflow.
- new_limit = new (C) SubINode(limit, stride);
+ new_limit = new SubINode(limit, stride);
} else {
// (limit - stride) may underflow.
// Clamp the adjustment value with MININT or MAXINT:
@@ -1315,18 +1315,18 @@ void PhaseIdealLoop::do_unroll( IdealLoopTree *loop, Node_List &old_new, bool ad
old_limit = bol->in(1)->in(1);
// Adjust previous adjusted limit.
adj_limit = limit->in(CMoveNode::IfFalse);
- adj_limit = new (C) SubINode(adj_limit, stride);
+ adj_limit = new SubINode(adj_limit, stride);
} else {
old_limit = limit;
- adj_limit = new (C) SubINode(limit, stride);
+ adj_limit = new SubINode(limit, stride);
}
assert(old_limit != NULL && adj_limit != NULL, "");
register_new_node( adj_limit, ctrl ); // adjust amount
- Node* adj_cmp = new (C) CmpINode(old_limit, adj_limit);
+ Node* adj_cmp = new CmpINode(old_limit, adj_limit);
register_new_node( adj_cmp, ctrl );
- Node* adj_bool = new (C) BoolNode(adj_cmp, bt);
+ Node* adj_bool = new BoolNode(adj_cmp, bt);
register_new_node( adj_bool, ctrl );
- new_limit = new (C) CMoveINode(adj_bool, adj_limit, adj_max, TypeInt::INT);
+ new_limit = new CMoveINode(adj_bool, adj_limit, adj_max, TypeInt::INT);
}
register_new_node(new_limit, ctrl);
}
@@ -1388,24 +1388,24 @@ void PhaseIdealLoop::do_unroll( IdealLoopTree *loop, Node_List &old_new, bool ad
// CountedLoop this is exact (stride divides limit-init exactly).
// We are going to double the loop body, so we want to knock off any
// odd iteration: (trip_cnt & ~1). Then back compute a new limit.
- Node *span = new (C) SubINode( limit, init );
+ Node *span = new SubINode( limit, init );
register_new_node( span, ctrl );
- Node *trip = new (C) DivINode( 0, span, stride );
+ Node *trip = new DivINode( 0, span, stride );
register_new_node( trip, ctrl );
Node *mtwo = _igvn.intcon(-2);
set_ctrl(mtwo, C->root());
- Node *rond = new (C) AndINode( trip, mtwo );
+ Node *rond = new AndINode( trip, mtwo );
register_new_node( rond, ctrl );
- Node *spn2 = new (C) MulINode( rond, stride );
+ Node *spn2 = new MulINode( rond, stride );
register_new_node( spn2, ctrl );
- new_limit = new (C) AddINode( spn2, init );
+ new_limit = new AddINode( spn2, init );
register_new_node( new_limit, ctrl );
// Hammer in the new limit
Node *ctrl2 = loop_end->in(0);
- Node *cmp2 = new (C) CmpINode( loop_head->incr(), new_limit );
+ Node *cmp2 = new CmpINode( loop_head->incr(), new_limit );
register_new_node( cmp2, ctrl2 );
- Node *bol2 = new (C) BoolNode( cmp2, loop_end->test_trip() );
+ Node *bol2 = new BoolNode( cmp2, loop_end->test_trip() );
register_new_node( bol2, ctrl2 );
_igvn.hash_delete(loop_end);
loop_end->set_req(CountedLoopEndNode::TestValue, bol2);
@@ -1511,15 +1511,15 @@ bool IdealLoopTree::dominates_backedge(Node* ctrl) {
// Helper function for add_constraint().
Node* PhaseIdealLoop::adjust_limit(int stride_con, Node * scale, Node *offset, Node *rc_limit, Node *loop_limit, Node *pre_ctrl) {
// Compute "I :: (limit-offset)/scale"
- Node *con = new (C) SubINode(rc_limit, offset);
+ Node *con = new SubINode(rc_limit, offset);
register_new_node(con, pre_ctrl);
- Node *X = new (C) DivINode(0, con, scale);
+ Node *X = new DivINode(0, con, scale);
register_new_node(X, pre_ctrl);
// Adjust loop limit
loop_limit = (stride_con > 0)
- ? (Node*)(new (C) MinINode(loop_limit, X))
- : (Node*)(new (C) MaxINode(loop_limit, X));
+ ? (Node*)(new MinINode(loop_limit, X))
+ : (Node*)(new MaxINode(loop_limit, X));
register_new_node(loop_limit, pre_ctrl);
return loop_limit;
}
@@ -1580,9 +1580,9 @@ void PhaseIdealLoop::add_constraint( int stride_con, int scale_con, Node *offset
// to avoid problem with scale == -1 (min_int/(-1) == min_int).
Node* shift = _igvn.intcon(31);
set_ctrl(shift, C->root());
- Node* sign = new (C) RShiftINode(offset, shift);
+ Node* sign = new RShiftINode(offset, shift);
register_new_node(sign, pre_ctrl);
- offset = new (C) AndINode(offset, sign);
+ offset = new AndINode(offset, sign);
register_new_node(offset, pre_ctrl);
} else {
assert(low_limit->get_int() == 0, "wrong low limit for range check");
@@ -1615,7 +1615,7 @@ void PhaseIdealLoop::add_constraint( int stride_con, int scale_con, Node *offset
Node *one = _igvn.intcon(1);
set_ctrl(one, C->root());
- Node *plus_one = new (C) AddINode(offset, one);
+ Node *plus_one = new AddINode(offset, one);
register_new_node( plus_one, pre_ctrl );
// Pass (-stride) to indicate pre_loop_cond = NOT(main_loop_cond);
*pre_limit = adjust_limit((-stride_con), scale, plus_one, upper_limit, *pre_limit, pre_ctrl);
@@ -1633,9 +1633,9 @@ void PhaseIdealLoop::add_constraint( int stride_con, int scale_con, Node *offset
// to avoid problem with scale == -1 (min_int/(-1) == min_int).
Node* shift = _igvn.intcon(31);
set_ctrl(shift, C->root());
- Node* sign = new (C) RShiftINode(plus_one, shift);
+ Node* sign = new RShiftINode(plus_one, shift);
register_new_node(sign, pre_ctrl);
- plus_one = new (C) AndINode(plus_one, sign);
+ plus_one = new AndINode(plus_one, sign);
register_new_node(plus_one, pre_ctrl);
} else {
assert(low_limit->get_int() == 0, "wrong low limit for range check");
@@ -1718,7 +1718,7 @@ bool PhaseIdealLoop::is_scaled_iv_plus_offset(Node* exp, Node* iv, int* p_scale,
p_offset != NULL ? &offset2 : NULL, depth+1)) {
if (p_offset != NULL) {
Node *ctrl_off2 = get_ctrl(offset2);
- Node* offset = new (C) AddINode(offset2, exp->in(2));
+ Node* offset = new AddINode(offset2, exp->in(2));
register_new_node(offset, ctrl_off2);
*p_offset = offset;
}
@@ -1731,7 +1731,7 @@ bool PhaseIdealLoop::is_scaled_iv_plus_offset(Node* exp, Node* iv, int* p_scale,
Node *zero = _igvn.intcon(0);
set_ctrl(zero, C->root());
Node *ctrl_off = get_ctrl(exp->in(2));
- Node* offset = new (C) SubINode(zero, exp->in(2));
+ Node* offset = new SubINode(zero, exp->in(2));
register_new_node(offset, ctrl_off);
*p_offset = offset;
}
@@ -1934,15 +1934,15 @@ void PhaseIdealLoop::do_range_check( IdealLoopTree *loop, Node_List &old_new ) {
case BoolTest::ge:
// Convert (I*scale+offset) >= Limit to (I*(-scale)+(-offset)) <= -Limit
scale_con = -scale_con;
- offset = new (C) SubINode( zero, offset );
+ offset = new SubINode( zero, offset );
register_new_node( offset, pre_ctrl );
- limit = new (C) SubINode( zero, limit );
+ limit = new SubINode( zero, limit );
register_new_node( limit, pre_ctrl );
// Fall into LE case
case BoolTest::le:
if (b_test._test != BoolTest::gt) {
// Convert X <= Y to X < Y+1
- limit = new (C) AddINode( limit, one );
+ limit = new AddINode( limit, one );
register_new_node( limit, pre_ctrl );
}
// Fall into LT case
@@ -1993,8 +1993,8 @@ void PhaseIdealLoop::do_range_check( IdealLoopTree *loop, Node_List &old_new ) {
// Update loop limits
if (conditional_rc) {
- pre_limit = (stride_con > 0) ? (Node*)new (C) MinINode(pre_limit, orig_limit)
- : (Node*)new (C) MaxINode(pre_limit, orig_limit);
+ pre_limit = (stride_con > 0) ? (Node*)new MinINode(pre_limit, orig_limit)
+ : (Node*)new MaxINode(pre_limit, orig_limit);
register_new_node(pre_limit, pre_ctrl);
}
_igvn.hash_delete(pre_opaq);
@@ -2009,16 +2009,16 @@ void PhaseIdealLoop::do_range_check( IdealLoopTree *loop, Node_List &old_new ) {
Node *ctrl = get_ctrl(main_limit);
Node *stride = cl->stride();
Node *init = cl->init_trip();
- Node *span = new (C) SubINode(main_limit,init);
+ Node *span = new SubINode(main_limit,init);
register_new_node(span,ctrl);
Node *rndup = _igvn.intcon(stride_con + ((stride_con>0)?-1:1));
- Node *add = new (C) AddINode(span,rndup);
+ Node *add = new AddINode(span,rndup);
register_new_node(add,ctrl);
- Node *div = new (C) DivINode(0,add,stride);
+ Node *div = new DivINode(0,add,stride);
register_new_node(div,ctrl);
- Node *mul = new (C) MulINode(div,stride);
+ Node *mul = new MulINode(div,stride);
register_new_node(mul,ctrl);
- Node *newlim = new (C) AddINode(mul,init);
+ Node *newlim = new AddINode(mul,init);
register_new_node(newlim,ctrl);
main_limit = newlim;
}
@@ -2189,7 +2189,7 @@ bool IdealLoopTree::policy_do_remove_empty_loop( PhaseIdealLoop *phase ) {
}
// Note: the final value after increment should not overflow since
// counted loop has limit check predicate.
- Node *final = new (phase->C) SubINode( exact_limit, cl->stride() );
+ Node *final = new SubINode( exact_limit, cl->stride() );
phase->register_new_node(final,cl->in(LoopNode::EntryControl));
phase->_igvn.replace_node(phi,final);
phase->C->set_major_progress();
@@ -2676,20 +2676,20 @@ bool PhaseIdealLoop::intrinsify_fill(IdealLoopTree* lpt) {
// Build an expression for the beginning of the copy region
Node* index = head->init_trip();
#ifdef _LP64
- index = new (C) ConvI2LNode(index);
+ index = new ConvI2LNode(index);
_igvn.register_new_node_with_optimizer(index);
#endif
if (shift != NULL) {
// byte arrays don't require a shift but others do.
- index = new (C) LShiftXNode(index, shift->in(2));
+ index = new LShiftXNode(index, shift->in(2));
_igvn.register_new_node_with_optimizer(index);
}
- index = new (C) AddPNode(base, base, index);
+ index = new AddPNode(base, base, index);
_igvn.register_new_node_with_optimizer(index);
- Node* from = new (C) AddPNode(base, index, offset);
+ Node* from = new AddPNode(base, index, offset);
_igvn.register_new_node_with_optimizer(from);
// Compute the number of elements to copy
- Node* len = new (C) SubINode(head->limit(), head->init_trip());
+ Node* len = new SubINode(head->limit(), head->init_trip());
_igvn.register_new_node_with_optimizer(len);
BasicType t = store->as_Mem()->memory_type();
@@ -2706,17 +2706,17 @@ bool PhaseIdealLoop::intrinsify_fill(IdealLoopTree* lpt) {
// Convert float/double to int/long for fill routines
if (t == T_FLOAT) {
- store_value = new (C) MoveF2INode(store_value);
+ store_value = new MoveF2INode(store_value);
_igvn.register_new_node_with_optimizer(store_value);
} else if (t == T_DOUBLE) {
- store_value = new (C) MoveD2LNode(store_value);
+ store_value = new MoveD2LNode(store_value);
_igvn.register_new_node_with_optimizer(store_value);
}
if (CCallingConventionRequiresIntsAsLongs &&
// See StubRoutines::select_fill_function for types. FLOAT has been converted to INT.
(t == T_FLOAT || t == T_INT || is_subword_type(t))) {
- store_value = new (C) ConvI2LNode(store_value);
+ store_value = new ConvI2LNode(store_value);
_igvn.register_new_node_with_optimizer(store_value);
}
@@ -2724,8 +2724,8 @@ bool PhaseIdealLoop::intrinsify_fill(IdealLoopTree* lpt) {
Node* result_ctrl;
Node* result_mem;
const TypeFunc* call_type = OptoRuntime::array_fill_Type();
- CallLeafNode *call = new (C) CallLeafNoFPNode(call_type, fill,
- fill_name, TypeAryPtr::get_array_body_type(t));
+ CallLeafNode *call = new CallLeafNoFPNode(call_type, fill,
+ fill_name, TypeAryPtr::get_array_body_type(t));
uint cnt = 0;
call->init_req(TypeFunc::Parms + cnt++, from);
call->init_req(TypeFunc::Parms + cnt++, store_value);
@@ -2733,7 +2733,7 @@ bool PhaseIdealLoop::intrinsify_fill(IdealLoopTree* lpt) {
call->init_req(TypeFunc::Parms + cnt++, C->top());
}
#ifdef _LP64
- len = new (C) ConvI2LNode(len);
+ len = new ConvI2LNode(len);
_igvn.register_new_node_with_optimizer(len);
#endif
call->init_req(TypeFunc::Parms + cnt++, len);
@@ -2746,9 +2746,9 @@ bool PhaseIdealLoop::intrinsify_fill(IdealLoopTree* lpt) {
call->init_req(TypeFunc::ReturnAdr, C->start()->proj_out(TypeFunc::ReturnAdr));
call->init_req(TypeFunc::FramePtr, C->start()->proj_out(TypeFunc::FramePtr));
_igvn.register_new_node_with_optimizer(call);
- result_ctrl = new (C) ProjNode(call,TypeFunc::Control);
+ result_ctrl = new ProjNode(call,TypeFunc::Control);
_igvn.register_new_node_with_optimizer(result_ctrl);
- result_mem = new (C) ProjNode(call,TypeFunc::Memory);
+ result_mem = new ProjNode(call,TypeFunc::Memory);
_igvn.register_new_node_with_optimizer(result_mem);
/* Disable following optimization until proper fix (add missing checks).
diff --git a/hotspot/src/share/vm/opto/loopUnswitch.cpp b/hotspot/src/share/vm/opto/loopUnswitch.cpp
index 06e17664efe..43f2008f2aa 100644
--- a/hotspot/src/share/vm/opto/loopUnswitch.cpp
+++ b/hotspot/src/share/vm/opto/loopUnswitch.cpp
@@ -225,15 +225,15 @@ ProjNode* PhaseIdealLoop::create_slow_version_of_loop(IdealLoopTree *loop,
Node *cont = _igvn.intcon(1);
set_ctrl(cont, C->root());
- Node* opq = new (C) Opaque1Node(C, cont);
+ Node* opq = new Opaque1Node(C, cont);
register_node(opq, outer_loop, entry, dom_depth(entry));
- Node *bol = new (C) Conv2BNode(opq);
+ Node *bol = new Conv2BNode(opq);
register_node(bol, outer_loop, entry, dom_depth(entry));
- IfNode* iff = new (C) IfNode(entry, bol, PROB_MAX, COUNT_UNKNOWN);
+ IfNode* iff = new IfNode(entry, bol, PROB_MAX, COUNT_UNKNOWN);
register_node(iff, outer_loop, entry, dom_depth(entry));
- ProjNode* iffast = new (C) IfTrueNode(iff);
+ ProjNode* iffast = new IfTrueNode(iff);
register_node(iffast, outer_loop, iff, dom_depth(iff));
- ProjNode* ifslow = new (C) IfFalseNode(iff);
+ ProjNode* ifslow = new IfFalseNode(iff);
register_node(ifslow, outer_loop, iff, dom_depth(iff));
// Clone the loop body. The clone becomes the fast loop. The
diff --git a/hotspot/src/share/vm/opto/loopnode.cpp b/hotspot/src/share/vm/opto/loopnode.cpp
index f11583a25b2..5ee44d084bd 100644
--- a/hotspot/src/share/vm/opto/loopnode.cpp
+++ b/hotspot/src/share/vm/opto/loopnode.cpp
@@ -443,7 +443,7 @@ bool PhaseIdealLoop::is_counted_loop( Node *x, IdealLoopTree *loop ) {
assert(x->Opcode() == Op_Loop, "regular loops only");
C->print_method(PHASE_BEFORE_CLOOPS, 3);
- Node *hook = new (C) Node(6);
+ Node *hook = new Node(6);
if (LoopLimitCheck) {
@@ -506,11 +506,11 @@ bool PhaseIdealLoop::is_counted_loop( Node *x, IdealLoopTree *loop ) {
Node* bol;
if (stride_con > 0) {
- cmp_limit = new (C) CmpINode(limit, _igvn.intcon(max_jint - stride_m));
- bol = new (C) BoolNode(cmp_limit, BoolTest::le);
+ cmp_limit = new CmpINode(limit, _igvn.intcon(max_jint - stride_m));
+ bol = new BoolNode(cmp_limit, BoolTest::le);
} else {
- cmp_limit = new (C) CmpINode(limit, _igvn.intcon(min_jint - stride_m));
- bol = new (C) BoolNode(cmp_limit, BoolTest::ge);
+ cmp_limit = new CmpINode(limit, _igvn.intcon(min_jint - stride_m));
+ bol = new BoolNode(cmp_limit, BoolTest::ge);
}
cmp_limit = _igvn.register_new_node_with_optimizer(cmp_limit);
bol = _igvn.register_new_node_with_optimizer(bol);
@@ -547,7 +547,7 @@ bool PhaseIdealLoop::is_counted_loop( Node *x, IdealLoopTree *loop ) {
// is converted to
// i = init; do {} while(++i < limit+1);
//
- limit = gvn->transform(new (C) AddINode(limit, stride));
+ limit = gvn->transform(new AddINode(limit, stride));
}
// Now we need to canonicalize loop condition.
@@ -566,7 +566,7 @@ bool PhaseIdealLoop::is_counted_loop( Node *x, IdealLoopTree *loop ) {
// we can convert 'i <= limit' to 'i < limit+1' since stride != 0.
//
Node* one = (stride_con > 0) ? gvn->intcon( 1) : gvn->intcon(-1);
- limit = gvn->transform(new (C) AddINode(limit, one));
+ limit = gvn->transform(new AddINode(limit, one));
if (bt == BoolTest::le)
bt = BoolTest::lt;
else if (bt == BoolTest::ge)
@@ -582,7 +582,7 @@ bool PhaseIdealLoop::is_counted_loop( Node *x, IdealLoopTree *loop ) {
// can directly point to the phi; in this case adjust the compare so that
// it points to the incr by adjusting the limit.
if (cmp->in(1) == phi || cmp->in(2) == phi)
- limit = gvn->transform(new (C) AddINode(limit,stride));
+ limit = gvn->transform(new AddINode(limit,stride));
// trip-count for +-tive stride should be: (limit - init_trip + stride - 1)/stride.
// Final value for iterator should be: trip_count * stride + init_trip.
@@ -595,16 +595,16 @@ bool PhaseIdealLoop::is_counted_loop( Node *x, IdealLoopTree *loop ) {
ShouldNotReachHere();
case BoolTest::ne: // Ahh, the case we desire
if (stride_con == 1)
- trip_count = gvn->transform(new (C) SubINode(limit,init_trip));
+ trip_count = gvn->transform(new SubINode(limit,init_trip));
else if (stride_con == -1)
- trip_count = gvn->transform(new (C) SubINode(init_trip,limit));
+ trip_count = gvn->transform(new SubINode(init_trip,limit));
else
ShouldNotReachHere();
set_subtree_ctrl(trip_count);
//_loop.map(trip_count->_idx,loop(limit));
break;
case BoolTest::le: // Maybe convert to '<' case
- limit = gvn->transform(new (C) AddINode(limit,one_p));
+ limit = gvn->transform(new AddINode(limit,one_p));
set_subtree_ctrl( limit );
hook->init_req(4, limit);
@@ -615,26 +615,26 @@ bool PhaseIdealLoop::is_counted_loop( Node *x, IdealLoopTree *loop ) {
case BoolTest::lt: { // Maybe convert to '!=' case
if (stride_con < 0) // Count down loop rolls through MAXINT
ShouldNotReachHere();
- Node *range = gvn->transform(new (C) SubINode(limit,init_trip));
+ Node *range = gvn->transform(new SubINode(limit,init_trip));
set_subtree_ctrl( range );
hook->init_req(0, range);
- Node *bias = gvn->transform(new (C) AddINode(range,stride));
+ Node *bias = gvn->transform(new AddINode(range,stride));
set_subtree_ctrl( bias );
hook->init_req(1, bias);
- Node *bias1 = gvn->transform(new (C) AddINode(bias,one_m));
+ Node *bias1 = gvn->transform(new AddINode(bias,one_m));
set_subtree_ctrl( bias1 );
hook->init_req(2, bias1);
- trip_count = gvn->transform(new (C) DivINode(0,bias1,stride));
+ trip_count = gvn->transform(new DivINode(0,bias1,stride));
set_subtree_ctrl( trip_count );
hook->init_req(3, trip_count);
break;
}
case BoolTest::ge: // Maybe convert to '>' case
- limit = gvn->transform(new (C) AddINode(limit,one_m));
+ limit = gvn->transform(new AddINode(limit,one_m));
set_subtree_ctrl( limit );
hook->init_req(4 ,limit);
@@ -645,30 +645,30 @@ bool PhaseIdealLoop::is_counted_loop( Node *x, IdealLoopTree *loop ) {
case BoolTest::gt: { // Maybe convert to '!=' case
if (stride_con > 0) // count up loop rolls through MININT
ShouldNotReachHere();
- Node *range = gvn->transform(new (C) SubINode(limit,init_trip));
+ Node *range = gvn->transform(new SubINode(limit,init_trip));
set_subtree_ctrl( range );
hook->init_req(0, range);
- Node *bias = gvn->transform(new (C) AddINode(range,stride));
+ Node *bias = gvn->transform(new AddINode(range,stride));
set_subtree_ctrl( bias );
hook->init_req(1, bias);
- Node *bias1 = gvn->transform(new (C) AddINode(bias,one_p));
+ Node *bias1 = gvn->transform(new AddINode(bias,one_p));
set_subtree_ctrl( bias1 );
hook->init_req(2, bias1);
- trip_count = gvn->transform(new (C) DivINode(0,bias1,stride));
+ trip_count = gvn->transform(new DivINode(0,bias1,stride));
set_subtree_ctrl( trip_count );
hook->init_req(3, trip_count);
break;
}
} // switch( bt )
- Node *span = gvn->transform(new (C) MulINode(trip_count,stride));
+ Node *span = gvn->transform(new MulINode(trip_count,stride));
set_subtree_ctrl( span );
hook->init_req(5, span);
- limit = gvn->transform(new (C) AddINode(span,init_trip));
+ limit = gvn->transform(new AddINode(span,init_trip));
set_subtree_ctrl( limit );
} // LoopLimitCheck
@@ -717,7 +717,7 @@ bool PhaseIdealLoop::is_counted_loop( Node *x, IdealLoopTree *loop ) {
set_ctrl(test, iff->in(0));
// Replace the old IfNode with a new LoopEndNode
- Node *lex = _igvn.register_new_node_with_optimizer(new (C) CountedLoopEndNode( iff->in(0), test, cl_prob, iff->as_If()->_fcnt ));
+ Node *lex = _igvn.register_new_node_with_optimizer(new CountedLoopEndNode( iff->in(0), test, cl_prob, iff->as_If()->_fcnt ));
IfNode *le = lex->as_If();
uint dd = dom_depth(iff);
set_idom(le, le->in(0), dd); // Update dominance for loop exit
@@ -728,8 +728,8 @@ bool PhaseIdealLoop::is_counted_loop( Node *x, IdealLoopTree *loop ) {
// Need to swap loop-exit and loop-back control?
if (iftrue_op == Op_IfFalse) {
- Node *ift2=_igvn.register_new_node_with_optimizer(new (C) IfTrueNode (le));
- Node *iff2=_igvn.register_new_node_with_optimizer(new (C) IfFalseNode(le));
+ Node *ift2=_igvn.register_new_node_with_optimizer(new IfTrueNode (le));
+ Node *iff2=_igvn.register_new_node_with_optimizer(new IfFalseNode(le));
loop->_tail = back_control = ift2;
set_loop(ift2, loop);
@@ -755,7 +755,7 @@ bool PhaseIdealLoop::is_counted_loop( Node *x, IdealLoopTree *loop ) {
lazy_replace( iff, le ); // fix 'get_ctrl'
// Now setup a new CountedLoopNode to replace the existing LoopNode
- CountedLoopNode *l = new (C) CountedLoopNode(init_control, back_control);
+ CountedLoopNode *l = new CountedLoopNode(init_control, back_control);
l->set_unswitch_count(x->as_Loop()->unswitch_count()); // Preserve
// The following assert is approximately true, and defines the intention
// of can_be_counted_loop. It fails, however, because phase->type
@@ -829,7 +829,7 @@ Node* PhaseIdealLoop::exact_limit( IdealLoopTree *loop ) {
limit = _igvn.intcon(final_int);
} else {
// Create new LoopLimit node to get exact limit (final iv value).
- limit = new (C) LoopLimitNode(C, cl->init_trip(), cl->limit(), cl->stride());
+ limit = new LoopLimitNode(C, cl->init_trip(), cl->limit(), cl->stride());
register_new_node(limit, cl->in(LoopNode::EntryControl));
}
assert(limit != NULL, "sanity");
@@ -946,11 +946,11 @@ Node *LoopLimitNode::Ideal(PhaseGVN *phase, bool can_reshape) {
if (range <= max) {
// Convert to integer expression if it is not overflow.
Node* stride_m = phase->intcon(stride_con - (stride_con > 0 ? 1 : -1));
- Node *range = phase->transform(new (phase->C) SubINode(in(Limit), in(Init)));
- Node *bias = phase->transform(new (phase->C) AddINode(range, stride_m));
- Node *trip = phase->transform(new (phase->C) DivINode(0, bias, in(Stride)));
- Node *span = phase->transform(new (phase->C) MulINode(trip, in(Stride)));
- return new (phase->C) AddINode(span, in(Init)); // exact limit
+ Node *range = phase->transform(new SubINode(in(Limit), in(Init)));
+ Node *bias = phase->transform(new AddINode(range, stride_m));
+ Node *trip = phase->transform(new DivINode(0, bias, in(Stride)));
+ Node *span = phase->transform(new MulINode(trip, in(Stride)));
+ return new AddINode(span, in(Init)); // exact limit
}
if (is_power_of_2(stride_p) || // divisor is 2^n
@@ -958,13 +958,13 @@ Node *LoopLimitNode::Ideal(PhaseGVN *phase, bool can_reshape) {
// Convert to long expression to avoid integer overflow
// and let igvn optimizer convert this division.
//
- Node* init = phase->transform( new (phase->C) ConvI2LNode(in(Init)));
- Node* limit = phase->transform( new (phase->C) ConvI2LNode(in(Limit)));
+ Node* init = phase->transform( new ConvI2LNode(in(Init)));
+ Node* limit = phase->transform( new ConvI2LNode(in(Limit)));
Node* stride = phase->longcon(stride_con);
Node* stride_m = phase->longcon(stride_con - (stride_con > 0 ? 1 : -1));
- Node *range = phase->transform(new (phase->C) SubLNode(limit, init));
- Node *bias = phase->transform(new (phase->C) AddLNode(range, stride_m));
+ Node *range = phase->transform(new SubLNode(limit, init));
+ Node *bias = phase->transform(new AddLNode(range, stride_m));
Node *span;
if (stride_con > 0 && is_power_of_2(stride_p)) {
// bias >= 0 if stride >0, so if stride is 2^n we can use &(-stride)
@@ -975,14 +975,14 @@ Node *LoopLimitNode::Ideal(PhaseGVN *phase, bool can_reshape) {
// only RCE predicate where exact limit is used and the predicate
// will simply fail forcing recompilation.
Node* neg_stride = phase->longcon(-stride_con);
- span = phase->transform(new (phase->C) AndLNode(bias, neg_stride));
+ span = phase->transform(new AndLNode(bias, neg_stride));
} else {
- Node *trip = phase->transform(new (phase->C) DivLNode(0, bias, stride));
- span = phase->transform(new (phase->C) MulLNode(trip, stride));
+ Node *trip = phase->transform(new DivLNode(0, bias, stride));
+ span = phase->transform(new MulLNode(trip, stride));
}
// Convert back to int
- Node *span_int = phase->transform(new (phase->C) ConvL2INode(span));
- return new (phase->C) AddINode(span_int, in(Init)); // exact limit
+ Node *span_int = phase->transform(new ConvL2INode(span));
+ return new AddINode(span_int, in(Init)); // exact limit
}
return NULL; // No progress
@@ -1188,7 +1188,7 @@ void IdealLoopTree::split_fall_in( PhaseIdealLoop *phase, int fall_in_cnt ) {
uint i;
// Make a new RegionNode to be the landing pad.
- Node *landing_pad = new (phase->C) RegionNode( fall_in_cnt+1 );
+ Node *landing_pad = new RegionNode( fall_in_cnt+1 );
phase->set_loop(landing_pad,_parent);
// Gather all the fall-in control paths into the landing pad
uint icnt = fall_in_cnt;
@@ -1274,7 +1274,7 @@ void IdealLoopTree::split_outer_loop( PhaseIdealLoop *phase ) {
// Make a LoopNode for the outermost loop.
Node *ctl = _head->in(LoopNode::EntryControl);
- Node *outer = new (phase->C) LoopNode( ctl, _head->in(outer_idx) );
+ Node *outer = new LoopNode( ctl, _head->in(outer_idx) );
outer = igvn.register_new_node_with_optimizer(outer, _head);
phase->set_created_loop_node();
@@ -1388,7 +1388,7 @@ void IdealLoopTree::merge_many_backedges( PhaseIdealLoop *phase ) {
Node *hot_tail = NULL;
// Make a Region for the merge point
- Node *r = new (phase->C) RegionNode(1);
+ Node *r = new RegionNode(1);
for( i = 2; i < _head->req(); i++ ) {
if( i != hot_idx )
r->add_req( _head->in(i) );
@@ -1407,7 +1407,7 @@ void IdealLoopTree::merge_many_backedges( PhaseIdealLoop *phase ) {
PhiNode* n = out->as_Phi();
igvn.hash_delete(n); // Delete from hash before hacking edges
Node *hot_phi = NULL;
- Node *phi = new (phase->C) PhiNode(r, n->type(), n->adr_type());
+ Node *phi = new PhiNode(r, n->type(), n->adr_type());
// Check all inputs for the ones to peel out
uint j = 1;
for( uint i = 2; i < n->req(); i++ ) {
@@ -1529,7 +1529,7 @@ bool IdealLoopTree::beautify_loops( PhaseIdealLoop *phase ) {
} else if (!_head->is_Loop() && !_irreducible) {
// Make a new LoopNode to replace the old loop head
- Node *l = new (phase->C) LoopNode( _head->in(1), _head->in(2) );
+ Node *l = new LoopNode( _head->in(1), _head->in(2) );
l = igvn.register_new_node_with_optimizer(l, _head);
phase->set_created_loop_node();
// Go ahead and replace _head
@@ -1771,16 +1771,16 @@ void PhaseIdealLoop::replace_parallel_iv(IdealLoopTree *loop) {
// It is scaled by the 'ratio_con'.
Node* ratio = _igvn.intcon(ratio_con);
set_ctrl(ratio, C->root());
- Node* ratio_init = new (C) MulINode(init, ratio);
+ Node* ratio_init = new MulINode(init, ratio);
_igvn.register_new_node_with_optimizer(ratio_init, init);
set_early_ctrl(ratio_init);
- Node* diff = new (C) SubINode(init2, ratio_init);
+ Node* diff = new SubINode(init2, ratio_init);
_igvn.register_new_node_with_optimizer(diff, init2);
set_early_ctrl(diff);
- Node* ratio_idx = new (C) MulINode(phi, ratio);
+ Node* ratio_idx = new MulINode(phi, ratio);
_igvn.register_new_node_with_optimizer(ratio_idx, phi);
set_ctrl(ratio_idx, cl);
- Node* add = new (C) AddINode(ratio_idx, diff);
+ Node* add = new AddINode(ratio_idx, diff);
_igvn.register_new_node_with_optimizer(add);
set_ctrl(add, cl);
_igvn.replace_node( phi2, add );
@@ -2888,10 +2888,10 @@ int PhaseIdealLoop::build_loop_tree_impl( Node *n, int pre_order ) {
if (!_verify_only) {
// Insert the NeverBranch between 'm' and it's control user.
- NeverBranchNode *iff = new (C) NeverBranchNode( m );
+ NeverBranchNode *iff = new NeverBranchNode( m );
_igvn.register_new_node_with_optimizer(iff);
set_loop(iff, l);
- Node *if_t = new (C) CProjNode( iff, 0 );
+ Node *if_t = new CProjNode( iff, 0 );
_igvn.register_new_node_with_optimizer(if_t);
set_loop(if_t, l);
@@ -2907,16 +2907,16 @@ int PhaseIdealLoop::build_loop_tree_impl( Node *n, int pre_order ) {
cfg->set_req( k, if_t ); // Now point to NeverBranch
// Now create the never-taken loop exit
- Node *if_f = new (C) CProjNode( iff, 1 );
+ Node *if_f = new CProjNode( iff, 1 );
_igvn.register_new_node_with_optimizer(if_f);
set_loop(if_f, l);
// Find frame ptr for Halt. Relies on the optimizer
// V-N'ing. Easier and quicker than searching through
// the program structure.
- Node *frame = new (C) ParmNode( C->start(), TypeFunc::FramePtr );
+ Node *frame = new ParmNode( C->start(), TypeFunc::FramePtr );
_igvn.register_new_node_with_optimizer(frame);
// Halt & Catch Fire
- Node *halt = new (C) HaltNode( if_f, frame );
+ Node *halt = new HaltNode( if_f, frame );
_igvn.register_new_node_with_optimizer(halt);
set_loop(halt, l);
C->root()->add_req(halt);
diff --git a/hotspot/src/share/vm/opto/loopopts.cpp b/hotspot/src/share/vm/opto/loopopts.cpp
index 67a6d703cc0..7b722674391 100644
--- a/hotspot/src/share/vm/opto/loopopts.cpp
+++ b/hotspot/src/share/vm/opto/loopopts.cpp
@@ -56,7 +56,7 @@ Node *PhaseIdealLoop::split_thru_phi( Node *n, Node *region, int policy ) {
int iid = t_oop->instance_id();
int index = C->get_alias_index(t_oop);
int offset = t_oop->offset();
- phi = new (C) PhiNode(region, type, NULL, iid, index, offset);
+ phi = new PhiNode(region, type, NULL, iid, index, offset);
} else {
phi = PhiNode::make_blank(region, n);
}
@@ -363,9 +363,9 @@ Node *PhaseIdealLoop::remix_address_expressions( Node *n ) {
_igvn.type( add->in(1) ) != TypeInt::ZERO ) {
Node *zero = _igvn.intcon(0);
set_ctrl(zero, C->root());
- Node *neg = new (C) SubINode( _igvn.intcon(0), add->in(2) );
+ Node *neg = new SubINode( _igvn.intcon(0), add->in(2) );
register_new_node( neg, get_ctrl(add->in(2) ) );
- add = new (C) AddINode( add->in(1), neg );
+ add = new AddINode( add->in(1), neg );
register_new_node( add, add_ctrl );
}
if( add->Opcode() != Op_AddI ) return NULL;
@@ -391,14 +391,14 @@ Node *PhaseIdealLoop::remix_address_expressions( Node *n ) {
return NULL; // No invariant part of the add?
// Yes! Reshape address expression!
- Node *inv_scale = new (C) LShiftINode( add_invar, scale );
+ Node *inv_scale = new LShiftINode( add_invar, scale );
Node *inv_scale_ctrl =
dom_depth(add_invar_ctrl) > dom_depth(scale_ctrl) ?
add_invar_ctrl : scale_ctrl;
register_new_node( inv_scale, inv_scale_ctrl );
- Node *var_scale = new (C) LShiftINode( add_var, scale );
+ Node *var_scale = new LShiftINode( add_var, scale );
register_new_node( var_scale, n_ctrl );
- Node *var_add = new (C) AddINode( var_scale, inv_scale );
+ Node *var_add = new AddINode( var_scale, inv_scale );
register_new_node( var_add, n_ctrl );
_igvn.replace_node( n, var_add );
return var_add;
@@ -430,10 +430,10 @@ Node *PhaseIdealLoop::remix_address_expressions( Node *n ) {
IdealLoopTree *n23_loop = get_loop( n23_ctrl );
if( n22loop != n_loop && n22loop->is_member(n_loop) &&
n23_loop == n_loop ) {
- Node *add1 = new (C) AddPNode( n->in(1), n->in(2)->in(2), n->in(3) );
+ Node *add1 = new AddPNode( n->in(1), n->in(2)->in(2), n->in(3) );
// Stuff new AddP in the loop preheader
register_new_node( add1, n_loop->_head->in(LoopNode::EntryControl) );
- Node *add2 = new (C) AddPNode( n->in(1), add1, n->in(2)->in(3) );
+ Node *add2 = new AddPNode( n->in(1), add1, n->in(2)->in(3) );
register_new_node( add2, n_ctrl );
_igvn.replace_node( n, add2 );
return add2;
@@ -451,10 +451,10 @@ Node *PhaseIdealLoop::remix_address_expressions( Node *n ) {
Node *tmp = V; V = I; I = tmp;
}
if( !is_member(n_loop,get_ctrl(I)) ) {
- Node *add1 = new (C) AddPNode( n->in(1), n->in(2), I );
+ Node *add1 = new AddPNode( n->in(1), n->in(2), I );
// Stuff new AddP in the loop preheader
register_new_node( add1, n_loop->_head->in(LoopNode::EntryControl) );
- Node *add2 = new (C) AddPNode( n->in(1), add1, V );
+ Node *add2 = new AddPNode( n->in(1), add1, V );
register_new_node( add2, n_ctrl );
_igvn.replace_node( n, add2 );
return add2;
@@ -1104,8 +1104,8 @@ BoolNode *PhaseIdealLoop::clone_iff( PhiNode *phi, IdealLoopTree *loop ) {
Node *sample_cmp = sample_bool->in(1);
// Make Phis to merge the Cmp's inputs.
- PhiNode *phi1 = new (C) PhiNode( phi->in(0), Type::TOP );
- PhiNode *phi2 = new (C) PhiNode( phi->in(0), Type::TOP );
+ PhiNode *phi1 = new PhiNode( phi->in(0), Type::TOP );
+ PhiNode *phi2 = new PhiNode( phi->in(0), Type::TOP );
for( i = 1; i < phi->req(); i++ ) {
Node *n1 = phi->in(i)->in(1)->in(1);
Node *n2 = phi->in(i)->in(1)->in(2);
@@ -1172,8 +1172,8 @@ CmpNode *PhaseIdealLoop::clone_bool( PhiNode *phi, IdealLoopTree *loop ) {
Node *sample_cmp = phi->in(1);
// Make Phis to merge the Cmp's inputs.
- PhiNode *phi1 = new (C) PhiNode( phi->in(0), Type::TOP );
- PhiNode *phi2 = new (C) PhiNode( phi->in(0), Type::TOP );
+ PhiNode *phi1 = new PhiNode( phi->in(0), Type::TOP );
+ PhiNode *phi2 = new PhiNode( phi->in(0), Type::TOP );
for( uint j = 1; j < phi->req(); j++ ) {
Node *cmp_top = phi->in(j); // Inputs are all Cmp or TOP
Node *n1, *n2;
@@ -1337,7 +1337,7 @@ void PhaseIdealLoop::clone_loop( IdealLoopTree *loop, Node_List &old_new, int dd
// We need a Region to merge the exit from the peeled body and the
// exit from the old loop body.
- RegionNode *r = new (C) RegionNode(3);
+ RegionNode *r = new RegionNode(3);
// Map the old use to the new merge point
old_new.map( use->_idx, r );
uint dd_r = MIN2(dom_depth(newuse),dom_depth(use));
@@ -1684,13 +1684,13 @@ ProjNode* PhaseIdealLoop::insert_if_before_proj(Node* left, bool Signed, BoolTes
ProjNode* proj2 = proj_clone(proj, iff);
register_node(proj2, loop, iff, ddepth);
- Node* cmp = Signed ? (Node*) new (C)CmpINode(left, right) : (Node*) new (C)CmpUNode(left, right);
+ Node* cmp = Signed ? (Node*) new CmpINode(left, right) : (Node*) new CmpUNode(left, right);
register_node(cmp, loop, proj2, ddepth);
- BoolNode* bol = new (C)BoolNode(cmp, relop);
+ BoolNode* bol = new BoolNode(cmp, relop);
register_node(bol, loop, proj2, ddepth);
- IfNode* new_if = new (C)IfNode(proj2, bol, iff->_prob, iff->_fcnt);
+ IfNode* new_if = new IfNode(proj2, bol, iff->_prob, iff->_fcnt);
register_node(new_if, loop, proj2, ddepth);
proj->set_req(0, new_if); // reattach
@@ -1742,11 +1742,11 @@ RegionNode* PhaseIdealLoop::insert_region_before_proj(ProjNode* proj) {
ProjNode* proj2 = proj_clone(proj, iff);
register_node(proj2, loop, iff, ddepth);
- RegionNode* reg = new (C)RegionNode(2);
+ RegionNode* reg = new RegionNode(2);
reg->set_req(1, proj2);
register_node(reg, loop, iff, ddepth);
- IfNode* dum_if = new (C)IfNode(reg, short_circuit_if(NULL, proj), iff->_prob, iff->_fcnt);
+ IfNode* dum_if = new IfNode(reg, short_circuit_if(NULL, proj), iff->_prob, iff->_fcnt);
register_node(dum_if, loop, reg, ddepth);
proj->set_req(0, dum_if); // reattach
@@ -2569,7 +2569,7 @@ bool PhaseIdealLoop::partial_peel( IdealLoopTree *loop, Node_List &old_new ) {
// Create new loop head for new phis and to hang
// the nodes being moved (sinked) from the peel region.
- LoopNode* new_head = new (C) LoopNode(last_peel, last_peel);
+ LoopNode* new_head = new LoopNode(last_peel, last_peel);
new_head->set_unswitch_count(head->unswitch_count()); // Preserve
_igvn.register_new_node_with_optimizer(new_head);
assert(first_not_peeled->in(0) == last_peel, "last_peel <- first_not_peeled");
@@ -2769,11 +2769,11 @@ void PhaseIdealLoop::reorg_offsets(IdealLoopTree *loop) {
if (dom_lca(exit, u_ctrl) != exit) continue;
// Hit! Refactor use to use the post-incremented tripcounter.
// Compute a post-increment tripcounter.
- Node *opaq = new (C) Opaque2Node( C, cle->incr() );
+ Node *opaq = new Opaque2Node( C, cle->incr() );
register_new_node( opaq, u_ctrl );
Node *neg_stride = _igvn.intcon(-cle->stride_con());
set_ctrl(neg_stride, C->root());
- Node *post = new (C) AddINode( opaq, neg_stride);
+ Node *post = new AddINode( opaq, neg_stride);
register_new_node( post, u_ctrl );
_igvn.rehash_node_delayed(use);
for (uint j = 1; j < use->req(); j++) {
diff --git a/hotspot/src/share/vm/opto/machnode.hpp b/hotspot/src/share/vm/opto/machnode.hpp
index 8d42093ac31..1e2f22e9ef7 100644
--- a/hotspot/src/share/vm/opto/machnode.hpp
+++ b/hotspot/src/share/vm/opto/machnode.hpp
@@ -60,7 +60,10 @@ class State;
class MachOper : public ResourceObj {
public:
// Allocate right next to the MachNodes in the same arena
- void *operator new( size_t x, Compile* C ) throw() { return C->node_arena()->Amalloc_D(x); }
+ void *operator new(size_t x) throw() {
+ Compile* C = Compile::current();
+ return C->node_arena()->Amalloc_D(x);
+ }
// Opcode
virtual uint opcode() const = 0;
diff --git a/hotspot/src/share/vm/opto/macro.cpp b/hotspot/src/share/vm/opto/macro.cpp
index afaa4e858d4..5b1f4397642 100644
--- a/hotspot/src/share/vm/opto/macro.cpp
+++ b/hotspot/src/share/vm/opto/macro.cpp
@@ -108,20 +108,20 @@ void PhaseMacroExpand::copy_call_debug_info(CallNode *oldcall, CallNode * newcal
Node* PhaseMacroExpand::opt_bits_test(Node* ctrl, Node* region, int edge, Node* word, int mask, int bits, bool return_fast_path) {
Node* cmp;
if (mask != 0) {
- Node* and_node = transform_later(new (C) AndXNode(word, MakeConX(mask)));
- cmp = transform_later(new (C) CmpXNode(and_node, MakeConX(bits)));
+ Node* and_node = transform_later(new AndXNode(word, MakeConX(mask)));
+ cmp = transform_later(new CmpXNode(and_node, MakeConX(bits)));
} else {
cmp = word;
}
- Node* bol = transform_later(new (C) BoolNode(cmp, BoolTest::ne));
- IfNode* iff = new (C) IfNode( ctrl, bol, PROB_MIN, COUNT_UNKNOWN );
+ Node* bol = transform_later(new BoolNode(cmp, BoolTest::ne));
+ IfNode* iff = new IfNode( ctrl, bol, PROB_MIN, COUNT_UNKNOWN );
transform_later(iff);
// Fast path taken.
- Node *fast_taken = transform_later( new (C) IfFalseNode(iff) );
+ Node *fast_taken = transform_later(new IfFalseNode(iff));
// Fast path not-taken, i.e. slow path
- Node *slow_taken = transform_later( new (C) IfTrueNode(iff) );
+ Node *slow_taken = transform_later(new IfTrueNode(iff));
if (return_fast_path) {
region->init_req(edge, slow_taken); // Capture slow-control
@@ -147,8 +147,8 @@ CallNode* PhaseMacroExpand::make_slow_call(CallNode *oldcall, const TypeFunc* sl
// Slow-path call
CallNode *call = leaf_name
- ? (CallNode*)new (C) CallLeafNode ( slow_call_type, slow_call, leaf_name, TypeRawPtr::BOTTOM )
- : (CallNode*)new (C) CallStaticJavaNode( slow_call_type, slow_call, OptoRuntime::stub_name(slow_call), oldcall->jvms()->bci(), TypeRawPtr::BOTTOM );
+ ? (CallNode*)new CallLeafNode ( slow_call_type, slow_call, leaf_name, TypeRawPtr::BOTTOM )
+ : (CallNode*)new CallStaticJavaNode( slow_call_type, slow_call, OptoRuntime::stub_name(slow_call), oldcall->jvms()->bci(), TypeRawPtr::BOTTOM );
// Slow path call has no side-effects, uses few values
copy_predefined_input_for_runtime_call(slow_path, oldcall, call );
@@ -423,7 +423,7 @@ Node *PhaseMacroExpand::value_from_mem_phi(Node *mem, BasicType ft, const Type *
GrowableArray values(length, length, NULL, false);
// create a new Phi for the value
- PhiNode *phi = new (C) PhiNode(mem->in(0), phi_type, NULL, instance_id, alias_idx, offset);
+ PhiNode *phi = new PhiNode(mem->in(0), phi_type, NULL, instance_id, alias_idx, offset);
transform_later(phi);
value_phis->push(phi, mem->_idx);
@@ -735,7 +735,7 @@ bool PhaseMacroExpand::scalar_replacement(AllocateNode *alloc, GrowableArray req() - sfpt->jvms()->scloff());
- SafePointScalarObjectNode* sobj = new (C) SafePointScalarObjectNode(res_type,
+ SafePointScalarObjectNode* sobj = new SafePointScalarObjectNode(res_type,
#ifdef ASSERT
alloc,
#endif
@@ -843,7 +843,7 @@ bool PhaseMacroExpand::scalar_replacement(AllocateNode *alloc, GrowableArray is_EncodeP()) {
field_val = field_val->in(1);
} else {
- field_val = transform_later(new (C) DecodeNNode(field_val, field_val->get_ptr_type()));
+ field_val = transform_later(new DecodeNNode(field_val, field_val->get_ptr_type()));
}
}
sfpt->add_req(field_val);
@@ -1069,7 +1069,7 @@ bool PhaseMacroExpand::eliminate_boxing_node(CallStaticJavaNode *boxing) {
//---------------------------set_eden_pointers-------------------------
void PhaseMacroExpand::set_eden_pointers(Node* &eden_top_adr, Node* &eden_end_adr) {
if (UseTLAB) { // Private allocation: load from TLS
- Node* thread = transform_later(new (C) ThreadLocalNode());
+ Node* thread = transform_later(new ThreadLocalNode());
int tlab_top_offset = in_bytes(JavaThread::tlab_top_offset());
int tlab_end_offset = in_bytes(JavaThread::tlab_end_offset());
eden_top_adr = basic_plus_adr(top()/*not oop*/, thread, tlab_top_offset);
@@ -1205,18 +1205,18 @@ void PhaseMacroExpand::expand_allocate_common(
assert (initial_slow_test == NULL || !always_slow, "arguments must be consistent");
// generate the initial test if necessary
if (initial_slow_test != NULL ) {
- slow_region = new (C) RegionNode(3);
+ slow_region = new RegionNode(3);
// Now make the initial failure test. Usually a too-big test but
// might be a TRUE for finalizers or a fancy class check for
// newInstance0.
- IfNode *toobig_iff = new (C) IfNode(ctrl, initial_slow_test, PROB_MIN, COUNT_UNKNOWN);
+ IfNode *toobig_iff = new IfNode(ctrl, initial_slow_test, PROB_MIN, COUNT_UNKNOWN);
transform_later(toobig_iff);
// Plug the failing-too-big test into the slow-path region
- Node *toobig_true = new (C) IfTrueNode( toobig_iff );
+ Node *toobig_true = new IfTrueNode( toobig_iff );
transform_later(toobig_true);
slow_region ->init_req( too_big_or_final_path, toobig_true );
- toobig_false = new (C) IfFalseNode( toobig_iff );
+ toobig_false = new IfFalseNode( toobig_iff );
transform_later(toobig_false);
} else { // No initial test, just fall into next case
toobig_false = ctrl;
@@ -1249,10 +1249,10 @@ void PhaseMacroExpand::expand_allocate_common(
Node *eden_end = make_load(ctrl, mem, eden_end_adr, 0, TypeRawPtr::BOTTOM, T_ADDRESS);
// allocate the Region and Phi nodes for the result
- result_region = new (C) RegionNode(3);
- result_phi_rawmem = new (C) PhiNode(result_region, Type::MEMORY, TypeRawPtr::BOTTOM);
- result_phi_rawoop = new (C) PhiNode(result_region, TypeRawPtr::BOTTOM);
- result_phi_i_o = new (C) PhiNode(result_region, Type::ABIO); // I/O is used for Prefetch
+ result_region = new RegionNode(3);
+ result_phi_rawmem = new PhiNode(result_region, Type::MEMORY, TypeRawPtr::BOTTOM);
+ result_phi_rawoop = new PhiNode(result_region, TypeRawPtr::BOTTOM);
+ result_phi_i_o = new PhiNode(result_region, Type::ABIO); // I/O is used for Prefetch
// We need a Region for the loop-back contended case.
enum { fall_in_path = 1, contended_loopback_path = 2 };
@@ -1262,8 +1262,8 @@ void PhaseMacroExpand::expand_allocate_common(
contended_region = toobig_false;
contended_phi_rawmem = mem;
} else {
- contended_region = new (C) RegionNode(3);
- contended_phi_rawmem = new (C) PhiNode(contended_region, Type::MEMORY, TypeRawPtr::BOTTOM);
+ contended_region = new RegionNode(3);
+ contended_phi_rawmem = new PhiNode(contended_region, Type::MEMORY, TypeRawPtr::BOTTOM);
// Now handle the passing-too-big test. We fall into the contended
// loop-back merge point.
contended_region ->init_req(fall_in_path, toobig_false);
@@ -1275,23 +1275,23 @@ void PhaseMacroExpand::expand_allocate_common(
// Load(-locked) the heap top.
// See note above concerning the control input when using a TLAB
Node *old_eden_top = UseTLAB
- ? new (C) LoadPNode (ctrl, contended_phi_rawmem, eden_top_adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM, MemNode::unordered)
- : new (C) LoadPLockedNode(contended_region, contended_phi_rawmem, eden_top_adr, MemNode::acquire);
+ ? new LoadPNode (ctrl, contended_phi_rawmem, eden_top_adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM, MemNode::unordered)
+ : new LoadPLockedNode(contended_region, contended_phi_rawmem, eden_top_adr, MemNode::acquire);
transform_later(old_eden_top);
// Add to heap top to get a new heap top
- Node *new_eden_top = new (C) AddPNode(top(), old_eden_top, size_in_bytes);
+ Node *new_eden_top = new AddPNode(top(), old_eden_top, size_in_bytes);
transform_later(new_eden_top);
// Check for needing a GC; compare against heap end
- Node *needgc_cmp = new (C) CmpPNode(new_eden_top, eden_end);
+ Node *needgc_cmp = new CmpPNode(new_eden_top, eden_end);
transform_later(needgc_cmp);
- Node *needgc_bol = new (C) BoolNode(needgc_cmp, BoolTest::ge);
+ Node *needgc_bol = new BoolNode(needgc_cmp, BoolTest::ge);
transform_later(needgc_bol);
- IfNode *needgc_iff = new (C) IfNode(contended_region, needgc_bol, PROB_UNLIKELY_MAG(4), COUNT_UNKNOWN);
+ IfNode *needgc_iff = new IfNode(contended_region, needgc_bol, PROB_UNLIKELY_MAG(4), COUNT_UNKNOWN);
transform_later(needgc_iff);
// Plug the failing-heap-space-need-gc test into the slow-path region
- Node *needgc_true = new (C) IfTrueNode(needgc_iff);
+ Node *needgc_true = new IfTrueNode(needgc_iff);
transform_later(needgc_true);
if (initial_slow_test) {
slow_region->init_req(need_gc_path, needgc_true);
@@ -1302,7 +1302,7 @@ void PhaseMacroExpand::expand_allocate_common(
slow_region = needgc_true;
}
// No need for a GC. Setup for the Store-Conditional
- Node *needgc_false = new (C) IfFalseNode(needgc_iff);
+ Node *needgc_false = new IfFalseNode(needgc_iff);
transform_later(needgc_false);
// Grab regular I/O before optional prefetch may change it.
@@ -1322,37 +1322,37 @@ void PhaseMacroExpand::expand_allocate_common(
// memory state.
if (UseTLAB) {
Node* store_eden_top =
- new (C) StorePNode(needgc_false, contended_phi_rawmem, eden_top_adr,
+ new StorePNode(needgc_false, contended_phi_rawmem, eden_top_adr,
TypeRawPtr::BOTTOM, new_eden_top, MemNode::unordered);
transform_later(store_eden_top);
fast_oop_ctrl = needgc_false; // No contention, so this is the fast path
fast_oop_rawmem = store_eden_top;
} else {
Node* store_eden_top =
- new (C) StorePConditionalNode(needgc_false, contended_phi_rawmem, eden_top_adr,
+ new StorePConditionalNode(needgc_false, contended_phi_rawmem, eden_top_adr,
new_eden_top, fast_oop/*old_eden_top*/);
transform_later(store_eden_top);
- Node *contention_check = new (C) BoolNode(store_eden_top, BoolTest::ne);
+ Node *contention_check = new BoolNode(store_eden_top, BoolTest::ne);
transform_later(contention_check);
- store_eden_top = new (C) SCMemProjNode(store_eden_top);
+ store_eden_top = new SCMemProjNode(store_eden_top);
transform_later(store_eden_top);
// If not using TLABs, check to see if there was contention.
- IfNode *contention_iff = new (C) IfNode (needgc_false, contention_check, PROB_MIN, COUNT_UNKNOWN);
+ IfNode *contention_iff = new IfNode (needgc_false, contention_check, PROB_MIN, COUNT_UNKNOWN);
transform_later(contention_iff);
- Node *contention_true = new (C) IfTrueNode(contention_iff);
+ Node *contention_true = new IfTrueNode(contention_iff);
transform_later(contention_true);
// If contention, loopback and try again.
contended_region->init_req(contended_loopback_path, contention_true);
contended_phi_rawmem->init_req(contended_loopback_path, store_eden_top);
// Fast-path succeeded with no contention!
- Node *contention_false = new (C) IfFalseNode(contention_iff);
+ Node *contention_false = new IfFalseNode(contention_iff);
transform_later(contention_false);
fast_oop_ctrl = contention_false;
// Bump total allocated bytes for this thread
- Node* thread = new (C) ThreadLocalNode();
+ Node* thread = new ThreadLocalNode();
transform_later(thread);
Node* alloc_bytes_adr = basic_plus_adr(top()/*not oop*/, thread,
in_bytes(JavaThread::allocated_bytes_offset()));
@@ -1361,10 +1361,10 @@ void PhaseMacroExpand::expand_allocate_common(
#ifdef _LP64
Node* alloc_size = size_in_bytes;
#else
- Node* alloc_size = new (C) ConvI2LNode(size_in_bytes);
+ Node* alloc_size = new ConvI2LNode(size_in_bytes);
transform_later(alloc_size);
#endif
- Node* new_alloc_bytes = new (C) AddLNode(alloc_bytes, alloc_size);
+ Node* new_alloc_bytes = new AddLNode(alloc_bytes, alloc_size);
transform_later(new_alloc_bytes);
fast_oop_rawmem = make_store(fast_oop_ctrl, store_eden_top, alloc_bytes_adr,
0, new_alloc_bytes, T_LONG);
@@ -1391,9 +1391,9 @@ void PhaseMacroExpand::expand_allocate_common(
mb->init_req(TypeFunc::Memory, fast_oop_rawmem);
mb->init_req(TypeFunc::Control, fast_oop_ctrl);
- fast_oop_ctrl = new (C) ProjNode(mb,TypeFunc::Control);
+ fast_oop_ctrl = new ProjNode(mb,TypeFunc::Control);
transform_later(fast_oop_ctrl);
- fast_oop_rawmem = new (C) ProjNode(mb,TypeFunc::Memory);
+ fast_oop_rawmem = new ProjNode(mb,TypeFunc::Memory);
transform_later(fast_oop_rawmem);
} else {
// Add the MemBarStoreStore after the InitializeNode so that
@@ -1407,9 +1407,9 @@ void PhaseMacroExpand::expand_allocate_common(
MemBarNode* mb = MemBarNode::make(C, Op_MemBarStoreStore, Compile::AliasIdxBot);
transform_later(mb);
- Node* ctrl = new (C) ProjNode(init,TypeFunc::Control);
+ Node* ctrl = new ProjNode(init,TypeFunc::Control);
transform_later(ctrl);
- Node* mem = new (C) ProjNode(init,TypeFunc::Memory);
+ Node* mem = new ProjNode(init,TypeFunc::Memory);
transform_later(mem);
// The MemBarStoreStore depends on control and memory coming
@@ -1417,9 +1417,9 @@ void PhaseMacroExpand::expand_allocate_common(
mb->init_req(TypeFunc::Memory, mem);
mb->init_req(TypeFunc::Control, ctrl);
- ctrl = new (C) ProjNode(mb,TypeFunc::Control);
+ ctrl = new ProjNode(mb,TypeFunc::Control);
transform_later(ctrl);
- mem = new (C) ProjNode(mb,TypeFunc::Memory);
+ mem = new ProjNode(mb,TypeFunc::Memory);
transform_later(mem);
// All nodes that depended on the InitializeNode for control
@@ -1433,13 +1433,13 @@ void PhaseMacroExpand::expand_allocate_common(
if (C->env()->dtrace_extended_probes()) {
// Slow-path call
int size = TypeFunc::Parms + 2;
- CallLeafNode *call = new (C) CallLeafNode(OptoRuntime::dtrace_object_alloc_Type(),
- CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc_base),
- "dtrace_object_alloc",
- TypeRawPtr::BOTTOM);
+ CallLeafNode *call = new CallLeafNode(OptoRuntime::dtrace_object_alloc_Type(),
+ CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc_base),
+ "dtrace_object_alloc",
+ TypeRawPtr::BOTTOM);
// Get base of thread-local storage area
- Node* thread = new (C) ThreadLocalNode();
+ Node* thread = new ThreadLocalNode();
transform_later(thread);
call->init_req(TypeFunc::Parms+0, thread);
@@ -1450,9 +1450,9 @@ void PhaseMacroExpand::expand_allocate_common(
call->init_req(TypeFunc::ReturnAdr, alloc->in(TypeFunc::ReturnAdr));
call->init_req(TypeFunc::FramePtr, alloc->in(TypeFunc::FramePtr));
transform_later(call);
- fast_oop_ctrl = new (C) ProjNode(call,TypeFunc::Control);
+ fast_oop_ctrl = new ProjNode(call,TypeFunc::Control);
transform_later(fast_oop_ctrl);
- fast_oop_rawmem = new (C) ProjNode(call,TypeFunc::Memory);
+ fast_oop_rawmem = new ProjNode(call,TypeFunc::Memory);
transform_later(fast_oop_rawmem);
}
@@ -1467,7 +1467,7 @@ void PhaseMacroExpand::expand_allocate_common(
}
// Generate slow-path call
- CallNode *call = new (C) CallStaticJavaNode(slow_call_type, slow_call_address,
+ CallNode *call = new CallStaticJavaNode(slow_call_type, slow_call_address,
OptoRuntime::stub_name(slow_call_address),
alloc->jvms()->bci(),
TypePtr::BOTTOM);
@@ -1524,7 +1524,7 @@ void PhaseMacroExpand::expand_allocate_common(
// _memproj_catchall so we end up with a call that has only 1 memory projection.
if (_memproj_catchall != NULL ) {
if (_memproj_fallthrough == NULL) {
- _memproj_fallthrough = new (C) ProjNode(call, TypeFunc::Memory);
+ _memproj_fallthrough = new ProjNode(call, TypeFunc::Memory);
transform_later(_memproj_fallthrough);
}
for (DUIterator_Fast imax, i = _memproj_catchall->fast_outs(imax); i < imax; i++) {
@@ -1556,7 +1556,7 @@ void PhaseMacroExpand::expand_allocate_common(
// _ioproj_catchall so we end up with a call that has only 1 i_o projection.
if (_ioproj_catchall != NULL ) {
if (_ioproj_fallthrough == NULL) {
- _ioproj_fallthrough = new (C) ProjNode(call, TypeFunc::I_O);
+ _ioproj_fallthrough = new ProjNode(call, TypeFunc::I_O);
transform_later(_ioproj_fallthrough);
}
for (DUIterator_Fast imax, i = _ioproj_catchall->fast_outs(imax); i < imax; i++) {
@@ -1690,47 +1690,47 @@ Node* PhaseMacroExpand::prefetch_allocation(Node* i_o, Node*& needgc_false,
// As an allocation hits the watermark, we will prefetch starting
// at a "distance" away from watermark.
- Node *pf_region = new (C) RegionNode(3);
- Node *pf_phi_rawmem = new (C) PhiNode( pf_region, Type::MEMORY,
+ Node *pf_region = new RegionNode(3);
+ Node *pf_phi_rawmem = new PhiNode( pf_region, Type::MEMORY,
TypeRawPtr::BOTTOM );
// I/O is used for Prefetch
- Node *pf_phi_abio = new (C) PhiNode( pf_region, Type::ABIO );
+ Node *pf_phi_abio = new PhiNode( pf_region, Type::ABIO );
- Node *thread = new (C) ThreadLocalNode();
+ Node *thread = new ThreadLocalNode();
transform_later(thread);
- Node *eden_pf_adr = new (C) AddPNode( top()/*not oop*/, thread,
+ Node *eden_pf_adr = new AddPNode( top()/*not oop*/, thread,
_igvn.MakeConX(in_bytes(JavaThread::tlab_pf_top_offset())) );
transform_later(eden_pf_adr);
- Node *old_pf_wm = new (C) LoadPNode(needgc_false,
+ Node *old_pf_wm = new LoadPNode(needgc_false,
contended_phi_rawmem, eden_pf_adr,
TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM,
MemNode::unordered);
transform_later(old_pf_wm);
// check against new_eden_top
- Node *need_pf_cmp = new (C) CmpPNode( new_eden_top, old_pf_wm );
+ Node *need_pf_cmp = new CmpPNode( new_eden_top, old_pf_wm );
transform_later(need_pf_cmp);
- Node *need_pf_bol = new (C) BoolNode( need_pf_cmp, BoolTest::ge );
+ Node *need_pf_bol = new BoolNode( need_pf_cmp, BoolTest::ge );
transform_later(need_pf_bol);
- IfNode *need_pf_iff = new (C) IfNode( needgc_false, need_pf_bol,
+ IfNode *need_pf_iff = new IfNode( needgc_false, need_pf_bol,
PROB_UNLIKELY_MAG(4), COUNT_UNKNOWN );
transform_later(need_pf_iff);
// true node, add prefetchdistance
- Node *need_pf_true = new (C) IfTrueNode( need_pf_iff );
+ Node *need_pf_true = new IfTrueNode( need_pf_iff );
transform_later(need_pf_true);
- Node *need_pf_false = new (C) IfFalseNode( need_pf_iff );
+ Node *need_pf_false = new IfFalseNode( need_pf_iff );
transform_later(need_pf_false);
- Node *new_pf_wmt = new (C) AddPNode( top(), old_pf_wm,
+ Node *new_pf_wmt = new AddPNode( top(), old_pf_wm,
_igvn.MakeConX(AllocatePrefetchDistance) );
transform_later(new_pf_wmt );
new_pf_wmt->set_req(0, need_pf_true);
- Node *store_new_wmt = new (C) StorePNode(need_pf_true,
+ Node *store_new_wmt = new StorePNode(need_pf_true,
contended_phi_rawmem, eden_pf_adr,
TypeRawPtr::BOTTOM, new_pf_wmt,
MemNode::unordered);
@@ -1746,10 +1746,10 @@ Node* PhaseMacroExpand::prefetch_allocation(Node* i_o, Node*& needgc_false,
uint distance = 0;
for ( uint i = 0; i < lines; i++ ) {
- prefetch_adr = new (C) AddPNode( old_pf_wm, new_pf_wmt,
+ prefetch_adr = new AddPNode( old_pf_wm, new_pf_wmt,
_igvn.MakeConX(distance) );
transform_later(prefetch_adr);
- prefetch = new (C) PrefetchAllocationNode( i_o, prefetch_adr );
+ prefetch = new PrefetchAllocationNode( i_o, prefetch_adr );
transform_later(prefetch);
distance += step_size;
i_o = prefetch;
@@ -1772,8 +1772,8 @@ Node* PhaseMacroExpand::prefetch_allocation(Node* i_o, Node*& needgc_false,
} else if( UseTLAB && AllocatePrefetchStyle == 3 ) {
// Insert a prefetch for each allocation.
// This code is used for Sparc with BIS.
- Node *pf_region = new (C) RegionNode(3);
- Node *pf_phi_rawmem = new (C) PhiNode( pf_region, Type::MEMORY,
+ Node *pf_region = new RegionNode(3);
+ Node *pf_phi_rawmem = new PhiNode( pf_region, Type::MEMORY,
TypeRawPtr::BOTTOM );
// Generate several prefetch instructions.
@@ -1782,29 +1782,29 @@ Node* PhaseMacroExpand::prefetch_allocation(Node* i_o, Node*& needgc_false,
uint distance = AllocatePrefetchDistance;
// Next cache address.
- Node *cache_adr = new (C) AddPNode(old_eden_top, old_eden_top,
+ Node *cache_adr = new AddPNode(old_eden_top, old_eden_top,
_igvn.MakeConX(distance));
transform_later(cache_adr);
- cache_adr = new (C) CastP2XNode(needgc_false, cache_adr);
+ cache_adr = new CastP2XNode(needgc_false, cache_adr);
transform_later(cache_adr);
Node* mask = _igvn.MakeConX(~(intptr_t)(step_size-1));
- cache_adr = new (C) AndXNode(cache_adr, mask);
+ cache_adr = new AndXNode(cache_adr, mask);
transform_later(cache_adr);
- cache_adr = new (C) CastX2PNode(cache_adr);
+ cache_adr = new CastX2PNode(cache_adr);
transform_later(cache_adr);
// Prefetch
- Node *prefetch = new (C) PrefetchAllocationNode( contended_phi_rawmem, cache_adr );
+ Node *prefetch = new PrefetchAllocationNode( contended_phi_rawmem, cache_adr );
prefetch->set_req(0, needgc_false);
transform_later(prefetch);
contended_phi_rawmem = prefetch;
Node *prefetch_adr;
distance = step_size;
for ( uint i = 1; i < lines; i++ ) {
- prefetch_adr = new (C) AddPNode( cache_adr, cache_adr,
+ prefetch_adr = new AddPNode( cache_adr, cache_adr,
_igvn.MakeConX(distance) );
transform_later(prefetch_adr);
- prefetch = new (C) PrefetchAllocationNode( contended_phi_rawmem, prefetch_adr );
+ prefetch = new PrefetchAllocationNode( contended_phi_rawmem, prefetch_adr );
transform_later(prefetch);
distance += step_size;
contended_phi_rawmem = prefetch;
@@ -1818,10 +1818,10 @@ Node* PhaseMacroExpand::prefetch_allocation(Node* i_o, Node*& needgc_false,
uint step_size = AllocatePrefetchStepSize;
uint distance = AllocatePrefetchDistance;
for ( uint i = 0; i < lines; i++ ) {
- prefetch_adr = new (C) AddPNode( old_eden_top, new_eden_top,
+ prefetch_adr = new AddPNode( old_eden_top, new_eden_top,
_igvn.MakeConX(distance) );
transform_later(prefetch_adr);
- prefetch = new (C) PrefetchAllocationNode( i_o, prefetch_adr );
+ prefetch = new PrefetchAllocationNode( i_o, prefetch_adr );
// Do not let it float too high, since if eden_top == eden_end,
// both might be null.
if( i == 0 ) { // Set control for first prefetch, next follows it
@@ -2170,12 +2170,12 @@ void PhaseMacroExpand::expand_lock_node(LockNode *lock) {
* }
*/
- region = new (C) RegionNode(5);
+ region = new RegionNode(5);
// create a Phi for the memory state
- mem_phi = new (C) PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM);
+ mem_phi = new PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM);
- Node* fast_lock_region = new (C) RegionNode(3);
- Node* fast_lock_mem_phi = new (C) PhiNode( fast_lock_region, Type::MEMORY, TypeRawPtr::BOTTOM);
+ Node* fast_lock_region = new RegionNode(3);
+ Node* fast_lock_mem_phi = new PhiNode( fast_lock_region, Type::MEMORY, TypeRawPtr::BOTTOM);
// First, check mark word for the biased lock pattern.
Node* mark_node = make_load(ctrl, mem, obj, oopDesc::mark_offset_in_bytes(), TypeX_X, TypeX_X->basic_type());
@@ -2205,10 +2205,10 @@ void PhaseMacroExpand::expand_lock_node(LockNode *lock) {
}
Node *proto_node = make_load(ctrl, mem, klass_node, in_bytes(Klass::prototype_header_offset()), TypeX_X, TypeX_X->basic_type());
- Node* thread = transform_later(new (C) ThreadLocalNode());
- Node* cast_thread = transform_later(new (C) CastP2XNode(ctrl, thread));
- Node* o_node = transform_later(new (C) OrXNode(cast_thread, proto_node));
- Node* x_node = transform_later(new (C) XorXNode(o_node, mark_node));
+ Node* thread = transform_later(new ThreadLocalNode());
+ Node* cast_thread = transform_later(new CastP2XNode(ctrl, thread));
+ Node* o_node = transform_later(new OrXNode(cast_thread, proto_node));
+ Node* x_node = transform_later(new XorXNode(o_node, mark_node));
// Get slow path - mark word does NOT match the value.
Node* not_biased_ctrl = opt_bits_test(ctrl, region, 3, x_node,
@@ -2231,17 +2231,17 @@ void PhaseMacroExpand::expand_lock_node(LockNode *lock) {
// We are going to try to reset the mark of this object to the prototype
// value and fall through to the CAS-based locking scheme.
Node* adr = basic_plus_adr(obj, oopDesc::mark_offset_in_bytes());
- Node* cas = new (C) StoreXConditionalNode(not_biased_ctrl, mem, adr,
- proto_node, mark_node);
+ Node* cas = new StoreXConditionalNode(not_biased_ctrl, mem, adr,
+ proto_node, mark_node);
transform_later(cas);
- Node* proj = transform_later( new (C) SCMemProjNode(cas));
+ Node* proj = transform_later(new SCMemProjNode(cas));
fast_lock_mem_phi->init_req(2, proj);
// Second, check epoch bits.
- Node* rebiased_region = new (C) RegionNode(3);
- Node* old_phi = new (C) PhiNode( rebiased_region, TypeX_X);
- Node* new_phi = new (C) PhiNode( rebiased_region, TypeX_X);
+ Node* rebiased_region = new RegionNode(3);
+ Node* old_phi = new PhiNode( rebiased_region, TypeX_X);
+ Node* new_phi = new PhiNode( rebiased_region, TypeX_X);
// Get slow path - mark word does NOT match epoch bits.
Node* epoch_ctrl = opt_bits_test(ctrl, rebiased_region, 1, x_node,
@@ -2258,9 +2258,9 @@ void PhaseMacroExpand::expand_lock_node(LockNode *lock) {
Node* cmask = MakeConX(markOopDesc::biased_lock_mask_in_place |
markOopDesc::age_mask_in_place |
markOopDesc::epoch_mask_in_place);
- Node* old = transform_later(new (C) AndXNode(mark_node, cmask));
- cast_thread = transform_later(new (C) CastP2XNode(ctrl, thread));
- Node* new_mark = transform_later(new (C) OrXNode(cast_thread, old));
+ Node* old = transform_later(new AndXNode(mark_node, cmask));
+ cast_thread = transform_later(new CastP2XNode(ctrl, thread));
+ Node* new_mark = transform_later(new OrXNode(cast_thread, old));
old_phi->init_req(1, old);
new_phi->init_req(1, new_mark);
@@ -2270,10 +2270,9 @@ void PhaseMacroExpand::expand_lock_node(LockNode *lock) {
// Try to acquire the bias of the object using an atomic operation.
// If this fails we will go in to the runtime to revoke the object's bias.
- cas = new (C) StoreXConditionalNode(rebiased_region, mem, adr,
- new_phi, old_phi);
+ cas = new StoreXConditionalNode(rebiased_region, mem, adr, new_phi, old_phi);
transform_later(cas);
- proj = transform_later( new (C) SCMemProjNode(cas));
+ proj = transform_later(new SCMemProjNode(cas));
// Get slow path - Failed to CAS.
not_biased_ctrl = opt_bits_test(rebiased_region, region, 4, cas, 0, 0);
@@ -2281,8 +2280,8 @@ void PhaseMacroExpand::expand_lock_node(LockNode *lock) {
// region->in(4) is set to fast path - the object is rebiased to the current thread.
// Failed to CAS.
- slow_path = new (C) RegionNode(3);
- Node *slow_mem = new (C) PhiNode( slow_path, Type::MEMORY, TypeRawPtr::BOTTOM);
+ slow_path = new RegionNode(3);
+ Node *slow_mem = new PhiNode( slow_path, Type::MEMORY, TypeRawPtr::BOTTOM);
slow_path->init_req(1, not_biased_ctrl); // Capture slow-control
slow_mem->init_req(1, proj);
@@ -2306,9 +2305,9 @@ void PhaseMacroExpand::expand_lock_node(LockNode *lock) {
lock->set_req(TypeFunc::Memory, slow_mem);
} else {
- region = new (C) RegionNode(3);
+ region = new RegionNode(3);
// create a Phi for the memory state
- mem_phi = new (C) PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM);
+ mem_phi = new PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM);
// Optimize test; set region slot 2
slow_path = opt_bits_test(ctrl, region, 2, flock, 0, 0);
@@ -2339,7 +2338,7 @@ void PhaseMacroExpand::expand_lock_node(LockNode *lock) {
transform_later(region);
_igvn.replace_node(_fallthroughproj, region);
- Node *memproj = transform_later( new(C) ProjNode(call, TypeFunc::Memory) );
+ Node *memproj = transform_later(new ProjNode(call, TypeFunc::Memory));
mem_phi->init_req(1, memproj );
transform_later(mem_phi);
_igvn.replace_node(_memproj_fallthrough, mem_phi);
@@ -2364,9 +2363,9 @@ void PhaseMacroExpand::expand_unlock_node(UnlockNode *unlock) {
if (UseOptoBiasInlining) {
// Check for biased locking unlock case, which is a no-op.
// See the full description in MacroAssembler::biased_locking_exit().
- region = new (C) RegionNode(4);
+ region = new RegionNode(4);
// create a Phi for the memory state
- mem_phi = new (C) PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM);
+ mem_phi = new PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM);
mem_phi->init_req(3, mem);
Node* mark_node = make_load(ctrl, mem, obj, oopDesc::mark_offset_in_bytes(), TypeX_X, TypeX_X->basic_type());
@@ -2374,12 +2373,12 @@ void PhaseMacroExpand::expand_unlock_node(UnlockNode *unlock) {
markOopDesc::biased_lock_mask_in_place,
markOopDesc::biased_lock_pattern);
} else {
- region = new (C) RegionNode(3);
+ region = new RegionNode(3);
// create a Phi for the memory state
- mem_phi = new (C) PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM);
+ mem_phi = new PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM);
}
- FastUnlockNode *funlock = new (C) FastUnlockNode( ctrl, obj, box );
+ FastUnlockNode *funlock = new FastUnlockNode( ctrl, obj, box );
funlock = transform_later( funlock )->as_FastUnlock();
// Optimize test; set region slot 2
Node *slow_path = opt_bits_test(ctrl, region, 2, funlock, 0, 0);
@@ -2404,7 +2403,7 @@ void PhaseMacroExpand::expand_unlock_node(UnlockNode *unlock) {
transform_later(region);
_igvn.replace_node(_fallthroughproj, region);
- Node *memproj = transform_later( new(C) ProjNode(call, TypeFunc::Memory) );
+ Node *memproj = transform_later(new ProjNode(call, TypeFunc::Memory) );
mem_phi->init_req(1, memproj );
mem_phi->init_req(2, mem);
transform_later(mem_phi);
diff --git a/hotspot/src/share/vm/opto/macro.hpp b/hotspot/src/share/vm/opto/macro.hpp
index 0efe988ab17..5cefbb1c063 100644
--- a/hotspot/src/share/vm/opto/macro.hpp
+++ b/hotspot/src/share/vm/opto/macro.hpp
@@ -52,7 +52,7 @@ private:
return basic_plus_adr(base, base, offset);
}
Node* basic_plus_adr(Node* base, Node* ptr, Node* offset) {
- Node* adr = new (C) AddPNode(base, ptr, offset);
+ Node* adr = new AddPNode(base, ptr, offset);
return transform_later(adr);
}
Node* transform_later(Node* n) {
diff --git a/hotspot/src/share/vm/opto/matcher.cpp b/hotspot/src/share/vm/opto/matcher.cpp
index 7cdf630e1dc..2b2f11f9b4e 100644
--- a/hotspot/src/share/vm/opto/matcher.cpp
+++ b/hotspot/src/share/vm/opto/matcher.cpp
@@ -751,7 +751,7 @@ void Matcher::Fixup_Save_On_Entry( ) {
tail_call_rms[tail_call_edge_cnt].Insert(OptoReg::Name(i+1));
tail_jump_rms[tail_jump_edge_cnt].Insert(OptoReg::Name(i+1));
halt_rms [ halt_edge_cnt].Insert(OptoReg::Name(i+1));
- mproj = new (C) MachProjNode( start, proj_cnt, ret_rms[ret_edge_cnt], Op_RegD );
+ mproj = new MachProjNode( start, proj_cnt, ret_rms[ret_edge_cnt], Op_RegD );
proj_cnt += 2; // Skip 2 for doubles
}
else if( (i&1) == 1 && // Else check for high half of double
@@ -777,7 +777,7 @@ void Matcher::Fixup_Save_On_Entry( ) {
tail_call_rms[tail_call_edge_cnt].Insert(OptoReg::Name(i+1));
tail_jump_rms[tail_jump_edge_cnt].Insert(OptoReg::Name(i+1));
halt_rms [ halt_edge_cnt].Insert(OptoReg::Name(i+1));
- mproj = new (C) MachProjNode( start, proj_cnt, ret_rms[ret_edge_cnt], Op_RegL );
+ mproj = new MachProjNode( start, proj_cnt, ret_rms[ret_edge_cnt], Op_RegL );
proj_cnt += 2; // Skip 2 for longs
}
else if( (i&1) == 1 && // Else check for high half of long
@@ -792,7 +792,7 @@ void Matcher::Fixup_Save_On_Entry( ) {
mproj = C->top();
} else {
// Make a projection for it off the Start
- mproj = new (C) MachProjNode( start, proj_cnt++, ret_rms[ret_edge_cnt], _register_save_type[i] );
+ mproj = new MachProjNode( start, proj_cnt++, ret_rms[ret_edge_cnt], _register_save_type[i] );
}
ret_edge_cnt ++;
@@ -845,13 +845,13 @@ void Matcher::init_spill_mask( Node *ret ) {
// Compute generic short-offset Loads
#ifdef _LP64
- MachNode *spillCP = match_tree(new (C) LoadNNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM,MemNode::unordered));
+ MachNode *spillCP = match_tree(new LoadNNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM,MemNode::unordered));
#endif
- MachNode *spillI = match_tree(new (C) LoadINode(NULL,mem,fp,atp,TypeInt::INT,MemNode::unordered));
- MachNode *spillL = match_tree(new (C) LoadLNode(NULL,mem,fp,atp,TypeLong::LONG,MemNode::unordered,false));
- MachNode *spillF = match_tree(new (C) LoadFNode(NULL,mem,fp,atp,Type::FLOAT,MemNode::unordered));
- MachNode *spillD = match_tree(new (C) LoadDNode(NULL,mem,fp,atp,Type::DOUBLE,MemNode::unordered));
- MachNode *spillP = match_tree(new (C) LoadPNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM,MemNode::unordered));
+ MachNode *spillI = match_tree(new LoadINode(NULL,mem,fp,atp,TypeInt::INT,MemNode::unordered));
+ MachNode *spillL = match_tree(new LoadLNode(NULL,mem,fp,atp,TypeLong::LONG,MemNode::unordered,false));
+ MachNode *spillF = match_tree(new LoadFNode(NULL,mem,fp,atp,Type::FLOAT,MemNode::unordered));
+ MachNode *spillD = match_tree(new LoadDNode(NULL,mem,fp,atp,Type::DOUBLE,MemNode::unordered));
+ MachNode *spillP = match_tree(new LoadPNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM,MemNode::unordered));
assert(spillI != NULL && spillL != NULL && spillF != NULL &&
spillD != NULL && spillP != NULL, "");
// Get the ADLC notion of the right regmask, for each basic type.
@@ -867,19 +867,19 @@ void Matcher::init_spill_mask( Node *ret ) {
// Vector regmasks.
if (Matcher::vector_size_supported(T_BYTE,4)) {
TypeVect::VECTS = TypeVect::make(T_BYTE, 4);
- MachNode *spillVectS = match_tree(new (C) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTS));
+ MachNode *spillVectS = match_tree(new LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTS));
idealreg2regmask[Op_VecS] = &spillVectS->out_RegMask();
}
if (Matcher::vector_size_supported(T_FLOAT,2)) {
- MachNode *spillVectD = match_tree(new (C) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTD));
+ MachNode *spillVectD = match_tree(new LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTD));
idealreg2regmask[Op_VecD] = &spillVectD->out_RegMask();
}
if (Matcher::vector_size_supported(T_FLOAT,4)) {
- MachNode *spillVectX = match_tree(new (C) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTX));
+ MachNode *spillVectX = match_tree(new LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTX));
idealreg2regmask[Op_VecX] = &spillVectX->out_RegMask();
}
if (Matcher::vector_size_supported(T_FLOAT,8)) {
- MachNode *spillVectY = match_tree(new (C) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTY));
+ MachNode *spillVectY = match_tree(new LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTY));
idealreg2regmask[Op_VecY] = &spillVectY->out_RegMask();
}
}
@@ -1319,7 +1319,7 @@ MachNode *Matcher::match_sfpt( SafePointNode *sfpt ) {
// is excluded on the max-per-method basis, debug info cannot land in
// this killed area.
uint r_cnt = mcall->tf()->range()->cnt();
- MachProjNode *proj = new (C) MachProjNode( mcall, r_cnt+10000, RegMask::Empty, MachProjNode::fat_proj );
+ MachProjNode *proj = new MachProjNode( mcall, r_cnt+10000, RegMask::Empty, MachProjNode::fat_proj );
if (!RegMask::can_represent_arg(OptoReg::Name(out_arg_limit_per_call-1))) {
C->record_method_not_compilable_all_tiers("unsupported outgoing calling sequence");
} else {
@@ -2274,7 +2274,7 @@ void Matcher::find_shared( Node *n ) {
case Op_CompareAndSwapN: { // Convert trinary to binary-tree
Node *newval = n->in(MemNode::ValueIn );
Node *oldval = n->in(LoadStoreConditionalNode::ExpectedIn);
- Node *pair = new (C) BinaryNode( oldval, newval );
+ Node *pair = new BinaryNode( oldval, newval );
n->set_req(MemNode::ValueIn,pair);
n->del_req(LoadStoreConditionalNode::ExpectedIn);
break;
@@ -2289,22 +2289,22 @@ void Matcher::find_shared( Node *n ) {
// we could move this code up next to the graph reshaping for IfNodes
// or vice-versa, but I do not want to debug this for Ladybird.
// 10/2/2000 CNC.
- Node *pair1 = new (C) BinaryNode(n->in(1),n->in(1)->in(1));
+ Node *pair1 = new BinaryNode(n->in(1),n->in(1)->in(1));
n->set_req(1,pair1);
- Node *pair2 = new (C) BinaryNode(n->in(2),n->in(3));
+ Node *pair2 = new BinaryNode(n->in(2),n->in(3));
n->set_req(2,pair2);
n->del_req(3);
break;
}
case Op_LoopLimit: {
- Node *pair1 = new (C) BinaryNode(n->in(1),n->in(2));
+ Node *pair1 = new BinaryNode(n->in(1),n->in(2));
n->set_req(1,pair1);
n->set_req(2,n->in(3));
n->del_req(3);
break;
}
case Op_StrEquals: {
- Node *pair1 = new (C) BinaryNode(n->in(2),n->in(3));
+ Node *pair1 = new BinaryNode(n->in(2),n->in(3));
n->set_req(2,pair1);
n->set_req(3,n->in(4));
n->del_req(4);
@@ -2312,9 +2312,9 @@ void Matcher::find_shared( Node *n ) {
}
case Op_StrComp:
case Op_StrIndexOf: {
- Node *pair1 = new (C) BinaryNode(n->in(2),n->in(3));
+ Node *pair1 = new BinaryNode(n->in(2),n->in(3));
n->set_req(2,pair1);
- Node *pair2 = new (C) BinaryNode(n->in(4),n->in(5));
+ Node *pair2 = new BinaryNode(n->in(4),n->in(5));
n->set_req(3,pair2);
n->del_req(5);
n->del_req(4);
@@ -2322,7 +2322,7 @@ void Matcher::find_shared( Node *n ) {
}
case Op_EncodeISOArray: {
// Restructure into a binary tree for Matching.
- Node* pair = new (C) BinaryNode(n->in(3), n->in(4));
+ Node* pair = new BinaryNode(n->in(3), n->in(4));
n->set_req(3, pair);
n->del_req(4);
break;
diff --git a/hotspot/src/share/vm/opto/memnode.cpp b/hotspot/src/share/vm/opto/memnode.cpp
index 1d908c5b577..1c4d2bd773e 100644
--- a/hotspot/src/share/vm/opto/memnode.cpp
+++ b/hotspot/src/share/vm/opto/memnode.cpp
@@ -908,25 +908,25 @@ Node *LoadNode::make(PhaseGVN& gvn, Node *ctl, Node *mem, Node *adr, const TypeP
rt->isa_oopptr() || is_immutable_value(adr),
"raw memory operations should have control edge");
switch (bt) {
- case T_BOOLEAN: return new (C) LoadUBNode(ctl, mem, adr, adr_type, rt->is_int(), mo);
- case T_BYTE: return new (C) LoadBNode (ctl, mem, adr, adr_type, rt->is_int(), mo);
- case T_INT: return new (C) LoadINode (ctl, mem, adr, adr_type, rt->is_int(), mo);
- case T_CHAR: return new (C) LoadUSNode(ctl, mem, adr, adr_type, rt->is_int(), mo);
- case T_SHORT: return new (C) LoadSNode (ctl, mem, adr, adr_type, rt->is_int(), mo);
- case T_LONG: return new (C) LoadLNode (ctl, mem, adr, adr_type, rt->is_long(), mo);
- case T_FLOAT: return new (C) LoadFNode (ctl, mem, adr, adr_type, rt, mo);
- case T_DOUBLE: return new (C) LoadDNode (ctl, mem, adr, adr_type, rt, mo);
- case T_ADDRESS: return new (C) LoadPNode (ctl, mem, adr, adr_type, rt->is_ptr(), mo);
+ case T_BOOLEAN: return new LoadUBNode(ctl, mem, adr, adr_type, rt->is_int(), mo);
+ case T_BYTE: return new LoadBNode (ctl, mem, adr, adr_type, rt->is_int(), mo);
+ case T_INT: return new LoadINode (ctl, mem, adr, adr_type, rt->is_int(), mo);
+ case T_CHAR: return new LoadUSNode(ctl, mem, adr, adr_type, rt->is_int(), mo);
+ case T_SHORT: return new LoadSNode (ctl, mem, adr, adr_type, rt->is_int(), mo);
+ case T_LONG: return new LoadLNode (ctl, mem, adr, adr_type, rt->is_long(), mo);
+ case T_FLOAT: return new LoadFNode (ctl, mem, adr, adr_type, rt, mo);
+ case T_DOUBLE: return new LoadDNode (ctl, mem, adr, adr_type, rt, mo);
+ case T_ADDRESS: return new LoadPNode (ctl, mem, adr, adr_type, rt->is_ptr(), mo);
case T_OBJECT:
#ifdef _LP64
if (adr->bottom_type()->is_ptr_to_narrowoop()) {
- Node* load = gvn.transform(new (C) LoadNNode(ctl, mem, adr, adr_type, rt->make_narrowoop(), mo));
- return new (C) DecodeNNode(load, load->bottom_type()->make_ptr());
+ Node* load = gvn.transform(new LoadNNode(ctl, mem, adr, adr_type, rt->make_narrowoop(), mo));
+ return new DecodeNNode(load, load->bottom_type()->make_ptr());
} else
#endif
{
assert(!adr->bottom_type()->is_ptr_to_narrowoop() && !adr->bottom_type()->is_ptr_to_narrowklass(), "should have got back a narrow oop");
- return new (C) LoadPNode(ctl, mem, adr, adr_type, rt->is_oopptr(), mo);
+ return new LoadPNode(ctl, mem, adr, adr_type, rt->is_oopptr(), mo);
}
}
ShouldNotReachHere();
@@ -935,12 +935,12 @@ Node *LoadNode::make(PhaseGVN& gvn, Node *ctl, Node *mem, Node *adr, const TypeP
LoadLNode* LoadLNode::make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, const Type* rt, MemOrd mo) {
bool require_atomic = true;
- return new (C) LoadLNode(ctl, mem, adr, adr_type, rt->is_long(), mo, require_atomic);
+ return new LoadLNode(ctl, mem, adr, adr_type, rt->is_long(), mo, require_atomic);
}
LoadDNode* LoadDNode::make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, const Type* rt, MemOrd mo) {
bool require_atomic = true;
- return new (C) LoadDNode(ctl, mem, adr, adr_type, rt, mo, require_atomic);
+ return new LoadDNode(ctl, mem, adr, adr_type, rt, mo, require_atomic);
}
@@ -1228,33 +1228,33 @@ Node* LoadNode::eliminate_autobox(PhaseGVN* phase) {
// Add up all the offsets making of the address of the load
Node* result = elements[0];
for (int i = 1; i < count; i++) {
- result = phase->transform(new (phase->C) AddXNode(result, elements[i]));
+ result = phase->transform(new AddXNode(result, elements[i]));
}
// Remove the constant offset from the address and then
- result = phase->transform(new (phase->C) AddXNode(result, phase->MakeConX(-(int)offset)));
+ result = phase->transform(new AddXNode(result, phase->MakeConX(-(int)offset)));
// remove the scaling of the offset to recover the original index.
if (result->Opcode() == Op_LShiftX && result->in(2) == phase->intcon(shift)) {
// Peel the shift off directly but wrap it in a dummy node
// since Ideal can't return existing nodes
- result = new (phase->C) RShiftXNode(result->in(1), phase->intcon(0));
+ result = new RShiftXNode(result->in(1), phase->intcon(0));
} else if (result->is_Add() && result->in(2)->is_Con() &&
result->in(1)->Opcode() == Op_LShiftX &&
result->in(1)->in(2) == phase->intcon(shift)) {
// We can't do general optimization: ((X<> Z ==> X + (Y>>Z)
// but for boxing cache access we know that X<C) RShiftXNode(result->in(2), phase->intcon(shift));
- result = new (phase->C) AddXNode(result->in(1)->in(1), phase->transform(add_con));
+ Node* add_con = new RShiftXNode(result->in(2), phase->intcon(shift));
+ result = new AddXNode(result->in(1)->in(1), phase->transform(add_con));
} else {
- result = new (phase->C) RShiftXNode(result, phase->intcon(shift));
+ result = new RShiftXNode(result, phase->intcon(shift));
}
#ifdef _LP64
if (bt != T_LONG) {
- result = new (phase->C) ConvL2INode(phase->transform(result));
+ result = new ConvL2INode(phase->transform(result));
}
#else
if (bt == T_LONG) {
- result = new (phase->C) ConvI2LNode(phase->transform(result));
+ result = new ConvI2LNode(phase->transform(result));
}
#endif
return result;
@@ -1385,7 +1385,7 @@ Node *LoadNode::split_through_phi(PhaseGVN *phase) {
this_iid = base->_idx;
}
PhaseIterGVN* igvn = phase->is_IterGVN();
- Node* phi = new (C) PhiNode(region, this_type, NULL, this_iid, this_index, this_offset);
+ Node* phi = new PhiNode(region, this_type, NULL, this_iid, this_index, this_offset);
for (uint i = 1; i < region->req(); i++) {
Node* x;
Node* the_clone = NULL;
@@ -1408,7 +1408,7 @@ Node *LoadNode::split_through_phi(PhaseGVN *phase) {
}
if (base_is_phi && (base->in(0) == region)) {
Node* base_x = base->in(i); // Clone address for loads from boxed objects.
- Node* adr_x = phase->transform(new (C) AddPNode(base_x,base_x,address->in(AddPNode::Offset)));
+ Node* adr_x = phase->transform(new AddPNode(base_x,base_x,address->in(AddPNode::Offset)));
x->set_req(Address, adr_x);
}
}
@@ -1897,8 +1897,8 @@ Node *LoadBNode::Ideal(PhaseGVN *phase, bool can_reshape) {
Node* mem = in(MemNode::Memory);
Node* value = can_see_stored_value(mem,phase);
if( value && !phase->type(value)->higher_equal( _type ) ) {
- Node *result = phase->transform( new (phase->C) LShiftINode(value, phase->intcon(24)) );
- return new (phase->C) RShiftINode(result, phase->intcon(24));
+ Node *result = phase->transform( new LShiftINode(value, phase->intcon(24)) );
+ return new RShiftINode(result, phase->intcon(24));
}
// Identity call will handle the case where truncation is not needed.
return LoadNode::Ideal(phase, can_reshape);
@@ -1929,7 +1929,7 @@ Node* LoadUBNode::Ideal(PhaseGVN* phase, bool can_reshape) {
Node* mem = in(MemNode::Memory);
Node* value = can_see_stored_value(mem, phase);
if (value && !phase->type(value)->higher_equal(_type))
- return new (phase->C) AndINode(value, phase->intcon(0xFF));
+ return new AndINode(value, phase->intcon(0xFF));
// Identity call will handle the case where truncation is not needed.
return LoadNode::Ideal(phase, can_reshape);
}
@@ -1959,7 +1959,7 @@ Node *LoadUSNode::Ideal(PhaseGVN *phase, bool can_reshape) {
Node* mem = in(MemNode::Memory);
Node* value = can_see_stored_value(mem,phase);
if( value && !phase->type(value)->higher_equal( _type ) )
- return new (phase->C) AndINode(value,phase->intcon(0xFFFF));
+ return new AndINode(value,phase->intcon(0xFFFF));
// Identity call will handle the case where truncation is not needed.
return LoadNode::Ideal(phase, can_reshape);
}
@@ -1989,8 +1989,8 @@ Node *LoadSNode::Ideal(PhaseGVN *phase, bool can_reshape) {
Node* mem = in(MemNode::Memory);
Node* value = can_see_stored_value(mem,phase);
if( value && !phase->type(value)->higher_equal( _type ) ) {
- Node *result = phase->transform( new (phase->C) LShiftINode(value, phase->intcon(16)) );
- return new (phase->C) RShiftINode(result, phase->intcon(16));
+ Node *result = phase->transform( new LShiftINode(value, phase->intcon(16)) );
+ return new RShiftINode(result, phase->intcon(16));
}
// Identity call will handle the case where truncation is not needed.
return LoadNode::Ideal(phase, can_reshape);
@@ -2022,12 +2022,12 @@ Node *LoadKlassNode::make( PhaseGVN& gvn, Node *mem, Node *adr, const TypePtr* a
#ifdef _LP64
if (adr_type->is_ptr_to_narrowklass()) {
assert(UseCompressedClassPointers, "no compressed klasses");
- Node* load_klass = gvn.transform(new (C) LoadNKlassNode(ctl, mem, adr, at, tk->make_narrowklass(), MemNode::unordered));
- return new (C) DecodeNKlassNode(load_klass, load_klass->bottom_type()->make_ptr());
+ Node* load_klass = gvn.transform(new LoadNKlassNode(ctl, mem, adr, at, tk->make_narrowklass(), MemNode::unordered));
+ return new DecodeNKlassNode(load_klass, load_klass->bottom_type()->make_ptr());
}
#endif
assert(!adr_type->is_ptr_to_narrowklass() && !adr_type->is_ptr_to_narrowoop(), "should have got back a narrow oop");
- return new (C) LoadKlassNode(ctl, mem, adr, at, tk, MemNode::unordered);
+ return new LoadKlassNode(ctl, mem, adr, at, tk, MemNode::unordered);
}
//------------------------------Value------------------------------------------
@@ -2255,7 +2255,7 @@ Node* LoadNKlassNode::Identity( PhaseTransform *phase ) {
if( t->isa_narrowklass()) return x;
assert (!t->isa_narrowoop(), "no narrow oop here");
- return phase->transform(new (phase->C) EncodePKlassNode(x, t->make_narrowklass()));
+ return phase->transform(new EncodePKlassNode(x, t->make_narrowklass()));
}
//------------------------------Value-----------------------------------------
@@ -2350,29 +2350,29 @@ StoreNode* StoreNode::make(PhaseGVN& gvn, Node* ctl, Node* mem, Node* adr, const
switch (bt) {
case T_BOOLEAN:
- case T_BYTE: return new (C) StoreBNode(ctl, mem, adr, adr_type, val, mo);
- case T_INT: return new (C) StoreINode(ctl, mem, adr, adr_type, val, mo);
+ case T_BYTE: return new StoreBNode(ctl, mem, adr, adr_type, val, mo);
+ case T_INT: return new StoreINode(ctl, mem, adr, adr_type, val, mo);
case T_CHAR:
- case T_SHORT: return new (C) StoreCNode(ctl, mem, adr, adr_type, val, mo);
- case T_LONG: return new (C) StoreLNode(ctl, mem, adr, adr_type, val, mo);
- case T_FLOAT: return new (C) StoreFNode(ctl, mem, adr, adr_type, val, mo);
- case T_DOUBLE: return new (C) StoreDNode(ctl, mem, adr, adr_type, val, mo);
+ case T_SHORT: return new StoreCNode(ctl, mem, adr, adr_type, val, mo);
+ case T_LONG: return new StoreLNode(ctl, mem, adr, adr_type, val, mo);
+ case T_FLOAT: return new StoreFNode(ctl, mem, adr, adr_type, val, mo);
+ case T_DOUBLE: return new StoreDNode(ctl, mem, adr, adr_type, val, mo);
case T_METADATA:
case T_ADDRESS:
case T_OBJECT:
#ifdef _LP64
if (adr->bottom_type()->is_ptr_to_narrowoop()) {
- val = gvn.transform(new (C) EncodePNode(val, val->bottom_type()->make_narrowoop()));
- return new (C) StoreNNode(ctl, mem, adr, adr_type, val, mo);
+ val = gvn.transform(new EncodePNode(val, val->bottom_type()->make_narrowoop()));
+ return new StoreNNode(ctl, mem, adr, adr_type, val, mo);
} else if (adr->bottom_type()->is_ptr_to_narrowklass() ||
(UseCompressedClassPointers && val->bottom_type()->isa_klassptr() &&
adr->bottom_type()->isa_rawptr())) {
- val = gvn.transform(new (C) EncodePKlassNode(val, val->bottom_type()->make_narrowklass()));
- return new (C) StoreNKlassNode(ctl, mem, adr, adr_type, val, mo);
+ val = gvn.transform(new EncodePKlassNode(val, val->bottom_type()->make_narrowklass()));
+ return new StoreNKlassNode(ctl, mem, adr, adr_type, val, mo);
}
#endif
{
- return new (C) StorePNode(ctl, mem, adr, adr_type, val, mo);
+ return new StorePNode(ctl, mem, adr, adr_type, val, mo);
}
}
ShouldNotReachHere();
@@ -2381,12 +2381,12 @@ StoreNode* StoreNode::make(PhaseGVN& gvn, Node* ctl, Node* mem, Node* adr, const
StoreLNode* StoreLNode::make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, Node* val, MemOrd mo) {
bool require_atomic = true;
- return new (C) StoreLNode(ctl, mem, adr, adr_type, val, mo, require_atomic);
+ return new StoreLNode(ctl, mem, adr, adr_type, val, mo, require_atomic);
}
StoreDNode* StoreDNode::make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, Node* val, MemOrd mo) {
bool require_atomic = true;
- return new (C) StoreDNode(ctl, mem, adr, adr_type, val, mo, require_atomic);
+ return new StoreDNode(ctl, mem, adr, adr_type, val, mo, require_atomic);
}
@@ -2779,12 +2779,12 @@ Node *ClearArrayNode::Ideal(PhaseGVN *phase, bool can_reshape){
Node *zero = phase->makecon(TypeLong::ZERO);
Node *off = phase->MakeConX(BytesPerLong);
- mem = new (phase->C) StoreLNode(in(0),mem,adr,atp,zero,MemNode::unordered,false);
+ mem = new StoreLNode(in(0),mem,adr,atp,zero,MemNode::unordered,false);
count--;
while( count-- ) {
mem = phase->transform(mem);
- adr = phase->transform(new (phase->C) AddPNode(base,adr,off));
- mem = new (phase->C) StoreLNode(in(0),mem,adr,atp,zero,MemNode::unordered,false);
+ adr = phase->transform(new AddPNode(base,adr,off));
+ mem = new StoreLNode(in(0),mem,adr,atp,zero,MemNode::unordered,false);
}
return mem;
}
@@ -2825,7 +2825,7 @@ Node* ClearArrayNode::clear_memory(Node* ctl, Node* mem, Node* dest,
int unit = BytesPerLong;
if ((offset % unit) != 0) {
- Node* adr = new (C) AddPNode(dest, dest, phase->MakeConX(offset));
+ Node* adr = new AddPNode(dest, dest, phase->MakeConX(offset));
adr = phase->transform(adr);
const TypePtr* atp = TypeRawPtr::BOTTOM;
mem = StoreNode::make(*phase, ctl, mem, adr, atp, phase->zerocon(T_INT), T_INT, MemNode::unordered);
@@ -2855,14 +2855,14 @@ Node* ClearArrayNode::clear_memory(Node* ctl, Node* mem, Node* dest,
// Scale to the unit required by the CPU:
if (!Matcher::init_array_count_is_in_bytes) {
Node* shift = phase->intcon(exact_log2(unit));
- zbase = phase->transform( new(C) URShiftXNode(zbase, shift) );
- zend = phase->transform( new(C) URShiftXNode(zend, shift) );
+ zbase = phase->transform(new URShiftXNode(zbase, shift) );
+ zend = phase->transform(new URShiftXNode(zend, shift) );
}
// Bulk clear double-words
- Node* zsize = phase->transform( new(C) SubXNode(zend, zbase) );
- Node* adr = phase->transform( new(C) AddPNode(dest, dest, start_offset) );
- mem = new (C) ClearArrayNode(ctl, mem, zsize, adr);
+ Node* zsize = phase->transform(new SubXNode(zend, zbase) );
+ Node* adr = phase->transform(new AddPNode(dest, dest, start_offset) );
+ mem = new ClearArrayNode(ctl, mem, zsize, adr);
return phase->transform(mem);
}
@@ -2886,7 +2886,7 @@ Node* ClearArrayNode::clear_memory(Node* ctl, Node* mem, Node* dest,
start_offset, phase->MakeConX(done_offset), phase);
}
if (done_offset < end_offset) { // emit the final 32-bit store
- Node* adr = new (C) AddPNode(dest, dest, phase->MakeConX(done_offset));
+ Node* adr = new AddPNode(dest, dest, phase->MakeConX(done_offset));
adr = phase->transform(adr);
const TypePtr* atp = TypeRawPtr::BOTTOM;
mem = StoreNode::make(*phase, ctl, mem, adr, atp, phase->zerocon(T_INT), T_INT, MemNode::unordered);
@@ -2920,16 +2920,16 @@ uint MemBarNode::cmp( const Node &n ) const {
//------------------------------make-------------------------------------------
MemBarNode* MemBarNode::make(Compile* C, int opcode, int atp, Node* pn) {
switch (opcode) {
- case Op_MemBarAcquire: return new(C) MemBarAcquireNode(C, atp, pn);
- case Op_LoadFence: return new(C) LoadFenceNode(C, atp, pn);
- case Op_MemBarRelease: return new(C) MemBarReleaseNode(C, atp, pn);
- case Op_StoreFence: return new(C) StoreFenceNode(C, atp, pn);
- case Op_MemBarAcquireLock: return new(C) MemBarAcquireLockNode(C, atp, pn);
- case Op_MemBarReleaseLock: return new(C) MemBarReleaseLockNode(C, atp, pn);
- case Op_MemBarVolatile: return new(C) MemBarVolatileNode(C, atp, pn);
- case Op_MemBarCPUOrder: return new(C) MemBarCPUOrderNode(C, atp, pn);
- case Op_Initialize: return new(C) InitializeNode(C, atp, pn);
- case Op_MemBarStoreStore: return new(C) MemBarStoreStoreNode(C, atp, pn);
+ case Op_MemBarAcquire: return new MemBarAcquireNode(C, atp, pn);
+ case Op_LoadFence: return new LoadFenceNode(C, atp, pn);
+ case Op_MemBarRelease: return new MemBarReleaseNode(C, atp, pn);
+ case Op_StoreFence: return new StoreFenceNode(C, atp, pn);
+ case Op_MemBarAcquireLock: return new MemBarAcquireLockNode(C, atp, pn);
+ case Op_MemBarReleaseLock: return new MemBarReleaseLockNode(C, atp, pn);
+ case Op_MemBarVolatile: return new MemBarVolatileNode(C, atp, pn);
+ case Op_MemBarCPUOrder: return new MemBarCPUOrderNode(C, atp, pn);
+ case Op_Initialize: return new InitializeNode(C, atp, pn);
+ case Op_MemBarStoreStore: return new MemBarStoreStoreNode(C, atp, pn);
default: ShouldNotReachHere(); return NULL;
}
}
@@ -2992,7 +2992,7 @@ Node *MemBarNode::Ideal(PhaseGVN *phase, bool can_reshape) {
igvn->replace_node(proj_out(TypeFunc::Control), in(TypeFunc::Control));
// Must return either the original node (now dead) or a new node
// (Do not return a top here, since that would break the uniqueness of top.)
- return new (phase->C) ConINode(TypeInt::ZERO);
+ return new ConINode(TypeInt::ZERO);
}
}
return NULL;
@@ -3012,7 +3012,7 @@ Node *MemBarNode::match( const ProjNode *proj, const Matcher *m ) {
switch (proj->_con) {
case TypeFunc::Control:
case TypeFunc::Memory:
- return new (m->C) MachProjNode(this,proj->_con,RegMask::Empty,MachProjNode::unmatched_proj);
+ return new MachProjNode(this,proj->_con,RegMask::Empty,MachProjNode::unmatched_proj);
}
ShouldNotReachHere();
return NULL;
@@ -3438,7 +3438,7 @@ Node* InitializeNode::make_raw_address(intptr_t offset,
Node* addr = in(RawAddress);
if (offset != 0) {
Compile* C = phase->C;
- addr = phase->transform( new (C) AddPNode(C->top(), addr,
+ addr = phase->transform( new AddPNode(C->top(), addr,
phase->MakeConX(offset)) );
}
return addr;
@@ -4127,7 +4127,7 @@ MergeMemNode::MergeMemNode(Node *new_base) : Node(1+Compile::AliasIdxRaw) {
// Make a new, untransformed MergeMem with the same base as 'mem'.
// If mem is itself a MergeMem, populate the result with the same edges.
MergeMemNode* MergeMemNode::make(Compile* C, Node* mem) {
- return new(C) MergeMemNode(mem);
+ return new MergeMemNode(mem);
}
//------------------------------cmp--------------------------------------------
diff --git a/hotspot/src/share/vm/opto/movenode.cpp b/hotspot/src/share/vm/opto/movenode.cpp
index bf2a83712c1..b7e32deb2e4 100644
--- a/hotspot/src/share/vm/opto/movenode.cpp
+++ b/hotspot/src/share/vm/opto/movenode.cpp
@@ -160,13 +160,13 @@ const Type *CMoveNode::Value( PhaseTransform *phase ) const {
// from the inputs we do not need to specify it here.
CMoveNode *CMoveNode::make( Compile *C, Node *c, Node *bol, Node *left, Node *right, const Type *t ) {
switch( t->basic_type() ) {
- case T_INT: return new (C) CMoveINode( bol, left, right, t->is_int() );
- case T_FLOAT: return new (C) CMoveFNode( bol, left, right, t );
- case T_DOUBLE: return new (C) CMoveDNode( bol, left, right, t );
- case T_LONG: return new (C) CMoveLNode( bol, left, right, t->is_long() );
- case T_OBJECT: return new (C) CMovePNode( c, bol, left, right, t->is_oopptr() );
- case T_ADDRESS: return new (C) CMovePNode( c, bol, left, right, t->is_ptr() );
- case T_NARROWOOP: return new (C) CMoveNNode( c, bol, left, right, t );
+ case T_INT: return new CMoveINode( bol, left, right, t->is_int() );
+ case T_FLOAT: return new CMoveFNode( bol, left, right, t );
+ case T_DOUBLE: return new CMoveDNode( bol, left, right, t );
+ case T_LONG: return new CMoveLNode( bol, left, right, t->is_long() );
+ case T_OBJECT: return new CMovePNode( c, bol, left, right, t->is_oopptr() );
+ case T_ADDRESS: return new CMovePNode( c, bol, left, right, t->is_ptr() );
+ case T_NARROWOOP: return new CMoveNNode( c, bol, left, right, t );
default:
ShouldNotReachHere();
return NULL;
@@ -233,9 +233,9 @@ Node *CMoveINode::Ideal(PhaseGVN *phase, bool can_reshape) {
#ifndef PRODUCT
if( PrintOpto ) tty->print_cr("CMOV to I2B");
#endif
- Node *n = new (phase->C) Conv2BNode( cmp->in(1) );
+ Node *n = new Conv2BNode( cmp->in(1) );
if( flip )
- n = new (phase->C) XorINode( phase->transform(n), phase->intcon(1) );
+ n = new XorINode( phase->transform(n), phase->intcon(1) );
return n;
}
@@ -289,9 +289,9 @@ Node *CMoveFNode::Ideal(PhaseGVN *phase, bool can_reshape) {
sub->in(2) != X ||
phase->type(sub->in(1)) != TypeF::ZERO ) return NULL;
- Node *abs = new (phase->C) AbsFNode( X );
+ Node *abs = new AbsFNode( X );
if( flip )
- abs = new (phase->C) SubFNode(sub->in(1), phase->transform(abs));
+ abs = new SubFNode(sub->in(1), phase->transform(abs));
return abs;
}
@@ -345,9 +345,9 @@ Node *CMoveDNode::Ideal(PhaseGVN *phase, bool can_reshape) {
sub->in(2) != X ||
phase->type(sub->in(1)) != TypeD::ZERO ) return NULL;
- Node *abs = new (phase->C) AbsDNode( X );
+ Node *abs = new AbsDNode( X );
if( flip )
- abs = new (phase->C) SubDNode(sub->in(1), phase->transform(abs));
+ abs = new SubDNode(sub->in(1), phase->transform(abs));
return abs;
}
diff --git a/hotspot/src/share/vm/opto/mulnode.cpp b/hotspot/src/share/vm/opto/mulnode.cpp
index 056d8c5043a..1406f8364a6 100644
--- a/hotspot/src/share/vm/opto/mulnode.cpp
+++ b/hotspot/src/share/vm/opto/mulnode.cpp
@@ -199,22 +199,22 @@ Node *MulINode::Ideal(PhaseGVN *phase, bool can_reshape) {
Node *res = NULL;
jint bit1 = con & -con; // Extract low bit
if( bit1 == con ) { // Found a power of 2?
- res = new (phase->C) LShiftINode( in(1), phase->intcon(log2_intptr(bit1)) );
+ res = new LShiftINode( in(1), phase->intcon(log2_intptr(bit1)) );
} else {
// Check for constant with 2 bits set
jint bit2 = con-bit1;
bit2 = bit2 & -bit2; // Extract 2nd bit
if( bit2 + bit1 == con ) { // Found all bits in con?
- Node *n1 = phase->transform( new (phase->C) LShiftINode( in(1), phase->intcon(log2_intptr(bit1)) ) );
- Node *n2 = phase->transform( new (phase->C) LShiftINode( in(1), phase->intcon(log2_intptr(bit2)) ) );
- res = new (phase->C) AddINode( n2, n1 );
+ Node *n1 = phase->transform( new LShiftINode( in(1), phase->intcon(log2_intptr(bit1)) ) );
+ Node *n2 = phase->transform( new LShiftINode( in(1), phase->intcon(log2_intptr(bit2)) ) );
+ res = new AddINode( n2, n1 );
} else if (is_power_of_2(con+1)) {
// Sleezy: power-of-2 -1. Next time be generic.
jint temp = (jint) (con + 1);
- Node *n1 = phase->transform( new (phase->C) LShiftINode( in(1), phase->intcon(log2_intptr(temp)) ) );
- res = new (phase->C) SubINode( n1, in(1) );
+ Node *n1 = phase->transform( new LShiftINode( in(1), phase->intcon(log2_intptr(temp)) ) );
+ res = new SubINode( n1, in(1) );
} else {
return MulNode::Ideal(phase, can_reshape);
}
@@ -222,7 +222,7 @@ Node *MulINode::Ideal(PhaseGVN *phase, bool can_reshape) {
if( sign_flip ) { // Need to negate result?
res = phase->transform(res);// Transform, before making the zero con
- res = new (phase->C) SubINode(phase->intcon(0),res);
+ res = new SubINode(phase->intcon(0),res);
}
return res; // Return final result
@@ -295,22 +295,22 @@ Node *MulLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
Node *res = NULL;
jlong bit1 = con & -con; // Extract low bit
if( bit1 == con ) { // Found a power of 2?
- res = new (phase->C) LShiftLNode( in(1), phase->intcon(log2_long(bit1)) );
+ res = new LShiftLNode( in(1), phase->intcon(log2_long(bit1)) );
} else {
// Check for constant with 2 bits set
jlong bit2 = con-bit1;
bit2 = bit2 & -bit2; // Extract 2nd bit
if( bit2 + bit1 == con ) { // Found all bits in con?
- Node *n1 = phase->transform( new (phase->C) LShiftLNode( in(1), phase->intcon(log2_long(bit1)) ) );
- Node *n2 = phase->transform( new (phase->C) LShiftLNode( in(1), phase->intcon(log2_long(bit2)) ) );
- res = new (phase->C) AddLNode( n2, n1 );
+ Node *n1 = phase->transform( new LShiftLNode( in(1), phase->intcon(log2_long(bit1)) ) );
+ Node *n2 = phase->transform( new LShiftLNode( in(1), phase->intcon(log2_long(bit2)) ) );
+ res = new AddLNode( n2, n1 );
} else if (is_power_of_2_long(con+1)) {
// Sleezy: power-of-2 -1. Next time be generic.
jlong temp = (jlong) (con + 1);
- Node *n1 = phase->transform( new (phase->C) LShiftLNode( in(1), phase->intcon(log2_long(temp)) ) );
- res = new (phase->C) SubLNode( n1, in(1) );
+ Node *n1 = phase->transform( new LShiftLNode( in(1), phase->intcon(log2_long(temp)) ) );
+ res = new SubLNode( n1, in(1) );
} else {
return MulNode::Ideal(phase, can_reshape);
}
@@ -318,7 +318,7 @@ Node *MulLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
if( sign_flip ) { // Need to negate result?
res = phase->transform(res);// Transform, before making the zero con
- res = new (phase->C) SubLNode(phase->longcon(0),res);
+ res = new SubLNode(phase->longcon(0),res);
}
return res; // Return final result
@@ -477,31 +477,31 @@ Node *AndINode::Ideal(PhaseGVN *phase, bool can_reshape) {
// Masking bits off of a Character? Hi bits are already zero.
if( lop == Op_LoadUS &&
(mask & 0xFFFF0000) ) // Can we make a smaller mask?
- return new (phase->C) AndINode(load,phase->intcon(mask&0xFFFF));
+ return new AndINode(load,phase->intcon(mask&0xFFFF));
// Masking bits off of a Short? Loading a Character does some masking
if (can_reshape &&
load->outcnt() == 1 && load->unique_out() == this) {
if (lop == Op_LoadS && (mask & 0xFFFF0000) == 0 ) {
- Node *ldus = new (phase->C) LoadUSNode(load->in(MemNode::Control),
- load->in(MemNode::Memory),
- load->in(MemNode::Address),
- load->adr_type(),
- TypeInt::CHAR, MemNode::unordered);
+ Node *ldus = new LoadUSNode(load->in(MemNode::Control),
+ load->in(MemNode::Memory),
+ load->in(MemNode::Address),
+ load->adr_type(),
+ TypeInt::CHAR, MemNode::unordered);
ldus = phase->transform(ldus);
- return new (phase->C) AndINode(ldus, phase->intcon(mask & 0xFFFF));
+ return new AndINode(ldus, phase->intcon(mask & 0xFFFF));
}
// Masking sign bits off of a Byte? Do an unsigned byte load plus
// an and.
if (lop == Op_LoadB && (mask & 0xFFFFFF00) == 0) {
- Node* ldub = new (phase->C) LoadUBNode(load->in(MemNode::Control),
- load->in(MemNode::Memory),
- load->in(MemNode::Address),
- load->adr_type(),
- TypeInt::UBYTE, MemNode::unordered);
+ Node* ldub = new LoadUBNode(load->in(MemNode::Control),
+ load->in(MemNode::Memory),
+ load->in(MemNode::Address),
+ load->adr_type(),
+ TypeInt::UBYTE, MemNode::unordered);
ldub = phase->transform(ldub);
- return new (phase->C) AndINode(ldub, phase->intcon(mask));
+ return new AndINode(ldub, phase->intcon(mask));
}
}
@@ -516,8 +516,8 @@ Node *AndINode::Ideal(PhaseGVN *phase, bool can_reshape) {
// bits survive. NO sign-extension bits survive the maskings.
if( (sign_bits_mask & mask) == 0 ) {
// Use zero-fill shift instead
- Node *zshift = phase->transform(new (phase->C) URShiftINode(load->in(1),load->in(2)));
- return new (phase->C) AndINode( zshift, in(2) );
+ Node *zshift = phase->transform(new URShiftINode(load->in(1),load->in(2)));
+ return new AndINode( zshift, in(2) );
}
}
}
@@ -527,7 +527,7 @@ Node *AndINode::Ideal(PhaseGVN *phase, bool can_reshape) {
// plus 1) and the mask is of the low order bit. Skip the negate.
if( lop == Op_SubI && mask == 1 && load->in(1) &&
phase->type(load->in(1)) == TypeInt::ZERO )
- return new (phase->C) AndINode( load->in(2), in(2) );
+ return new AndINode( load->in(2), in(2) );
return MulNode::Ideal(phase, can_reshape);
}
@@ -611,9 +611,9 @@ Node *AndLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
// value. This check includes UI2L masks (0x00000000FFFFFFFF) which
// would be optimized away later in Identity.
if (op == Op_ConvI2L && (mask & CONST64(0xFFFFFFFF80000000)) == 0) {
- Node* andi = new (phase->C) AndINode(in1->in(1), phase->intcon(mask));
+ Node* andi = new AndINode(in1->in(1), phase->intcon(mask));
andi = phase->transform(andi);
- return new (phase->C) ConvI2LNode(andi);
+ return new ConvI2LNode(andi);
}
// Masking off sign bits? Dont make them!
@@ -627,8 +627,8 @@ Node *AndLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
// bits survive. NO sign-extension bits survive the maskings.
if( (sign_bits_mask & mask) == 0 ) {
// Use zero-fill shift instead
- Node *zshift = phase->transform(new (phase->C) URShiftLNode(in1->in(1), in1->in(2)));
- return new (phase->C) AndLNode(zshift, in(2));
+ Node *zshift = phase->transform(new URShiftLNode(in1->in(1), in1->in(2)));
+ return new AndLNode(zshift, in(2));
}
}
}
@@ -666,9 +666,9 @@ Node *LShiftINode::Ideal(PhaseGVN *phase, bool can_reshape) {
// and 'i2b' patterns which typically fold into 'StoreC/StoreB'.
if( con < 16 ) {
// Compute X << con0
- Node *lsh = phase->transform( new (phase->C) LShiftINode( add1->in(1), in(2) ) );
+ Node *lsh = phase->transform( new LShiftINode( add1->in(1), in(2) ) );
// Compute X<C) AddINode( lsh, phase->intcon(t12->get_con() << con));
+ return new AddINode( lsh, phase->intcon(t12->get_con() << con));
}
}
}
@@ -677,7 +677,7 @@ Node *LShiftINode::Ideal(PhaseGVN *phase, bool can_reshape) {
if( (add1_op == Op_RShiftI || add1_op == Op_URShiftI ) &&
add1->in(2) == in(2) )
// Convert to "(x & -(1<C) AndINode(add1->in(1),phase->intcon( -(1<in(1),phase->intcon( -(1<>c0) & Y)<in(2) == in(2) ) {
// Convert to "(x & (Y<transform( new (phase->C) LShiftINode( add1->in(2), in(2) ) );
- return new (phase->C) AndINode( add2->in(1), y_sh );
+ Node *y_sh = phase->transform( new LShiftINode( add1->in(2), in(2) ) );
+ return new AndINode( add2->in(1), y_sh );
}
}
@@ -696,7 +696,7 @@ Node *LShiftINode::Ideal(PhaseGVN *phase, bool can_reshape) {
const jint bits_mask = right_n_bits(BitsPerJavaInteger-con);
if( add1_op == Op_AndI &&
phase->type(add1->in(2)) == TypeInt::make( bits_mask ) )
- return new (phase->C) LShiftINode( add1->in(1), in(2) );
+ return new LShiftINode( add1->in(1), in(2) );
return NULL;
}
@@ -776,9 +776,9 @@ Node *LShiftLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
const TypeLong *t12 = phase->type(add1->in(2))->isa_long();
if( t12 && t12->is_con() ){ // Left input is an add of a con?
// Compute X << con0
- Node *lsh = phase->transform( new (phase->C) LShiftLNode( add1->in(1), in(2) ) );
+ Node *lsh = phase->transform( new LShiftLNode( add1->in(1), in(2) ) );
// Compute X<C) AddLNode( lsh, phase->longcon(t12->get_con() << con));
+ return new AddLNode( lsh, phase->longcon(t12->get_con() << con));
}
}
@@ -786,7 +786,7 @@ Node *LShiftLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
if( (add1_op == Op_RShiftL || add1_op == Op_URShiftL ) &&
add1->in(2) == in(2) )
// Convert to "(x & -(1<C) AndLNode(add1->in(1),phase->longcon( -(CONST64(1)<in(1),phase->longcon( -(CONST64(1)<>c0) & Y)<in(2) == in(2) ) {
// Convert to "(x & (Y<transform( new (phase->C) LShiftLNode( add1->in(2), in(2) ) );
- return new (phase->C) AndLNode( add2->in(1), y_sh );
+ Node *y_sh = phase->transform( new LShiftLNode( add1->in(2), in(2) ) );
+ return new AndLNode( add2->in(1), y_sh );
}
}
@@ -805,7 +805,7 @@ Node *LShiftLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
const jlong bits_mask = ((jlong)CONST64(1) << (jlong)(BitsPerJavaLong - con)) - CONST64(1);
if( add1_op == Op_AndL &&
phase->type(add1->in(2)) == TypeLong::make( bits_mask ) )
- return new (phase->C) LShiftLNode( add1->in(1), in(2) );
+ return new LShiftLNode( add1->in(1), in(2) );
return NULL;
}
@@ -907,8 +907,8 @@ Node *RShiftINode::Ideal(PhaseGVN *phase, bool can_reshape) {
Node *x = mask->in(1);
jint maskbits = t3->get_con();
// Convert to "(x >> shift) & (mask >> shift)"
- Node *shr_nomask = phase->transform( new (phase->C) RShiftINode(mask->in(1), in(2)) );
- return new (phase->C) AndINode(shr_nomask, phase->intcon( maskbits >> shift));
+ Node *shr_nomask = phase->transform( new RShiftINode(mask->in(1), in(2)) );
+ return new AndINode(shr_nomask, phase->intcon( maskbits >> shift));
}
// Check for "(short[i] <<16)>>16" which simply sign-extends
@@ -933,11 +933,11 @@ Node *RShiftINode::Ideal(PhaseGVN *phase, bool can_reshape) {
ld->Opcode() == Op_LoadUS &&
ld->outcnt() == 1 && ld->unique_out() == shl)
// Replace zero-extension-load with sign-extension-load
- return new (phase->C) LoadSNode( ld->in(MemNode::Control),
- ld->in(MemNode::Memory),
- ld->in(MemNode::Address),
- ld->adr_type(), TypeInt::SHORT,
- MemNode::unordered);
+ return new LoadSNode( ld->in(MemNode::Control),
+ ld->in(MemNode::Memory),
+ ld->in(MemNode::Address),
+ ld->adr_type(), TypeInt::SHORT,
+ MemNode::unordered);
}
// Check for "(byte[i] <<24)>>24" which simply sign-extends
@@ -1119,7 +1119,7 @@ Node *URShiftINode::Ideal(PhaseGVN *phase, bool can_reshape) {
const int con2 = t12->get_con() & 31; // Shift count is always masked
const int con3 = con+con2;
if( con3 < 32 ) // Only merge shifts if total is < 32
- return new (phase->C) URShiftINode( in(1)->in(1), phase->intcon(con3) );
+ return new URShiftINode( in(1)->in(1), phase->intcon(con3) );
}
}
@@ -1132,9 +1132,9 @@ Node *URShiftINode::Ideal(PhaseGVN *phase, bool can_reshape) {
Node *lshl = add->in(1);
if( lshl->Opcode() == Op_LShiftI &&
phase->type(lshl->in(2)) == t2 ) {
- Node *y_z = phase->transform( new (phase->C) URShiftINode(add->in(2),in(2)) );
- Node *sum = phase->transform( new (phase->C) AddINode( lshl->in(1), y_z ) );
- return new (phase->C) AndINode( sum, phase->intcon(mask) );
+ Node *y_z = phase->transform( new URShiftINode(add->in(2),in(2)) );
+ Node *sum = phase->transform( new AddINode( lshl->in(1), y_z ) );
+ return new AndINode( sum, phase->intcon(mask) );
}
}
@@ -1147,8 +1147,8 @@ Node *URShiftINode::Ideal(PhaseGVN *phase, bool can_reshape) {
if( t3 && t3->is_con() ) { // Right input is a constant
jint mask2 = t3->get_con();
mask2 >>= con; // *signed* shift downward (high-order zeroes do not help)
- Node *newshr = phase->transform( new (phase->C) URShiftINode(andi->in(1), in(2)) );
- return new (phase->C) AndINode(newshr, phase->intcon(mask2));
+ Node *newshr = phase->transform( new URShiftINode(andi->in(1), in(2)) );
+ return new AndINode(newshr, phase->intcon(mask2));
// The negative values are easier to materialize than positive ones.
// A typical case from address arithmetic is ((x & ~15) >> 4).
// It's better to change that to ((x >> 4) & ~0) versus
@@ -1160,7 +1160,7 @@ Node *URShiftINode::Ideal(PhaseGVN *phase, bool can_reshape) {
Node *shl = in(1);
if( in1_op == Op_LShiftI &&
phase->type(shl->in(2)) == t2 )
- return new (phase->C) AndINode( shl->in(1), phase->intcon(mask) );
+ return new AndINode( shl->in(1), phase->intcon(mask) );
return NULL;
}
@@ -1265,9 +1265,9 @@ Node *URShiftLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
Node *lshl = add->in(1);
if( lshl->Opcode() == Op_LShiftL &&
phase->type(lshl->in(2)) == t2 ) {
- Node *y_z = phase->transform( new (phase->C) URShiftLNode(add->in(2),in(2)) );
- Node *sum = phase->transform( new (phase->C) AddLNode( lshl->in(1), y_z ) );
- return new (phase->C) AndLNode( sum, phase->longcon(mask) );
+ Node *y_z = phase->transform( new URShiftLNode(add->in(2),in(2)) );
+ Node *sum = phase->transform( new AddLNode( lshl->in(1), y_z ) );
+ return new AndLNode( sum, phase->longcon(mask) );
}
}
@@ -1280,8 +1280,8 @@ Node *URShiftLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
if( t3 && t3->is_con() ) { // Right input is a constant
jlong mask2 = t3->get_con();
mask2 >>= con; // *signed* shift downward (high-order zeroes do not help)
- Node *newshr = phase->transform( new (phase->C) URShiftLNode(andi->in(1), in(2)) );
- return new (phase->C) AndLNode(newshr, phase->longcon(mask2));
+ Node *newshr = phase->transform( new URShiftLNode(andi->in(1), in(2)) );
+ return new AndLNode(newshr, phase->longcon(mask2));
}
}
@@ -1289,7 +1289,7 @@ Node *URShiftLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
Node *shl = in(1);
if( shl->Opcode() == Op_LShiftL &&
phase->type(shl->in(2)) == t2 )
- return new (phase->C) AndLNode( shl->in(1), phase->longcon(mask) );
+ return new AndLNode( shl->in(1), phase->longcon(mask) );
return NULL;
}
diff --git a/hotspot/src/share/vm/opto/node.cpp b/hotspot/src/share/vm/opto/node.cpp
index cec7f0d517b..c52ac9895ab 100644
--- a/hotspot/src/share/vm/opto/node.cpp
+++ b/hotspot/src/share/vm/opto/node.cpp
@@ -274,23 +274,6 @@ void DUIterator_Last::verify_step(uint num_edges) {
// The value NULL is reserved for the top node only.
#define NO_OUT_ARRAY ((Node**)-1)
-// This funny expression handshakes with Node::operator new
-// to pull Compile::current out of the new node's _out field,
-// and then calls a subroutine which manages most field
-// initializations. The only one which is tricky is the
-// _idx field, which is const, and so must be initialized
-// by a return value, not an assignment.
-//
-// (Aren't you thankful that Java finals don't require so many tricks?)
-#define IDX_INIT(req) this->Init((req), (Compile*) this->_out)
-#ifdef _MSC_VER // the IDX_INIT hack falls foul of warning C4355
-#pragma warning( disable:4355 ) // 'this' : used in base member initializer list
-#endif
-#ifdef __clang__
-#pragma clang diagnostic push
-#pragma GCC diagnostic ignored "-Wuninitialized"
-#endif
-
// Out-of-line code from node constructors.
// Executed only when extra debug info. is being passed around.
static void init_node_notes(Compile* C, int idx, Node_Notes* nn) {
@@ -298,8 +281,8 @@ static void init_node_notes(Compile* C, int idx, Node_Notes* nn) {
}
// Shared initialization code.
-inline int Node::Init(int req, Compile* C) {
- assert(Compile::current() == C, "must use operator new(Compile*)");
+inline int Node::Init(int req) {
+ Compile* C = Compile::current();
int idx = C->next_unique();
// Allocate memory for the necessary number of edges.
@@ -328,7 +311,7 @@ inline int Node::Init(int req, Compile* C) {
//------------------------------Node-------------------------------------------
// Create a Node, with a given number of required edges.
Node::Node(uint req)
- : _idx(IDX_INIT(req))
+ : _idx(Init(req))
{
assert( req < (uint)(MaxNodeLimit - NodeLimitFudgeFactor), "Input limit exceeded" );
debug_only( verify_construction() );
@@ -347,7 +330,7 @@ Node::Node(uint req)
//------------------------------Node-------------------------------------------
Node::Node(Node *n0)
- : _idx(IDX_INIT(1))
+ : _idx(Init(1))
{
debug_only( verify_construction() );
NOT_PRODUCT(nodes_created++);
@@ -359,7 +342,7 @@ Node::Node(Node *n0)
//------------------------------Node-------------------------------------------
Node::Node(Node *n0, Node *n1)
- : _idx(IDX_INIT(2))
+ : _idx(Init(2))
{
debug_only( verify_construction() );
NOT_PRODUCT(nodes_created++);
@@ -373,7 +356,7 @@ Node::Node(Node *n0, Node *n1)
//------------------------------Node-------------------------------------------
Node::Node(Node *n0, Node *n1, Node *n2)
- : _idx(IDX_INIT(3))
+ : _idx(Init(3))
{
debug_only( verify_construction() );
NOT_PRODUCT(nodes_created++);
@@ -389,7 +372,7 @@ Node::Node(Node *n0, Node *n1, Node *n2)
//------------------------------Node-------------------------------------------
Node::Node(Node *n0, Node *n1, Node *n2, Node *n3)
- : _idx(IDX_INIT(4))
+ : _idx(Init(4))
{
debug_only( verify_construction() );
NOT_PRODUCT(nodes_created++);
@@ -407,7 +390,7 @@ Node::Node(Node *n0, Node *n1, Node *n2, Node *n3)
//------------------------------Node-------------------------------------------
Node::Node(Node *n0, Node *n1, Node *n2, Node *n3, Node *n4)
- : _idx(IDX_INIT(5))
+ : _idx(Init(5))
{
debug_only( verify_construction() );
NOT_PRODUCT(nodes_created++);
@@ -428,7 +411,7 @@ Node::Node(Node *n0, Node *n1, Node *n2, Node *n3, Node *n4)
//------------------------------Node-------------------------------------------
Node::Node(Node *n0, Node *n1, Node *n2, Node *n3,
Node *n4, Node *n5)
- : _idx(IDX_INIT(6))
+ : _idx(Init(6))
{
debug_only( verify_construction() );
NOT_PRODUCT(nodes_created++);
@@ -451,7 +434,7 @@ Node::Node(Node *n0, Node *n1, Node *n2, Node *n3,
//------------------------------Node-------------------------------------------
Node::Node(Node *n0, Node *n1, Node *n2, Node *n3,
Node *n4, Node *n5, Node *n6)
- : _idx(IDX_INIT(7))
+ : _idx(Init(7))
{
debug_only( verify_construction() );
NOT_PRODUCT(nodes_created++);
@@ -1066,15 +1049,15 @@ const Type *Node::Value( PhaseTransform * ) const {
// set_req(2, phase->intcon(7));
// return this;
// Example: reshape "X*4" into "X<<2"
-// return new (C) LShiftINode(in(1), phase->intcon(2));
+// return new LShiftINode(in(1), phase->intcon(2));
//
// You must call 'phase->transform(X)' on any new Nodes X you make, except
// for the returned root node. Example: reshape "X*31" with "(X<<5)-X".
-// Node *shift=phase->transform(new(C)LShiftINode(in(1),phase->intcon(5)));
-// return new (C) AddINode(shift, in(1));
+// Node *shift=phase->transform(new LShiftINode(in(1),phase->intcon(5)));
+// return new AddINode(shift, in(1));
//
// When making a Node for a constant use 'phase->makecon' or 'phase->intcon'.
-// These forms are faster than 'phase->transform(new (C) ConNode())' and Do
+// These forms are faster than 'phase->transform(new ConNode())' and Do
// The Right Thing with def-use info.
//
// You cannot bury the 'this' Node inside of a graph reshape. If the reshaped
diff --git a/hotspot/src/share/vm/opto/node.hpp b/hotspot/src/share/vm/opto/node.hpp
index 67db16f154b..5bb9c6873d7 100644
--- a/hotspot/src/share/vm/opto/node.hpp
+++ b/hotspot/src/share/vm/opto/node.hpp
@@ -208,14 +208,12 @@ public:
// field is a local cache of a value defined in some "program fragment" for
// which these Nodes are just a part of.
- // New Operator that takes a Compile pointer, this will eventually
- // be the "new" New operator.
- inline void* operator new( size_t x, Compile* C) throw() {
+ inline void* operator new(size_t x) throw() {
+ Compile* C = Compile::current();
Node* n = (Node*)C->node_arena()->Amalloc_D(x);
#ifdef ASSERT
n->_in = (Node**)n; // magic cookie for assertion check
#endif
- n->_out = (Node**)C;
return (void*)n;
}
@@ -259,7 +257,7 @@ private:
// Puts initial values in all Node fields except _idx.
// Returns the initial value for _idx, which cannot
// be initialized by assignment.
- inline int Init(int req, Compile* C);
+ inline int Init(int req);
//----------------- input edge handling
protected:
diff --git a/hotspot/src/share/vm/opto/output.cpp b/hotspot/src/share/vm/opto/output.cpp
index d47912f208c..be29ce452f8 100644
--- a/hotspot/src/share/vm/opto/output.cpp
+++ b/hotspot/src/share/vm/opto/output.cpp
@@ -67,7 +67,7 @@ void Compile::Output() {
const StartNode *start = entry->head()->as_Start();
// Replace StartNode with prolog
- MachPrologNode *prolog = new (this) MachPrologNode();
+ MachPrologNode *prolog = new MachPrologNode();
entry->map_node(prolog, 0);
_cfg->map_node_to_block(prolog, entry);
_cfg->unmap_node_from_block(start); // start is no longer in any block
@@ -77,12 +77,12 @@ void Compile::Output() {
if( is_osr_compilation() ) {
if( PoisonOSREntry ) {
// TODO: Should use a ShouldNotReachHereNode...
- _cfg->insert( broot, 0, new (this) MachBreakpointNode() );
+ _cfg->insert( broot, 0, new MachBreakpointNode() );
}
} else {
if( _method && !_method->flags().is_static() ) {
// Insert unvalidated entry point
- _cfg->insert( broot, 0, new (this) MachUEPNode() );
+ _cfg->insert( broot, 0, new MachUEPNode() );
}
}
@@ -98,7 +98,7 @@ void Compile::Output() {
) {
// checking for _method means that OptoBreakpoint does not apply to
// runtime stubs or frame converters
- _cfg->insert( entry, 1, new (this) MachBreakpointNode() );
+ _cfg->insert( entry, 1, new MachBreakpointNode() );
}
// Insert epilogs before every return
@@ -107,7 +107,7 @@ void Compile::Output() {
if (!block->is_connector() && block->non_connector_successor(0) == _cfg->get_root_block()) { // Found a program exit point?
Node* m = block->end();
if (m->is_Mach() && m->as_Mach()->ideal_Opcode() != Op_Halt) {
- MachEpilogNode* epilog = new (this) MachEpilogNode(m->as_Mach()->ideal_Opcode() == Op_Return);
+ MachEpilogNode* epilog = new MachEpilogNode(m->as_Mach()->ideal_Opcode() == Op_Return);
block->add_inst(epilog);
_cfg->map_node_to_block(epilog, block);
}
@@ -268,7 +268,7 @@ void Compile::Insert_zap_nodes() {
Node* Compile::call_zap_node(MachSafePointNode* node_to_check, int block_no) {
const TypeFunc *tf = OptoRuntime::zap_dead_locals_Type();
CallStaticJavaNode* ideal_node =
- new (this) CallStaticJavaNode( tf,
+ new CallStaticJavaNode( tf,
OptoRuntime::zap_dead_locals_stub(_method->flags().is_native()),
"call zap dead locals stub", 0, TypePtr::BOTTOM);
// We need to copy the OopMap from the site we're zapping at.
@@ -368,7 +368,7 @@ void Compile::shorten_branches(uint* blk_starts, int& code_size, int& reloc_size
// Step one, perform a pessimistic sizing pass.
uint last_call_adr = max_juint;
uint last_avoid_back_to_back_adr = max_juint;
- uint nop_size = (new (this) MachNopNode())->size(_regalloc);
+ uint nop_size = (new MachNopNode())->size(_regalloc);
for (uint i = 0; i < nblocks; i++) { // For all blocks
Block* block = _cfg->get_block(i);
@@ -1201,7 +1201,7 @@ void Compile::fill_buffer(CodeBuffer* cb, uint* blk_starts) {
uint *call_returns = NEW_RESOURCE_ARRAY(uint, nblocks+1);
uint return_offset = 0;
- int nop_size = (new (this) MachNopNode())->size(_regalloc);
+ int nop_size = (new MachNopNode())->size(_regalloc);
int previous_offset = 0;
int current_offset = 0;
@@ -1327,7 +1327,7 @@ void Compile::fill_buffer(CodeBuffer* cb, uint* blk_starts) {
if(padding > 0) {
assert((padding % nop_size) == 0, "padding is not a multiple of NOP size");
int nops_cnt = padding / nop_size;
- MachNode *nop = new (this) MachNopNode(nops_cnt);
+ MachNode *nop = new MachNopNode(nops_cnt);
block->insert_node(nop, j++);
last_inst++;
_cfg->map_node_to_block(nop, block);
@@ -1413,7 +1413,7 @@ void Compile::fill_buffer(CodeBuffer* cb, uint* blk_starts) {
assert((br_size - new_size) >= (int)nop_size, "short_branch size should be smaller");
// Insert padding between avoid_back_to_back branches.
if (needs_padding && replacement->avoid_back_to_back(MachNode::AVOID_BEFORE)) {
- MachNode *nop = new (this) MachNopNode();
+ MachNode *nop = new MachNopNode();
block->insert_node(nop, j++);
_cfg->map_node_to_block(nop, block);
last_inst++;
@@ -1573,7 +1573,7 @@ void Compile::fill_buffer(CodeBuffer* cb, uint* blk_starts) {
Block *nb = _cfg->get_block(i + 1);
int padding = nb->alignment_padding(current_offset);
if( padding > 0 ) {
- MachNode *nop = new (this) MachNopNode(padding / nop_size);
+ MachNode *nop = new MachNopNode(padding / nop_size);
block->insert_node(nop, block->number_of_nodes());
_cfg->map_node_to_block(nop, block);
nop->emit(*cb, _regalloc);
@@ -1786,7 +1786,7 @@ Scheduling::Scheduling(Arena *arena, Compile &compile)
#endif
{
// Create a MachNopNode
- _nop = new (&compile) MachNopNode();
+ _nop = new MachNopNode();
// Now that the nops are in the array, save the count
// (but allow entries for the nops)
@@ -2688,7 +2688,7 @@ void Scheduling::anti_do_def( Block *b, Node *def, OptoReg::Name def_reg, int is
if ( _pinch_free_list.size() > 0) {
pinch = _pinch_free_list.pop();
} else {
- pinch = new (_cfg->C) Node(1); // Pinch point to-be
+ pinch = new Node(1); // Pinch point to-be
}
if (pinch->_idx >= _regalloc->node_regs_max_index()) {
_cfg->C->record_method_not_compilable("too many D-U pinch points");
diff --git a/hotspot/src/share/vm/opto/parse1.cpp b/hotspot/src/share/vm/opto/parse1.cpp
index 6fea7130786..838c9b08d7b 100644
--- a/hotspot/src/share/vm/opto/parse1.cpp
+++ b/hotspot/src/share/vm/opto/parse1.cpp
@@ -109,10 +109,10 @@ Node *Parse::fetch_interpreter_state(int index,
// doubles on Sparc. Intel can handle them just fine directly.
Node *l;
switch (bt) { // Signature is flattened
- case T_INT: l = new (C) LoadINode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeInt::INT, MemNode::unordered); break;
- case T_FLOAT: l = new (C) LoadFNode(ctl, mem, adr, TypeRawPtr::BOTTOM, Type::FLOAT, MemNode::unordered); break;
- case T_ADDRESS: l = new (C) LoadPNode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM, MemNode::unordered); break;
- case T_OBJECT: l = new (C) LoadPNode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeInstPtr::BOTTOM, MemNode::unordered); break;
+ case T_INT: l = new LoadINode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeInt::INT, MemNode::unordered); break;
+ case T_FLOAT: l = new LoadFNode(ctl, mem, adr, TypeRawPtr::BOTTOM, Type::FLOAT, MemNode::unordered); break;
+ case T_ADDRESS: l = new LoadPNode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM, MemNode::unordered); break;
+ case T_OBJECT: l = new LoadPNode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeInstPtr::BOTTOM, MemNode::unordered); break;
case T_LONG:
case T_DOUBLE: {
// Since arguments are in reverse order, the argument address 'adr'
@@ -120,12 +120,12 @@ Node *Parse::fetch_interpreter_state(int index,
adr = basic_plus_adr(local_addrs_base, local_addrs, -(index+1)*wordSize);
if (Matcher::misaligned_doubles_ok) {
l = (bt == T_DOUBLE)
- ? (Node*)new (C) LoadDNode(ctl, mem, adr, TypeRawPtr::BOTTOM, Type::DOUBLE, MemNode::unordered)
- : (Node*)new (C) LoadLNode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeLong::LONG, MemNode::unordered);
+ ? (Node*)new LoadDNode(ctl, mem, adr, TypeRawPtr::BOTTOM, Type::DOUBLE, MemNode::unordered)
+ : (Node*)new LoadLNode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeLong::LONG, MemNode::unordered);
} else {
l = (bt == T_DOUBLE)
- ? (Node*)new (C) LoadD_unalignedNode(ctl, mem, adr, TypeRawPtr::BOTTOM, MemNode::unordered)
- : (Node*)new (C) LoadL_unalignedNode(ctl, mem, adr, TypeRawPtr::BOTTOM, MemNode::unordered);
+ ? (Node*)new LoadD_unalignedNode(ctl, mem, adr, TypeRawPtr::BOTTOM, MemNode::unordered)
+ : (Node*)new LoadL_unalignedNode(ctl, mem, adr, TypeRawPtr::BOTTOM, MemNode::unordered);
}
break;
}
@@ -149,11 +149,11 @@ Node* Parse::check_interpreter_type(Node* l, const Type* type,
if (type == TypePtr::NULL_PTR ||
(tp != NULL && !tp->klass()->is_loaded())) {
// Value must be null, not a real oop.
- Node* chk = _gvn.transform( new (C) CmpPNode(l, null()) );
- Node* tst = _gvn.transform( new (C) BoolNode(chk, BoolTest::eq) );
+ Node* chk = _gvn.transform( new CmpPNode(l, null()) );
+ Node* tst = _gvn.transform( new BoolNode(chk, BoolTest::eq) );
IfNode* iff = create_and_map_if(control(), tst, PROB_MAX, COUNT_UNKNOWN);
- set_control(_gvn.transform( new (C) IfTrueNode(iff) ));
- Node* bad_type = _gvn.transform( new (C) IfFalseNode(iff) );
+ set_control(_gvn.transform( new IfTrueNode(iff) ));
+ Node* bad_type = _gvn.transform( new IfFalseNode(iff) );
bad_type_exit->control()->add_req(bad_type);
l = null();
}
@@ -220,7 +220,7 @@ void Parse::load_interpreter_state(Node* osr_buf) {
Node *monitors_addr = basic_plus_adr(osr_buf, osr_buf, (max_locals+mcnt*2-1)*wordSize);
for (index = 0; index < mcnt; index++) {
// Make a BoxLockNode for the monitor.
- Node *box = _gvn.transform(new (C) BoxLockNode(next_monitor()));
+ Node *box = _gvn.transform(new BoxLockNode(next_monitor()));
// Displaced headers and locked objects are interleaved in the
@@ -235,7 +235,7 @@ void Parse::load_interpreter_state(Node* osr_buf) {
// Build a bogus FastLockNode (no code will be generated) and push the
// monitor into our debug info.
- const FastLockNode *flock = _gvn.transform(new (C) FastLockNode( 0, lock_object, box ))->as_FastLock();
+ const FastLockNode *flock = _gvn.transform(new FastLockNode( 0, lock_object, box ))->as_FastLock();
map()->push_monitor(flock);
// If the lock is our method synchronization lock, tuck it away in
@@ -325,7 +325,7 @@ void Parse::load_interpreter_state(Node* osr_buf) {
// Now that the interpreter state is loaded, make sure it will match
// at execution time what the compiler is expecting now:
SafePointNode* bad_type_exit = clone_map();
- bad_type_exit->set_control(new (C) RegionNode(1));
+ bad_type_exit->set_control(new RegionNode(1));
assert(osr_block->flow()->jsrs()->size() == 0, "should be no jsrs live at osr point");
for (index = 0; index < max_locals; index++) {
@@ -661,7 +661,7 @@ void Parse::do_all_blocks() {
add_predicate();
// Add new region for back branches.
int edges = block->pred_count() - block->preds_parsed() + 1; // +1 for original region
- RegionNode *r = new (C) RegionNode(edges+1);
+ RegionNode *r = new RegionNode(edges+1);
_gvn.set_type(r, Type::CONTROL);
record_for_igvn(r);
r->init_req(edges, control());
@@ -728,14 +728,14 @@ void Parse::build_exits() {
_exits.clean_stack(_exits.sp());
_exits.sync_jvms();
- RegionNode* region = new (C) RegionNode(1);
+ RegionNode* region = new RegionNode(1);
record_for_igvn(region);
gvn().set_type_bottom(region);
_exits.set_control(region);
// Note: iophi and memphi are not transformed until do_exits.
- Node* iophi = new (C) PhiNode(region, Type::ABIO);
- Node* memphi = new (C) PhiNode(region, Type::MEMORY, TypePtr::BOTTOM);
+ Node* iophi = new PhiNode(region, Type::ABIO);
+ Node* memphi = new PhiNode(region, Type::MEMORY, TypePtr::BOTTOM);
gvn().set_type_bottom(iophi);
gvn().set_type_bottom(memphi);
_exits.set_i_o(iophi);
@@ -752,7 +752,7 @@ void Parse::build_exits() {
ret_type = TypeOopPtr::BOTTOM;
}
int ret_size = type2size[ret_type->basic_type()];
- Node* ret_phi = new (C) PhiNode(region, ret_type);
+ Node* ret_phi = new PhiNode(region, ret_type);
gvn().set_type_bottom(ret_phi);
_exits.ensure_stack(ret_size);
assert((int)(tf()->range()->cnt() - TypeFunc::Parms) == ret_size, "good tf range");
@@ -770,7 +770,7 @@ JVMState* Compile::build_start_state(StartNode* start, const TypeFunc* tf) {
int arg_size = tf->domain()->cnt();
int max_size = MAX2(arg_size, (int)tf->range()->cnt());
JVMState* jvms = new (this) JVMState(max_size - TypeFunc::Parms);
- SafePointNode* map = new (this) SafePointNode(max_size, NULL);
+ SafePointNode* map = new SafePointNode(max_size, NULL);
record_for_igvn(map);
assert(arg_size == TypeFunc::Parms + (is_osr_compilation() ? 1 : method()->arg_size()), "correct arg_size");
Node_Notes* old_nn = default_node_notes();
@@ -784,7 +784,7 @@ JVMState* Compile::build_start_state(StartNode* start, const TypeFunc* tf) {
}
uint i;
for (i = 0; i < (uint)arg_size; i++) {
- Node* parm = initial_gvn()->transform(new (this) ParmNode(start, i));
+ Node* parm = initial_gvn()->transform(new ParmNode(start, i));
map->init_req(i, parm);
// Record all these guys for later GVN.
record_for_igvn(parm);
@@ -815,7 +815,7 @@ Node_Notes* Parse::make_node_notes(Node_Notes* caller_nn) {
//--------------------------return_values--------------------------------------
void Compile::return_values(JVMState* jvms) {
GraphKit kit(jvms);
- Node* ret = new (this) ReturnNode(TypeFunc::Parms,
+ Node* ret = new ReturnNode(TypeFunc::Parms,
kit.control(),
kit.i_o(),
kit.reset_memory(),
@@ -843,7 +843,7 @@ void Compile::rethrow_exceptions(JVMState* jvms) {
// Load my combined exception state into the kit, with all phis transformed:
SafePointNode* ex_map = kit.combine_and_pop_all_exception_states();
Node* ex_oop = kit.use_exception_state(ex_map);
- RethrowNode* exit = new (this) RethrowNode(kit.control(),
+ RethrowNode* exit = new RethrowNode(kit.control(),
kit.i_o(), kit.reset_memory(),
kit.frameptr(), kit.returnadr(),
// like a return but with exception input
@@ -1065,7 +1065,7 @@ SafePointNode* Parse::create_entry_map() {
// Create an initial safepoint to hold JVM state during parsing
JVMState* jvms = new (C) JVMState(method(), _caller->has_method() ? _caller : NULL);
- set_map(new (C) SafePointNode(len, jvms));
+ set_map(new SafePointNode(len, jvms));
jvms->set_map(map());
record_for_igvn(map());
assert(jvms->endoff() == len, "correct jvms sizing");
@@ -1578,7 +1578,7 @@ void Parse::merge_common(Parse::Block* target, int pnum) {
// later lazily.
int edges = target->pred_count();
if (edges < pnum) edges = pnum; // might be a new path!
- RegionNode *r = new (C) RegionNode(edges+1);
+ RegionNode *r = new RegionNode(edges+1);
gvn().set_type(r, Type::CONTROL);
record_for_igvn(r);
// zap all inputs to NULL for debugging (done in Node(uint) constructor)
@@ -1973,19 +1973,19 @@ void Parse::call_register_finalizer() {
Node* access_flags_addr = basic_plus_adr(klass, klass, in_bytes(Klass::access_flags_offset()));
Node* access_flags = make_load(NULL, access_flags_addr, TypeInt::INT, T_INT, MemNode::unordered);
- Node* mask = _gvn.transform(new (C) AndINode(access_flags, intcon(JVM_ACC_HAS_FINALIZER)));
- Node* check = _gvn.transform(new (C) CmpINode(mask, intcon(0)));
- Node* test = _gvn.transform(new (C) BoolNode(check, BoolTest::ne));
+ Node* mask = _gvn.transform(new AndINode(access_flags, intcon(JVM_ACC_HAS_FINALIZER)));
+ Node* check = _gvn.transform(new CmpINode(mask, intcon(0)));
+ Node* test = _gvn.transform(new BoolNode(check, BoolTest::ne));
IfNode* iff = create_and_map_if(control(), test, PROB_MAX, COUNT_UNKNOWN);
- RegionNode* result_rgn = new (C) RegionNode(3);
+ RegionNode* result_rgn = new RegionNode(3);
record_for_igvn(result_rgn);
- Node *skip_register = _gvn.transform(new (C) IfFalseNode(iff));
+ Node *skip_register = _gvn.transform(new IfFalseNode(iff));
result_rgn->init_req(1, skip_register);
- Node *needs_register = _gvn.transform(new (C) IfTrueNode(iff));
+ Node *needs_register = _gvn.transform(new IfTrueNode(iff));
set_control(needs_register);
if (stopped()) {
// There is no slow path.
@@ -2039,9 +2039,9 @@ void Parse::rtm_deopt() {
// or with ProfileRTM (cmp->in(2)) otherwise so that
// the check will fold.
Node* profile_state = makecon(TypeInt::make(ProfileRTM));
- Node* opq = _gvn.transform( new (C) Opaque3Node(C, rtm_state, Opaque3Node::RTM_OPT) );
- Node* chk = _gvn.transform( new (C) CmpINode(opq, profile_state) );
- Node* tst = _gvn.transform( new (C) BoolNode(chk, BoolTest::eq) );
+ Node* opq = _gvn.transform( new Opaque3Node(C, rtm_state, Opaque3Node::RTM_OPT) );
+ Node* chk = _gvn.transform( new CmpINode(opq, profile_state) );
+ Node* tst = _gvn.transform( new BoolNode(chk, BoolTest::eq) );
// Branch to failure if state was changed
{ BuildCutout unless(this, tst, PROB_ALWAYS);
uncommon_trap(Deoptimization::Reason_rtm_state_change,
@@ -2066,10 +2066,10 @@ void Parse::decrement_age() {
Node* mc_adr = makecon(adr_type);
Node* cnt_adr = basic_plus_adr(mc_adr, mc_adr, in_bytes(MethodCounters::nmethod_age_offset()));
Node* cnt = make_load(control(), cnt_adr, TypeInt::INT, T_INT, adr_type, MemNode::unordered);
- Node* decr = _gvn.transform(new (C) SubINode(cnt, makecon(TypeInt::ONE)));
+ Node* decr = _gvn.transform(new SubINode(cnt, makecon(TypeInt::ONE)));
store_to_memory(control(), cnt_adr, decr, T_INT, adr_type, MemNode::unordered);
- Node *chk = _gvn.transform(new (C) CmpINode(decr, makecon(TypeInt::ZERO)));
- Node* tst = _gvn.transform(new (C) BoolNode(chk, BoolTest::gt));
+ Node *chk = _gvn.transform(new CmpINode(decr, makecon(TypeInt::ZERO)));
+ Node* tst = _gvn.transform(new BoolNode(chk, BoolTest::gt));
{ BuildCutout unless(this, tst, PROB_ALWAYS);
uncommon_trap(Deoptimization::Reason_tenured,
Deoptimization::Action_make_not_entrant);
@@ -2124,7 +2124,7 @@ void Parse::return_current(Node* value) {
// sharpen the type eagerly; this eases certain assert checking
if (tp->higher_equal(TypeInstPtr::NOTNULL))
tr = tr->join_speculative(TypeInstPtr::NOTNULL)->is_instptr();
- value = _gvn.transform(new (C) CheckCastPPNode(0,value,tr));
+ value = _gvn.transform(new CheckCastPPNode(0,value,tr));
}
}
phi->add_req(value);
@@ -2159,7 +2159,7 @@ void Parse::add_safepoint() {
kill_dead_locals();
// Clone the JVM State
- SafePointNode *sfpnt = new (C) SafePointNode(parms, NULL);
+ SafePointNode *sfpnt = new SafePointNode(parms, NULL);
// Capture memory state BEFORE a SafePoint. Since we can block at a
// SafePoint we need our GC state to be safe; i.e. we need all our current
diff --git a/hotspot/src/share/vm/opto/parse2.cpp b/hotspot/src/share/vm/opto/parse2.cpp
index 1f085a0223b..b1c42244641 100644
--- a/hotspot/src/share/vm/opto/parse2.cpp
+++ b/hotspot/src/share/vm/opto/parse2.cpp
@@ -130,9 +130,9 @@ Node* Parse::array_addressing(BasicType type, int vals, const Type* *result2) {
Node* len = load_array_length(ary);
// Test length vs index (standard trick using unsigned compare)
- Node* chk = _gvn.transform( new (C) CmpUNode(idx, len) );
+ Node* chk = _gvn.transform( new CmpUNode(idx, len) );
BoolTest::mask btest = BoolTest::lt;
- tst = _gvn.transform( new (C) BoolNode(chk, btest) );
+ tst = _gvn.transform( new BoolNode(chk, btest) );
}
// Branch to failure if out of bounds
{ BuildCutout unless(this, tst, PROB_MAX);
@@ -168,15 +168,15 @@ Node* Parse::array_addressing(BasicType type, int vals, const Type* *result2) {
// returns IfNode
IfNode* Parse::jump_if_fork_int(Node* a, Node* b, BoolTest::mask mask) {
- Node *cmp = _gvn.transform( new (C) CmpINode( a, b)); // two cases: shiftcount > 32 and shiftcount <= 32
- Node *tst = _gvn.transform( new (C) BoolNode( cmp, mask));
+ Node *cmp = _gvn.transform( new CmpINode( a, b)); // two cases: shiftcount > 32 and shiftcount <= 32
+ Node *tst = _gvn.transform( new BoolNode( cmp, mask));
IfNode *iff = create_and_map_if( control(), tst, ((mask == BoolTest::eq) ? PROB_STATIC_INFREQUENT : PROB_FAIR), COUNT_UNKNOWN );
return iff;
}
// return Region node
Node* Parse::jump_if_join(Node* iffalse, Node* iftrue) {
- Node *region = new (C) RegionNode(3); // 2 results
+ Node *region = new RegionNode(3); // 2 results
record_for_igvn(region);
region->init_req(1, iffalse);
region->init_req(2, iftrue );
@@ -191,28 +191,28 @@ Node* Parse::jump_if_join(Node* iffalse, Node* iftrue) {
void Parse::jump_if_true_fork(IfNode *iff, int dest_bci_if_true, int prof_table_index) {
// True branch, use existing map info
{ PreserveJVMState pjvms(this);
- Node *iftrue = _gvn.transform( new (C) IfTrueNode (iff) );
+ Node *iftrue = _gvn.transform( new IfTrueNode (iff) );
set_control( iftrue );
profile_switch_case(prof_table_index);
merge_new_path(dest_bci_if_true);
}
// False branch
- Node *iffalse = _gvn.transform( new (C) IfFalseNode(iff) );
+ Node *iffalse = _gvn.transform( new IfFalseNode(iff) );
set_control( iffalse );
}
void Parse::jump_if_false_fork(IfNode *iff, int dest_bci_if_true, int prof_table_index) {
// True branch, use existing map info
{ PreserveJVMState pjvms(this);
- Node *iffalse = _gvn.transform( new (C) IfFalseNode (iff) );
+ Node *iffalse = _gvn.transform( new IfFalseNode (iff) );
set_control( iffalse );
profile_switch_case(prof_table_index);
merge_new_path(dest_bci_if_true);
}
// False branch
- Node *iftrue = _gvn.transform( new (C) IfTrueNode(iff) );
+ Node *iftrue = _gvn.transform( new IfTrueNode(iff) );
set_control( iftrue );
}
@@ -440,14 +440,14 @@ bool Parse::create_jump_tables(Node* key_val, SwitchRange* lo, SwitchRange* hi)
// Normalize table lookups to zero
int lowval = lo->lo();
- key_val = _gvn.transform( new (C) SubINode(key_val, _gvn.intcon(lowval)) );
+ key_val = _gvn.transform( new SubINode(key_val, _gvn.intcon(lowval)) );
// Generate a guard to protect against input keyvals that aren't
// in the switch domain.
if (needs_guard) {
Node* size = _gvn.intcon(num_cases);
- Node* cmp = _gvn.transform( new (C) CmpUNode(key_val, size) );
- Node* tst = _gvn.transform( new (C) BoolNode(cmp, BoolTest::ge) );
+ Node* cmp = _gvn.transform( new CmpUNode(key_val, size) );
+ Node* tst = _gvn.transform( new BoolNode(cmp, BoolTest::ge) );
IfNode* iff = create_and_map_if( control(), tst, PROB_FAIR, COUNT_UNKNOWN);
jump_if_true_fork(iff, default_dest, NullTableIndex);
}
@@ -460,21 +460,21 @@ bool Parse::create_jump_tables(Node* key_val, SwitchRange* lo, SwitchRange* hi)
// Clean the 32-bit int into a real 64-bit offset.
// Otherwise, the jint value 0 might turn into an offset of 0x0800000000.
const TypeLong* lkeytype = TypeLong::make(CONST64(0), num_cases-1, Type::WidenMin);
- key_val = _gvn.transform( new (C) ConvI2LNode(key_val, lkeytype) );
+ key_val = _gvn.transform( new ConvI2LNode(key_val, lkeytype) );
#endif
// Shift the value by wordsize so we have an index into the table, rather
// than a switch value
Node *shiftWord = _gvn.MakeConX(wordSize);
- key_val = _gvn.transform( new (C) MulXNode( key_val, shiftWord));
+ key_val = _gvn.transform( new MulXNode( key_val, shiftWord));
// Create the JumpNode
- Node* jtn = _gvn.transform( new (C) JumpNode(control(), key_val, num_cases) );
+ Node* jtn = _gvn.transform( new JumpNode(control(), key_val, num_cases) );
// These are the switch destinations hanging off the jumpnode
int i = 0;
for (SwitchRange* r = lo; r <= hi; r++) {
for (int64_t j = r->lo(); j <= r->hi(); j++, i++) {
- Node* input = _gvn.transform(new (C) JumpProjNode(jtn, i, r->dest(), (int)(j - lowval)));
+ Node* input = _gvn.transform(new JumpProjNode(jtn, i, r->dest(), (int)(j - lowval)));
{
PreserveJVMState pjvms(this);
set_control(input);
@@ -575,8 +575,8 @@ void Parse::jump_switch_ranges(Node* key_val, SwitchRange *lo, SwitchRange *hi,
// two comparisons of same values--should enable 1 test for 2 branches
// Use BoolTest::le instead of BoolTest::gt
IfNode *iff_le = jump_if_fork_int(key_val, test_val, BoolTest::le);
- Node *iftrue = _gvn.transform( new (C) IfTrueNode(iff_le) );
- Node *iffalse = _gvn.transform( new (C) IfFalseNode(iff_le) );
+ Node *iftrue = _gvn.transform( new IfTrueNode(iff_le) );
+ Node *iffalse = _gvn.transform( new IfFalseNode(iff_le) );
{ PreserveJVMState pjvms(this);
set_control(iffalse);
jump_switch_ranges(key_val, mid+1, hi, switch_depth+1);
@@ -592,8 +592,8 @@ void Parse::jump_switch_ranges(Node* key_val, SwitchRange *lo, SwitchRange *hi,
if (mid == hi) {
jump_if_true_fork(iff_ge, mid->dest(), mid->table_index());
} else {
- Node *iftrue = _gvn.transform( new (C) IfTrueNode(iff_ge) );
- Node *iffalse = _gvn.transform( new (C) IfFalseNode(iff_ge) );
+ Node *iftrue = _gvn.transform( new IfTrueNode(iff_ge) );
+ Node *iffalse = _gvn.transform( new IfFalseNode(iff_ge) );
{ PreserveJVMState pjvms(this);
set_control(iftrue);
jump_switch_ranges(key_val, mid, hi, switch_depth+1);
@@ -648,7 +648,7 @@ void Parse::modf() {
CAST_FROM_FN_PTR(address, SharedRuntime::frem),
"frem", NULL, //no memory effects
f1, f2);
- Node* res = _gvn.transform(new (C) ProjNode(c, TypeFunc::Parms + 0));
+ Node* res = _gvn.transform(new ProjNode(c, TypeFunc::Parms + 0));
push(res);
}
@@ -660,10 +660,10 @@ void Parse::modd() {
CAST_FROM_FN_PTR(address, SharedRuntime::drem),
"drem", NULL, //no memory effects
d1, top(), d2, top());
- Node* res_d = _gvn.transform(new (C) ProjNode(c, TypeFunc::Parms + 0));
+ Node* res_d = _gvn.transform(new ProjNode(c, TypeFunc::Parms + 0));
#ifdef ASSERT
- Node* res_top = _gvn.transform(new (C) ProjNode(c, TypeFunc::Parms + 1));
+ Node* res_top = _gvn.transform(new ProjNode(c, TypeFunc::Parms + 1));
assert(res_top == top(), "second value must be top");
#endif
@@ -677,7 +677,7 @@ void Parse::l2f() {
CAST_FROM_FN_PTR(address, SharedRuntime::l2f),
"l2f", NULL, //no memory effects
f1, f2);
- Node* res = _gvn.transform(new (C) ProjNode(c, TypeFunc::Parms + 0));
+ Node* res = _gvn.transform(new ProjNode(c, TypeFunc::Parms + 0));
push(res);
}
@@ -704,17 +704,17 @@ void Parse::do_irem() {
// Sigh, must handle negative dividends
Node *zero = _gvn.intcon(0);
IfNode *ifff = jump_if_fork_int(a, zero, BoolTest::lt);
- Node *iff = _gvn.transform( new (C) IfFalseNode(ifff) );
- Node *ift = _gvn.transform( new (C) IfTrueNode (ifff) );
+ Node *iff = _gvn.transform( new IfFalseNode(ifff) );
+ Node *ift = _gvn.transform( new IfTrueNode (ifff) );
Node *reg = jump_if_join(ift, iff);
Node *phi = PhiNode::make(reg, NULL, TypeInt::INT);
// Negative path; negate/and/negate
- Node *neg = _gvn.transform( new (C) SubINode(zero, a) );
- Node *andn= _gvn.transform( new (C) AndINode(neg, mask) );
- Node *negn= _gvn.transform( new (C) SubINode(zero, andn) );
+ Node *neg = _gvn.transform( new SubINode(zero, a) );
+ Node *andn= _gvn.transform( new AndINode(neg, mask) );
+ Node *negn= _gvn.transform( new SubINode(zero, andn) );
phi->init_req(1, negn);
// Fast positive case
- Node *andx = _gvn.transform( new (C) AndINode(a, mask) );
+ Node *andx = _gvn.transform( new AndINode(a, mask) );
phi->init_req(2, andx);
// Push the merge
push( _gvn.transform(phi) );
@@ -723,7 +723,7 @@ void Parse::do_irem() {
}
}
// Default case
- push( _gvn.transform( new (C) ModINode(control(),a,b) ) );
+ push( _gvn.transform( new ModINode(control(),a,b) ) );
}
// Handle jsr and jsr_w bytecode
@@ -1000,7 +1000,7 @@ void Parse::do_ifnull(BoolTest::mask btest, Node *c) {
explicit_null_checks_inserted++;
// Generate real control flow
- Node *tst = _gvn.transform( new (C) BoolNode( c, btest ) );
+ Node *tst = _gvn.transform( new BoolNode( c, btest ) );
// Sanity check the probability value
assert(prob > 0.0f,"Bad probability in Parser");
@@ -1009,7 +1009,7 @@ void Parse::do_ifnull(BoolTest::mask btest, Node *c) {
assert(iff->_prob > 0.0f,"Optimizer made bad probability in parser");
// True branch
{ PreserveJVMState pjvms(this);
- Node* iftrue = _gvn.transform( new (C) IfTrueNode (iff) );
+ Node* iftrue = _gvn.transform( new IfTrueNode (iff) );
set_control(iftrue);
if (stopped()) { // Path is dead?
@@ -1029,7 +1029,7 @@ void Parse::do_ifnull(BoolTest::mask btest, Node *c) {
}
// False branch
- Node* iffalse = _gvn.transform( new (C) IfFalseNode(iff) );
+ Node* iffalse = _gvn.transform( new IfFalseNode(iff) );
set_control(iffalse);
if (stopped()) { // Path is dead?
@@ -1092,7 +1092,7 @@ void Parse::do_if(BoolTest::mask btest, Node* c) {
}
assert(btest != BoolTest::eq, "!= is the only canonical exact test");
- Node* tst0 = new (C) BoolNode(c, btest);
+ Node* tst0 = new BoolNode(c, btest);
Node* tst = _gvn.transform(tst0);
BoolTest::mask taken_btest = BoolTest::illegal;
BoolTest::mask untaken_btest = BoolTest::illegal;
@@ -1123,8 +1123,8 @@ void Parse::do_if(BoolTest::mask btest, Node* c) {
float true_prob = (taken_if_true ? prob : untaken_prob);
IfNode* iff = create_and_map_if(control(), tst, true_prob, cnt);
assert(iff->_prob > 0.0f,"Optimizer made bad probability in parser");
- Node* taken_branch = new (C) IfTrueNode(iff);
- Node* untaken_branch = new (C) IfFalseNode(iff);
+ Node* taken_branch = new IfTrueNode(iff);
+ Node* untaken_branch = new IfFalseNode(iff);
if (!taken_if_true) { // Finish conversion to canonical form
Node* tmp = taken_branch;
taken_branch = untaken_branch;
@@ -1288,7 +1288,7 @@ void Parse::sharpen_type_after_if(BoolTest::mask btest,
JVMState* jvms = this->jvms();
if (obj_in_map >= 0 &&
(jvms->is_loc(obj_in_map) || jvms->is_stk(obj_in_map))) {
- TypeNode* ccast = new (C) CheckCastPPNode(control(), obj, tboth);
+ TypeNode* ccast = new CheckCastPPNode(control(), obj, tboth);
const Type* tcc = ccast->as_Type()->type();
assert(tcc != obj_type && tcc->higher_equal(obj_type), "must improve");
// Delay transform() call to allow recovery of pre-cast value
@@ -1323,10 +1323,10 @@ void Parse::sharpen_type_after_if(BoolTest::mask btest,
const Type* tboth = tcon->join_speculative(tval);
if (tboth == tval) break; // Nothing to gain.
if (tcon->isa_int()) {
- ccast = new (C) CastIINode(val, tboth);
+ ccast = new CastIINode(val, tboth);
} else if (tcon == TypePtr::NULL_PTR) {
// Cast to null, but keep the pointer identity temporarily live.
- ccast = new (C) CastPPNode(val, tboth);
+ ccast = new CastPPNode(val, tboth);
} else {
const TypeF* tf = tcon->isa_float_constant();
const TypeD* td = tcon->isa_double_constant();
@@ -1792,59 +1792,59 @@ void Parse::do_one_bytecode() {
if (stopped()) return;
b = pop();
a = pop();
- push( _gvn.transform( new (C) DivINode(control(),a,b) ) );
+ push( _gvn.transform( new DivINode(control(),a,b) ) );
break;
case Bytecodes::_imul:
b = pop(); a = pop();
- push( _gvn.transform( new (C) MulINode(a,b) ) );
+ push( _gvn.transform( new MulINode(a,b) ) );
break;
case Bytecodes::_iadd:
b = pop(); a = pop();
- push( _gvn.transform( new (C) AddINode(a,b) ) );
+ push( _gvn.transform( new AddINode(a,b) ) );
break;
case Bytecodes::_ineg:
a = pop();
- push( _gvn.transform( new (C) SubINode(_gvn.intcon(0),a)) );
+ push( _gvn.transform( new SubINode(_gvn.intcon(0),a)) );
break;
case Bytecodes::_isub:
b = pop(); a = pop();
- push( _gvn.transform( new (C) SubINode(a,b) ) );
+ push( _gvn.transform( new SubINode(a,b) ) );
break;
case Bytecodes::_iand:
b = pop(); a = pop();
- push( _gvn.transform( new (C) AndINode(a,b) ) );
+ push( _gvn.transform( new AndINode(a,b) ) );
break;
case Bytecodes::_ior:
b = pop(); a = pop();
- push( _gvn.transform( new (C) OrINode(a,b) ) );
+ push( _gvn.transform( new OrINode(a,b) ) );
break;
case Bytecodes::_ixor:
b = pop(); a = pop();
- push( _gvn.transform( new (C) XorINode(a,b) ) );
+ push( _gvn.transform( new XorINode(a,b) ) );
break;
case Bytecodes::_ishl:
b = pop(); a = pop();
- push( _gvn.transform( new (C) LShiftINode(a,b) ) );
+ push( _gvn.transform( new LShiftINode(a,b) ) );
break;
case Bytecodes::_ishr:
b = pop(); a = pop();
- push( _gvn.transform( new (C) RShiftINode(a,b) ) );
+ push( _gvn.transform( new RShiftINode(a,b) ) );
break;
case Bytecodes::_iushr:
b = pop(); a = pop();
- push( _gvn.transform( new (C) URShiftINode(a,b) ) );
+ push( _gvn.transform( new URShiftINode(a,b) ) );
break;
case Bytecodes::_fneg:
a = pop();
- b = _gvn.transform(new (C) NegFNode (a));
+ b = _gvn.transform(new NegFNode (a));
push(b);
break;
case Bytecodes::_fsub:
b = pop();
a = pop();
- c = _gvn.transform( new (C) SubFNode(a,b) );
+ c = _gvn.transform( new SubFNode(a,b) );
d = precision_rounding(c);
push( d );
break;
@@ -1852,7 +1852,7 @@ void Parse::do_one_bytecode() {
case Bytecodes::_fadd:
b = pop();
a = pop();
- c = _gvn.transform( new (C) AddFNode(a,b) );
+ c = _gvn.transform( new AddFNode(a,b) );
d = precision_rounding(c);
push( d );
break;
@@ -1860,7 +1860,7 @@ void Parse::do_one_bytecode() {
case Bytecodes::_fmul:
b = pop();
a = pop();
- c = _gvn.transform( new (C) MulFNode(a,b) );
+ c = _gvn.transform( new MulFNode(a,b) );
d = precision_rounding(c);
push( d );
break;
@@ -1868,7 +1868,7 @@ void Parse::do_one_bytecode() {
case Bytecodes::_fdiv:
b = pop();
a = pop();
- c = _gvn.transform( new (C) DivFNode(0,a,b) );
+ c = _gvn.transform( new DivFNode(0,a,b) );
d = precision_rounding(c);
push( d );
break;
@@ -1878,7 +1878,7 @@ void Parse::do_one_bytecode() {
// Generate a ModF node.
b = pop();
a = pop();
- c = _gvn.transform( new (C) ModFNode(0,a,b) );
+ c = _gvn.transform( new ModFNode(0,a,b) );
d = precision_rounding(c);
push( d );
}
@@ -1891,7 +1891,7 @@ void Parse::do_one_bytecode() {
case Bytecodes::_fcmpl:
b = pop();
a = pop();
- c = _gvn.transform( new (C) CmpF3Node( a, b));
+ c = _gvn.transform( new CmpF3Node( a, b));
push(c);
break;
case Bytecodes::_fcmpg:
@@ -1903,40 +1903,40 @@ void Parse::do_one_bytecode() {
// as well by using CmpF3 which implements unordered-lesser instead of
// unordered-greater semantics. Finally, commute the result bits. Result
// is same as using a CmpF3Greater except we did it with CmpF3 alone.
- c = _gvn.transform( new (C) CmpF3Node( b, a));
- c = _gvn.transform( new (C) SubINode(_gvn.intcon(0),c) );
+ c = _gvn.transform( new CmpF3Node( b, a));
+ c = _gvn.transform( new SubINode(_gvn.intcon(0),c) );
push(c);
break;
case Bytecodes::_f2i:
a = pop();
- push(_gvn.transform(new (C) ConvF2INode(a)));
+ push(_gvn.transform(new ConvF2INode(a)));
break;
case Bytecodes::_d2i:
a = pop_pair();
- b = _gvn.transform(new (C) ConvD2INode(a));
+ b = _gvn.transform(new ConvD2INode(a));
push( b );
break;
case Bytecodes::_f2d:
a = pop();
- b = _gvn.transform( new (C) ConvF2DNode(a));
+ b = _gvn.transform( new ConvF2DNode(a));
push_pair( b );
break;
case Bytecodes::_d2f:
a = pop_pair();
- b = _gvn.transform( new (C) ConvD2FNode(a));
+ b = _gvn.transform( new ConvD2FNode(a));
// This breaks _227_mtrt (speed & correctness) and _222_mpegaudio (speed)
- //b = _gvn.transform(new (C) RoundFloatNode(0, b) );
+ //b = _gvn.transform(new RoundFloatNode(0, b) );
push( b );
break;
case Bytecodes::_l2f:
if (Matcher::convL2FSupported()) {
a = pop_pair();
- b = _gvn.transform( new (C) ConvL2FNode(a));
+ b = _gvn.transform( new ConvL2FNode(a));
// For i486.ad, FILD doesn't restrict precision to 24 or 53 bits.
// Rather than storing the result into an FP register then pushing
// out to memory to round, the machine instruction that implements
@@ -1951,7 +1951,7 @@ void Parse::do_one_bytecode() {
case Bytecodes::_l2d:
a = pop_pair();
- b = _gvn.transform( new (C) ConvL2DNode(a));
+ b = _gvn.transform( new ConvL2DNode(a));
// For i486.ad, rounding is always necessary (see _l2f above).
// c = dprecision_rounding(b);
c = _gvn.transform(b);
@@ -1960,20 +1960,20 @@ void Parse::do_one_bytecode() {
case Bytecodes::_f2l:
a = pop();
- b = _gvn.transform( new (C) ConvF2LNode(a));
+ b = _gvn.transform( new ConvF2LNode(a));
push_pair(b);
break;
case Bytecodes::_d2l:
a = pop_pair();
- b = _gvn.transform( new (C) ConvD2LNode(a));
+ b = _gvn.transform( new ConvD2LNode(a));
push_pair(b);
break;
case Bytecodes::_dsub:
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) SubDNode(a,b) );
+ c = _gvn.transform( new SubDNode(a,b) );
d = dprecision_rounding(c);
push_pair( d );
break;
@@ -1981,7 +1981,7 @@ void Parse::do_one_bytecode() {
case Bytecodes::_dadd:
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) AddDNode(a,b) );
+ c = _gvn.transform( new AddDNode(a,b) );
d = dprecision_rounding(c);
push_pair( d );
break;
@@ -1989,7 +1989,7 @@ void Parse::do_one_bytecode() {
case Bytecodes::_dmul:
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) MulDNode(a,b) );
+ c = _gvn.transform( new MulDNode(a,b) );
d = dprecision_rounding(c);
push_pair( d );
break;
@@ -1997,14 +1997,14 @@ void Parse::do_one_bytecode() {
case Bytecodes::_ddiv:
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) DivDNode(0,a,b) );
+ c = _gvn.transform( new DivDNode(0,a,b) );
d = dprecision_rounding(c);
push_pair( d );
break;
case Bytecodes::_dneg:
a = pop_pair();
- b = _gvn.transform(new (C) NegDNode (a));
+ b = _gvn.transform(new NegDNode (a));
push_pair(b);
break;
@@ -2015,7 +2015,7 @@ void Parse::do_one_bytecode() {
a = pop_pair();
// a % b
- c = _gvn.transform( new (C) ModDNode(0,a,b) );
+ c = _gvn.transform( new ModDNode(0,a,b) );
d = dprecision_rounding(c);
push_pair( d );
}
@@ -2028,7 +2028,7 @@ void Parse::do_one_bytecode() {
case Bytecodes::_dcmpl:
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) CmpD3Node( a, b));
+ c = _gvn.transform( new CmpD3Node( a, b));
push(c);
break;
@@ -2041,8 +2041,8 @@ void Parse::do_one_bytecode() {
// unordered-lesser instead of unordered-greater semantics.
// Finally, negate the result bits. Result is same as using a
// CmpD3Greater except we did it with CmpD3 alone.
- c = _gvn.transform( new (C) CmpD3Node( b, a));
- c = _gvn.transform( new (C) SubINode(_gvn.intcon(0),c) );
+ c = _gvn.transform( new CmpD3Node( b, a));
+ c = _gvn.transform( new SubINode(_gvn.intcon(0),c) );
push(c);
break;
@@ -2051,44 +2051,44 @@ void Parse::do_one_bytecode() {
case Bytecodes::_land:
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) AndLNode(a,b) );
+ c = _gvn.transform( new AndLNode(a,b) );
push_pair(c);
break;
case Bytecodes::_lor:
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) OrLNode(a,b) );
+ c = _gvn.transform( new OrLNode(a,b) );
push_pair(c);
break;
case Bytecodes::_lxor:
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) XorLNode(a,b) );
+ c = _gvn.transform( new XorLNode(a,b) );
push_pair(c);
break;
case Bytecodes::_lshl:
b = pop(); // the shift count
a = pop_pair(); // value to be shifted
- c = _gvn.transform( new (C) LShiftLNode(a,b) );
+ c = _gvn.transform( new LShiftLNode(a,b) );
push_pair(c);
break;
case Bytecodes::_lshr:
b = pop(); // the shift count
a = pop_pair(); // value to be shifted
- c = _gvn.transform( new (C) RShiftLNode(a,b) );
+ c = _gvn.transform( new RShiftLNode(a,b) );
push_pair(c);
break;
case Bytecodes::_lushr:
b = pop(); // the shift count
a = pop_pair(); // value to be shifted
- c = _gvn.transform( new (C) URShiftLNode(a,b) );
+ c = _gvn.transform( new URShiftLNode(a,b) );
push_pair(c);
break;
case Bytecodes::_lmul:
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) MulLNode(a,b) );
+ c = _gvn.transform( new MulLNode(a,b) );
push_pair(c);
break;
@@ -2100,7 +2100,7 @@ void Parse::do_one_bytecode() {
if (stopped()) return;
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) ModLNode(control(),a,b) );
+ c = _gvn.transform( new ModLNode(control(),a,b) );
push_pair(c);
break;
@@ -2112,20 +2112,20 @@ void Parse::do_one_bytecode() {
if (stopped()) return;
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) DivLNode(control(),a,b) );
+ c = _gvn.transform( new DivLNode(control(),a,b) );
push_pair(c);
break;
case Bytecodes::_ladd:
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) AddLNode(a,b) );
+ c = _gvn.transform( new AddLNode(a,b) );
push_pair(c);
break;
case Bytecodes::_lsub:
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) SubLNode(a,b) );
+ c = _gvn.transform( new SubLNode(a,b) );
push_pair(c);
break;
case Bytecodes::_lcmp:
@@ -2156,58 +2156,58 @@ void Parse::do_one_bytecode() {
}
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) CmpL3Node( a, b ));
+ c = _gvn.transform( new CmpL3Node( a, b ));
push(c);
break;
case Bytecodes::_lneg:
a = pop_pair();
- b = _gvn.transform( new (C) SubLNode(longcon(0),a));
+ b = _gvn.transform( new SubLNode(longcon(0),a));
push_pair(b);
break;
case Bytecodes::_l2i:
a = pop_pair();
- push( _gvn.transform( new (C) ConvL2INode(a)));
+ push( _gvn.transform( new ConvL2INode(a)));
break;
case Bytecodes::_i2l:
a = pop();
- b = _gvn.transform( new (C) ConvI2LNode(a));
+ b = _gvn.transform( new ConvI2LNode(a));
push_pair(b);
break;
case Bytecodes::_i2b:
// Sign extend
a = pop();
- a = _gvn.transform( new (C) LShiftINode(a,_gvn.intcon(24)) );
- a = _gvn.transform( new (C) RShiftINode(a,_gvn.intcon(24)) );
+ a = _gvn.transform( new LShiftINode(a,_gvn.intcon(24)) );
+ a = _gvn.transform( new RShiftINode(a,_gvn.intcon(24)) );
push( a );
break;
case Bytecodes::_i2s:
a = pop();
- a = _gvn.transform( new (C) LShiftINode(a,_gvn.intcon(16)) );
- a = _gvn.transform( new (C) RShiftINode(a,_gvn.intcon(16)) );
+ a = _gvn.transform( new LShiftINode(a,_gvn.intcon(16)) );
+ a = _gvn.transform( new RShiftINode(a,_gvn.intcon(16)) );
push( a );
break;
case Bytecodes::_i2c:
a = pop();
- push( _gvn.transform( new (C) AndINode(a,_gvn.intcon(0xFFFF)) ) );
+ push( _gvn.transform( new AndINode(a,_gvn.intcon(0xFFFF)) ) );
break;
case Bytecodes::_i2f:
a = pop();
- b = _gvn.transform( new (C) ConvI2FNode(a) ) ;
+ b = _gvn.transform( new ConvI2FNode(a) ) ;
c = precision_rounding(b);
push (b);
break;
case Bytecodes::_i2d:
a = pop();
- b = _gvn.transform( new (C) ConvI2DNode(a));
+ b = _gvn.transform( new ConvI2DNode(a));
push_pair(b);
break;
case Bytecodes::_iinc: // Increment local
i = iter().get_index(); // Get local index
- set_local( i, _gvn.transform( new (C) AddINode( _gvn.intcon(iter().get_iinc_con()), local(i) ) ) );
+ set_local( i, _gvn.transform( new AddINode( _gvn.intcon(iter().get_iinc_con()), local(i) ) ) );
break;
// Exit points of synchronized methods must have an unlock node
@@ -2287,7 +2287,7 @@ void Parse::do_one_bytecode() {
assert(null_ctl->is_top(), "no null control here");
dec_sp(1);
}
- c = _gvn.transform( new (C) CmpPNode(b, a) );
+ c = _gvn.transform( new CmpPNode(b, a) );
do_ifnull(btest, c);
break;
@@ -2298,7 +2298,7 @@ void Parse::do_one_bytecode() {
maybe_add_safepoint(iter().get_dest());
a = pop();
b = pop();
- c = _gvn.transform( new (C) CmpPNode(b, a) );
+ c = _gvn.transform( new CmpPNode(b, a) );
c = optimize_cmp_with_klass(c);
do_if(btest, c);
break;
@@ -2314,7 +2314,7 @@ void Parse::do_one_bytecode() {
maybe_add_safepoint(iter().get_dest());
a = _gvn.intcon(0);
b = pop();
- c = _gvn.transform( new (C) CmpINode(b, a) );
+ c = _gvn.transform( new CmpINode(b, a) );
do_if(btest, c);
break;
@@ -2329,7 +2329,7 @@ void Parse::do_one_bytecode() {
maybe_add_safepoint(iter().get_dest());
a = pop();
b = pop();
- c = _gvn.transform( new (C) CmpINode( b, a ) );
+ c = _gvn.transform( new CmpINode( b, a ) );
do_if(btest, c);
break;
diff --git a/hotspot/src/share/vm/opto/parse3.cpp b/hotspot/src/share/vm/opto/parse3.cpp
index b76eec74073..0f07506774e 100644
--- a/hotspot/src/share/vm/opto/parse3.cpp
+++ b/hotspot/src/share/vm/opto/parse3.cpp
@@ -552,7 +552,7 @@ void Parse::do_multianewarray() {
}
make_slow_call_ex(c, env()->Throwable_klass(), false);
- Node* res = _gvn.transform(new (C) ProjNode(c, TypeFunc::Parms));
+ Node* res = _gvn.transform(new ProjNode(c, TypeFunc::Parms));
const Type* type = TypeOopPtr::make_from_klass_raw(array_klass);
@@ -566,7 +566,7 @@ void Parse::do_multianewarray() {
// We cannot sharpen the nested sub-arrays, since the top level is mutable.
- Node* cast = _gvn.transform( new (C) CheckCastPPNode(control(), res, type) );
+ Node* cast = _gvn.transform( new CheckCastPPNode(control(), res, type) );
push(cast);
// Possible improvements:
diff --git a/hotspot/src/share/vm/opto/parseHelper.cpp b/hotspot/src/share/vm/opto/parseHelper.cpp
index 729a038d873..45d627d2500 100644
--- a/hotspot/src/share/vm/opto/parseHelper.cpp
+++ b/hotspot/src/share/vm/opto/parseHelper.cpp
@@ -43,7 +43,7 @@ void GraphKit::make_dtrace_method_entry_exit(ciMethod* method, bool is_entry) {
const char *call_name = is_entry ? "dtrace_method_entry" : "dtrace_method_exit";
// Get base of thread-local storage area
- Node* thread = _gvn.transform( new (C) ThreadLocalNode() );
+ Node* thread = _gvn.transform( new ThreadLocalNode() );
// Get method
const TypePtr* method_type = TypeMetadataPtr::make(method);
@@ -175,8 +175,8 @@ void Parse::array_store_check() {
// Make a constant out of the inexact array klass
const TypeKlassPtr *extak = tak->cast_to_exactness(true)->is_klassptr();
Node* con = makecon(extak);
- Node* cmp = _gvn.transform(new (C) CmpPNode( array_klass, con ));
- Node* bol = _gvn.transform(new (C) BoolNode( cmp, BoolTest::eq ));
+ Node* cmp = _gvn.transform(new CmpPNode( array_klass, con ));
+ Node* bol = _gvn.transform(new BoolNode( cmp, BoolTest::eq ));
Node* ctrl= control();
{ BuildCutout unless(this, bol, PROB_MAX);
uncommon_trap(Deoptimization::Reason_array_check,
@@ -215,8 +215,8 @@ void Parse::emit_guard_for_new(ciInstanceKlass* klass) {
// if (klass->_init_thread != current_thread ||
// klass->_init_state != being_initialized)
// uncommon_trap
- Node* cur_thread = _gvn.transform( new (C) ThreadLocalNode() );
- Node* merge = new (C) RegionNode(3);
+ Node* cur_thread = _gvn.transform( new ThreadLocalNode() );
+ Node* merge = new RegionNode(3);
_gvn.set_type(merge, Type::CONTROL);
Node* kls = makecon(TypeKlassPtr::make(klass));
@@ -327,9 +327,9 @@ void Parse::test_counter_against_threshold(Node* cnt, int limit) {
// Test invocation count vs threshold
Node *threshold = makecon(TypeInt::make(limit));
- Node *chk = _gvn.transform( new (C) CmpUNode( cnt, threshold) );
+ Node *chk = _gvn.transform( new CmpUNode( cnt, threshold) );
BoolTest::mask btest = BoolTest::lt;
- Node *tst = _gvn.transform( new (C) BoolNode( chk, btest) );
+ Node *tst = _gvn.transform( new BoolNode( chk, btest) );
// Branch to failure if threshold exceeded
{ BuildCutout unless(this, tst, PROB_ALWAYS);
uncommon_trap(Deoptimization::Reason_age,
@@ -359,7 +359,7 @@ void Parse::increment_and_test_invocation_counter(int limit) {
test_counter_against_threshold(cnt, limit);
// Add one to the counter and store
- Node* incr = _gvn.transform(new (C) AddINode(cnt, _gvn.intcon(1)));
+ Node* incr = _gvn.transform(new AddINode(cnt, _gvn.intcon(1)));
store_to_memory(ctrl, adr_iic_node, incr, T_INT, adr_type, MemNode::unordered);
}
@@ -380,8 +380,8 @@ Node* Parse::method_data_addressing(ciMethodData* md, ciProfileData* data, ByteS
if (stride != 0) {
Node* str = _gvn.MakeConX(stride);
- Node* scale = _gvn.transform( new (C) MulXNode( idx, str ) );
- ptr = _gvn.transform( new (C) AddPNode( mdo, ptr, scale ) );
+ Node* scale = _gvn.transform( new MulXNode( idx, str ) );
+ ptr = _gvn.transform( new AddPNode( mdo, ptr, scale ) );
}
return ptr;
@@ -393,7 +393,7 @@ void Parse::increment_md_counter_at(ciMethodData* md, ciProfileData* data, ByteS
const TypePtr* adr_type = _gvn.type(adr_node)->is_ptr();
Node* cnt = make_load(NULL, adr_node, TypeInt::INT, T_INT, adr_type, MemNode::unordered);
- Node* incr = _gvn.transform(new (C) AddINode(cnt, _gvn.intcon(DataLayout::counter_increment)));
+ Node* incr = _gvn.transform(new AddINode(cnt, _gvn.intcon(DataLayout::counter_increment)));
store_to_memory(NULL, adr_node, incr, T_INT, adr_type, MemNode::unordered);
}
@@ -413,7 +413,7 @@ void Parse::set_md_flag_at(ciMethodData* md, ciProfileData* data, int flag_const
const TypePtr* adr_type = _gvn.type(adr_node)->is_ptr();
Node* flags = make_load(NULL, adr_node, TypeInt::BYTE, T_BYTE, adr_type, MemNode::unordered);
- Node* incr = _gvn.transform(new (C) OrINode(flags, _gvn.intcon(flag_constant)));
+ Node* incr = _gvn.transform(new OrINode(flags, _gvn.intcon(flag_constant)));
store_to_memory(NULL, adr_node, incr, T_BYTE, adr_type, MemNode::unordered);
}
diff --git a/hotspot/src/share/vm/opto/phaseX.cpp b/hotspot/src/share/vm/opto/phaseX.cpp
index 4635342e678..5b2771e83ef 100644
--- a/hotspot/src/share/vm/opto/phaseX.cpp
+++ b/hotspot/src/share/vm/opto/phaseX.cpp
@@ -47,7 +47,7 @@ NodeHash::NodeHash(uint est_max_size) :
_total_insert_probes(0), _total_inserts(0),
_insert_probes(0), _grows(0) {
// _sentinel must be in the current node space
- _sentinel = new (Compile::current()) ProjNode(NULL, TypeFunc::Control);
+ _sentinel = new ProjNode(NULL, TypeFunc::Control);
memset(_table,0,sizeof(Node*)*_max);
}
@@ -62,7 +62,7 @@ NodeHash::NodeHash(Arena *arena, uint est_max_size) :
_total_insert_probes(0), _total_inserts(0),
_insert_probes(0), _grows(0) {
// _sentinel must be in the current node space
- _sentinel = new (Compile::current()) ProjNode(NULL, TypeFunc::Control);
+ _sentinel = new ProjNode(NULL, TypeFunc::Control);
memset(_table,0,sizeof(Node*)*_max);
}
@@ -1309,7 +1309,7 @@ void PhaseIterGVN::subsume_node( Node *old, Node *nn ) {
}
// Smash all inputs to 'old', isolating him completely
- Node *temp = new (C) Node(1);
+ Node *temp = new Node(1);
temp->init_req(0,nn); // Add a use to nn to prevent him from dying
remove_dead_node( old );
temp->del_req(0); // Yank bogus edge
diff --git a/hotspot/src/share/vm/opto/reg_split.cpp b/hotspot/src/share/vm/opto/reg_split.cpp
index 7ec346bc6a9..7c47b4c0065 100644
--- a/hotspot/src/share/vm/opto/reg_split.cpp
+++ b/hotspot/src/share/vm/opto/reg_split.cpp
@@ -93,7 +93,7 @@ Node *PhaseChaitin::get_spillcopy_wide(MachSpillCopyNode::SpillType spill_type,
// Here we assume a trip through memory is required.
w_i_mask = &C->FIRST_STACK_mask();
}
- return new (C) MachSpillCopyNode(spill_type, def, *w_i_mask, *w_o_mask );
+ return new MachSpillCopyNode(spill_type, def, *w_i_mask, *w_o_mask );
}
//------------------------------insert_proj------------------------------------
@@ -663,7 +663,7 @@ uint PhaseChaitin::Split(uint maxlrg, ResourceArea* split_arena) {
// create a new phi node and insert it into the block
// type is taken from left over pointer to a predecessor
assert(n3,"No non-NULL reaching DEF for a Phi");
- phi = new (C) PhiNode(b->head(), n3->bottom_type());
+ phi = new PhiNode(b->head(), n3->bottom_type());
// initialize the Reaches entry for this LRG
Reachblock[slidx] = phi;
@@ -1075,7 +1075,7 @@ uint PhaseChaitin::Split(uint maxlrg, ResourceArea* split_arena) {
// First Split-UP to move value into Register
uint def_ideal = def->ideal_reg();
const RegMask* tmp_rm = Matcher::idealreg2regmask[def_ideal];
- Node *spill = new (C) MachSpillCopyNode(MachSpillCopyNode::MemToReg, def, dmask, *tmp_rm);
+ Node *spill = new MachSpillCopyNode(MachSpillCopyNode::MemToReg, def, dmask, *tmp_rm);
insert_proj( b, insidx, spill, maxlrg );
// Then Split-DOWN as if previous Split was DEF
maxlrg = split_USE(MachSpillCopyNode::RegToMem, spill,b,n,inpidx,maxlrg,false,false, splits,slidx);
@@ -1229,7 +1229,7 @@ uint PhaseChaitin::Split(uint maxlrg, ResourceArea* split_arena) {
if (C->check_node_count(NodeLimitFudgeFactor, out_of_nodes)) { // Check when generating nodes
return 0;
}
- Node *spill = new (C) MachSpillCopyNode(MachSpillCopyNode::MemToReg, use,use_rm,def_rm);
+ Node *spill = new MachSpillCopyNode(MachSpillCopyNode::MemToReg, use,use_rm,def_rm);
n->set_req(copyidx,spill);
n->as_MachSpillCopy()->set_in_RegMask(def_rm);
// Put the spill just before the copy
diff --git a/hotspot/src/share/vm/opto/split_if.cpp b/hotspot/src/share/vm/opto/split_if.cpp
index 9b99313f2ac..40a762b03a3 100644
--- a/hotspot/src/share/vm/opto/split_if.cpp
+++ b/hotspot/src/share/vm/opto/split_if.cpp
@@ -35,7 +35,7 @@ Node *PhaseIdealLoop::split_thru_region( Node *n, Node *region ) {
uint wins = 0;
assert( n->is_CFG(), "" );
assert( region->is_Region(), "" );
- Node *r = new (C) RegionNode( region->req() );
+ Node *r = new RegionNode( region->req() );
IdealLoopTree *loop = get_loop( n );
for( uint i = 1; i < region->req(); i++ ) {
Node *x = n->clone();
diff --git a/hotspot/src/share/vm/opto/stringopts.cpp b/hotspot/src/share/vm/opto/stringopts.cpp
index b00bb881faa..fcca4684833 100644
--- a/hotspot/src/share/vm/opto/stringopts.cpp
+++ b/hotspot/src/share/vm/opto/stringopts.cpp
@@ -70,7 +70,7 @@ class StringConcat : public ResourceObj {
_multiple(false),
_string_alloc(NULL),
_stringopts(stringopts) {
- _arguments = new (_stringopts->C) Node(1);
+ _arguments = new Node(1);
_arguments->del_req(0);
}
@@ -228,8 +228,8 @@ class StringConcat : public ResourceObj {
const TypeFunc* call_type = OptoRuntime::uncommon_trap_Type();
const TypePtr* no_memory_effects = NULL;
Compile* C = _stringopts->C;
- CallStaticJavaNode* call = new (C) CallStaticJavaNode(call_type, call_addr, "uncommon_trap",
- jvms->bci(), no_memory_effects);
+ CallStaticJavaNode* call = new CallStaticJavaNode(call_type, call_addr, "uncommon_trap",
+ jvms->bci(), no_memory_effects);
for (int e = 0; e < TypeFunc::Parms; e++) {
call->init_req(e, uct->in(e));
}
@@ -1127,9 +1127,9 @@ Node* PhaseStringOpts::fetch_static_field(GraphKit& kit, ciField* field) {
}
Node* PhaseStringOpts::int_stringSize(GraphKit& kit, Node* arg) {
- RegionNode *final_merge = new (C) RegionNode(3);
+ RegionNode *final_merge = new RegionNode(3);
kit.gvn().set_type(final_merge, Type::CONTROL);
- Node* final_size = new (C) PhiNode(final_merge, TypeInt::INT);
+ Node* final_size = new PhiNode(final_merge, TypeInt::INT);
kit.gvn().set_type(final_size, TypeInt::INT);
IfNode* iff = kit.create_and_map_if(kit.control(),
@@ -1146,11 +1146,11 @@ Node* PhaseStringOpts::int_stringSize(GraphKit& kit, Node* arg) {
} else {
// int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
- RegionNode *r = new (C) RegionNode(3);
+ RegionNode *r = new RegionNode(3);
kit.gvn().set_type(r, Type::CONTROL);
- Node *phi = new (C) PhiNode(r, TypeInt::INT);
+ Node *phi = new PhiNode(r, TypeInt::INT);
kit.gvn().set_type(phi, TypeInt::INT);
- Node *size = new (C) PhiNode(r, TypeInt::INT);
+ Node *size = new PhiNode(r, TypeInt::INT);
kit.gvn().set_type(size, TypeInt::INT);
Node* chk = __ CmpI(arg, __ intcon(0));
Node* p = __ Bool(chk, BoolTest::lt);
@@ -1175,11 +1175,11 @@ Node* PhaseStringOpts::int_stringSize(GraphKit& kit, Node* arg) {
// Add loop predicate first.
kit.add_predicate();
- RegionNode *loop = new (C) RegionNode(3);
+ RegionNode *loop = new RegionNode(3);
loop->init_req(1, kit.control());
kit.gvn().set_type(loop, Type::CONTROL);
- Node *index = new (C) PhiNode(loop, TypeInt::INT);
+ Node *index = new PhiNode(loop, TypeInt::INT);
index->init_req(1, __ intcon(0));
kit.gvn().set_type(index, TypeInt::INT);
kit.set_control(loop);
@@ -1212,7 +1212,7 @@ Node* PhaseStringOpts::int_stringSize(GraphKit& kit, Node* arg) {
}
void PhaseStringOpts::int_getChars(GraphKit& kit, Node* arg, Node* char_array, Node* start, Node* end) {
- RegionNode *final_merge = new (C) RegionNode(4);
+ RegionNode *final_merge = new RegionNode(4);
kit.gvn().set_type(final_merge, Type::CONTROL);
Node *final_mem = PhiNode::make(final_merge, kit.memory(char_adr_idx), Type::MEMORY, TypeAryPtr::CHARS);
kit.gvn().set_type(final_mem, Type::MEMORY);
@@ -1262,11 +1262,11 @@ void PhaseStringOpts::int_getChars(GraphKit& kit, Node* arg, Node* char_array, N
__ Bool(__ CmpI(arg, __ intcon(0)), BoolTest::lt),
PROB_FAIR, COUNT_UNKNOWN);
- RegionNode *merge = new (C) RegionNode(3);
+ RegionNode *merge = new RegionNode(3);
kit.gvn().set_type(merge, Type::CONTROL);
- i = new (C) PhiNode(merge, TypeInt::INT);
+ i = new PhiNode(merge, TypeInt::INT);
kit.gvn().set_type(i, TypeInt::INT);
- sign = new (C) PhiNode(merge, TypeInt::INT);
+ sign = new PhiNode(merge, TypeInt::INT);
kit.gvn().set_type(sign, TypeInt::INT);
merge->init_req(1, __ IfTrue(iff));
@@ -1295,10 +1295,10 @@ void PhaseStringOpts::int_getChars(GraphKit& kit, Node* arg, Node* char_array, N
// Add loop predicate first.
kit.add_predicate();
- RegionNode *head = new (C) RegionNode(3);
+ RegionNode *head = new RegionNode(3);
head->init_req(1, kit.control());
kit.gvn().set_type(head, Type::CONTROL);
- Node *i_phi = new (C) PhiNode(head, TypeInt::INT);
+ Node *i_phi = new PhiNode(head, TypeInt::INT);
i_phi->init_req(1, i);
kit.gvn().set_type(i_phi, TypeInt::INT);
charPos = PhiNode::make(head, charPos);
@@ -1420,7 +1420,7 @@ void PhaseStringOpts::replace_string_concat(StringConcat* sc) {
// as a shim for the insertion of the new code.
JVMState* jvms = sc->begin()->jvms()->clone_shallow(C);
uint size = sc->begin()->req();
- SafePointNode* map = new (C) SafePointNode(size, jvms);
+ SafePointNode* map = new SafePointNode(size, jvms);
// copy the control and memory state from the final call into our
// new starting state. This allows any preceeding tests to feed
@@ -1465,12 +1465,12 @@ void PhaseStringOpts::replace_string_concat(StringConcat* sc) {
// Create a region for the overflow checks to merge into.
int args = MAX2(sc->num_arguments(), 1);
- RegionNode* overflow = new (C) RegionNode(args);
+ RegionNode* overflow = new RegionNode(args);
kit.gvn().set_type(overflow, Type::CONTROL);
// Create a hook node to hold onto the individual sizes since they
// are need for the copying phase.
- Node* string_sizes = new (C) Node(args);
+ Node* string_sizes = new Node(args);
Node* length = __ intcon(0);
for (int argi = 0; argi < sc->num_arguments(); argi++) {
@@ -1514,9 +1514,9 @@ void PhaseStringOpts::replace_string_concat(StringConcat* sc) {
} else if (!type->higher_equal(TypeInstPtr::NOTNULL)) {
// s = s != null ? s : "null";
// length = length + (s.count - s.offset);
- RegionNode *r = new (C) RegionNode(3);
+ RegionNode *r = new RegionNode(3);
kit.gvn().set_type(r, Type::CONTROL);
- Node *phi = new (C) PhiNode(r, type);
+ Node *phi = new PhiNode(r, type);
kit.gvn().set_type(phi, phi->bottom_type());
Node* p = __ Bool(__ CmpP(arg, kit.null()), BoolTest::ne);
IfNode* iff = kit.create_and_map_if(kit.control(), p, PROB_MIN, COUNT_UNKNOWN);
diff --git a/hotspot/src/share/vm/opto/subnode.cpp b/hotspot/src/share/vm/opto/subnode.cpp
index ae41bee47ae..e5f24b6ca6c 100644
--- a/hotspot/src/share/vm/opto/subnode.cpp
+++ b/hotspot/src/share/vm/opto/subnode.cpp
@@ -159,7 +159,7 @@ Node *SubINode::Ideal(PhaseGVN *phase, bool can_reshape){
if( t2->base() == Type::Int ){ // Might be bottom or top...
const TypeInt *i = t2->is_int();
if( i->is_con() )
- return new (phase->C) AddINode(in1, phase->intcon(-i->get_con()));
+ return new AddINode(in1, phase->intcon(-i->get_con()));
}
// Convert "(x+c0) - y" into (x-y) + c0"
@@ -168,8 +168,8 @@ Node *SubINode::Ideal(PhaseGVN *phase, bool can_reshape){
if( op1 == Op_AddI && ok_to_convert(in1, in2) ) {
const Type *tadd = phase->type( in1->in(2) );
if( tadd->singleton() && tadd != Type::TOP ) {
- Node *sub2 = phase->transform( new (phase->C) SubINode( in1->in(1), in2 ));
- return new (phase->C) AddINode( sub2, in1->in(2) );
+ Node *sub2 = phase->transform( new SubINode( in1->in(1), in2 ));
+ return new AddINode( sub2, in1->in(2) );
}
}
@@ -181,9 +181,9 @@ Node *SubINode::Ideal(PhaseGVN *phase, bool can_reshape){
Node* in22 = in2->in(2);
const TypeInt* tcon = phase->type(in22)->isa_int();
if (tcon != NULL && tcon->is_con()) {
- Node* sub2 = phase->transform( new (phase->C) SubINode(in1, in21) );
+ Node* sub2 = phase->transform( new SubINode(in1, in21) );
Node* neg_c0 = phase->intcon(- tcon->get_con());
- return new (phase->C) AddINode(sub2, neg_c0);
+ return new AddINode(sub2, neg_c0);
}
}
@@ -201,47 +201,47 @@ Node *SubINode::Ideal(PhaseGVN *phase, bool can_reshape){
// Convert "x - (x+y)" into "-y"
if( op2 == Op_AddI &&
phase->eqv( in1, in2->in(1) ) )
- return new (phase->C) SubINode( phase->intcon(0),in2->in(2));
+ return new SubINode( phase->intcon(0),in2->in(2));
// Convert "(x-y) - x" into "-y"
if( op1 == Op_SubI &&
phase->eqv( in1->in(1), in2 ) )
- return new (phase->C) SubINode( phase->intcon(0),in1->in(2));
+ return new SubINode( phase->intcon(0),in1->in(2));
// Convert "x - (y+x)" into "-y"
if( op2 == Op_AddI &&
phase->eqv( in1, in2->in(2) ) )
- return new (phase->C) SubINode( phase->intcon(0),in2->in(1));
+ return new SubINode( phase->intcon(0),in2->in(1));
// Convert "0 - (x-y)" into "y-x"
if( t1 == TypeInt::ZERO && op2 == Op_SubI )
- return new (phase->C) SubINode( in2->in(2), in2->in(1) );
+ return new SubINode( in2->in(2), in2->in(1) );
// Convert "0 - (x+con)" into "-con-x"
jint con;
if( t1 == TypeInt::ZERO && op2 == Op_AddI &&
(con = in2->in(2)->find_int_con(0)) != 0 )
- return new (phase->C) SubINode( phase->intcon(-con), in2->in(1) );
+ return new SubINode( phase->intcon(-con), in2->in(1) );
// Convert "(X+A) - (X+B)" into "A - B"
if( op1 == Op_AddI && op2 == Op_AddI && in1->in(1) == in2->in(1) )
- return new (phase->C) SubINode( in1->in(2), in2->in(2) );
+ return new SubINode( in1->in(2), in2->in(2) );
// Convert "(A+X) - (B+X)" into "A - B"
if( op1 == Op_AddI && op2 == Op_AddI && in1->in(2) == in2->in(2) )
- return new (phase->C) SubINode( in1->in(1), in2->in(1) );
+ return new SubINode( in1->in(1), in2->in(1) );
// Convert "(A+X) - (X+B)" into "A - B"
if( op1 == Op_AddI && op2 == Op_AddI && in1->in(2) == in2->in(1) )
- return new (phase->C) SubINode( in1->in(1), in2->in(2) );
+ return new SubINode( in1->in(1), in2->in(2) );
// Convert "(X+A) - (B+X)" into "A - B"
if( op1 == Op_AddI && op2 == Op_AddI && in1->in(1) == in2->in(2) )
- return new (phase->C) SubINode( in1->in(2), in2->in(1) );
+ return new SubINode( in1->in(2), in2->in(1) );
// Convert "A-(B-C)" into (A+C)-B", since add is commutative and generally
// nicer to optimize than subtract.
if( op2 == Op_SubI && in2->outcnt() == 1) {
- Node *add1 = phase->transform( new (phase->C) AddINode( in1, in2->in(2) ) );
- return new (phase->C) SubINode( add1, in2->in(1) );
+ Node *add1 = phase->transform( new AddINode( in1, in2->in(2) ) );
+ return new SubINode( add1, in2->in(1) );
}
return NULL;
@@ -288,7 +288,7 @@ Node *SubLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
// Convert "x-c0" into "x+ -c0".
if( i && // Might be bottom or top...
i->is_con() )
- return new (phase->C) AddLNode(in1, phase->longcon(-i->get_con()));
+ return new AddLNode(in1, phase->longcon(-i->get_con()));
// Convert "(x+c0) - y" into (x-y) + c0"
// Do not collapse (x+c0)-y if "+" is a loop increment or
@@ -297,8 +297,8 @@ Node *SubLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
Node *in11 = in1->in(1);
const Type *tadd = phase->type( in1->in(2) );
if( tadd->singleton() && tadd != Type::TOP ) {
- Node *sub2 = phase->transform( new (phase->C) SubLNode( in11, in2 ));
- return new (phase->C) AddLNode( sub2, in1->in(2) );
+ Node *sub2 = phase->transform( new SubLNode( in11, in2 ));
+ return new AddLNode( sub2, in1->in(2) );
}
}
@@ -309,9 +309,9 @@ Node *SubLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
Node* in22 = in2->in(2);
const TypeLong* tcon = phase->type(in22)->isa_long();
if (tcon != NULL && tcon->is_con()) {
- Node* sub2 = phase->transform( new (phase->C) SubLNode(in1, in21) );
+ Node* sub2 = phase->transform( new SubLNode(in1, in21) );
Node* neg_c0 = phase->longcon(- tcon->get_con());
- return new (phase->C) AddLNode(sub2, neg_c0);
+ return new AddLNode(sub2, neg_c0);
}
}
@@ -329,28 +329,28 @@ Node *SubLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
// Convert "x - (x+y)" into "-y"
if( op2 == Op_AddL &&
phase->eqv( in1, in2->in(1) ) )
- return new (phase->C) SubLNode( phase->makecon(TypeLong::ZERO), in2->in(2));
+ return new SubLNode( phase->makecon(TypeLong::ZERO), in2->in(2));
// Convert "x - (y+x)" into "-y"
if( op2 == Op_AddL &&
phase->eqv( in1, in2->in(2) ) )
- return new (phase->C) SubLNode( phase->makecon(TypeLong::ZERO),in2->in(1));
+ return new SubLNode( phase->makecon(TypeLong::ZERO),in2->in(1));
// Convert "0 - (x-y)" into "y-x"
if( phase->type( in1 ) == TypeLong::ZERO && op2 == Op_SubL )
- return new (phase->C) SubLNode( in2->in(2), in2->in(1) );
+ return new SubLNode( in2->in(2), in2->in(1) );
// Convert "(X+A) - (X+B)" into "A - B"
if( op1 == Op_AddL && op2 == Op_AddL && in1->in(1) == in2->in(1) )
- return new (phase->C) SubLNode( in1->in(2), in2->in(2) );
+ return new SubLNode( in1->in(2), in2->in(2) );
// Convert "(A+X) - (B+X)" into "A - B"
if( op1 == Op_AddL && op2 == Op_AddL && in1->in(2) == in2->in(2) )
- return new (phase->C) SubLNode( in1->in(1), in2->in(1) );
+ return new SubLNode( in1->in(1), in2->in(1) );
// Convert "A-(B-C)" into (A+C)-B"
if( op2 == Op_SubL && in2->outcnt() == 1) {
- Node *add1 = phase->transform( new (phase->C) AddLNode( in1, in2->in(2) ) );
- return new (phase->C) SubLNode( add1, in2->in(1) );
+ Node *add1 = phase->transform( new AddLNode( in1, in2->in(2) ) );
+ return new SubLNode( add1, in2->in(1) );
}
return NULL;
@@ -417,7 +417,7 @@ Node *SubFNode::Ideal(PhaseGVN *phase, bool can_reshape) {
// Convert "x - (x+y)" into "-y"
if( in(2)->is_Add() &&
phase->eqv(in(1),in(2)->in(1) ) )
- return new (phase->C) SubFNode( phase->makecon(TypeF::ZERO),in(2)->in(2));
+ return new SubFNode( phase->makecon(TypeF::ZERO),in(2)->in(2));
}
// Cannot replace 0.0-X with -X because a 'fsub' bytecode computes
@@ -460,7 +460,7 @@ Node *SubDNode::Ideal(PhaseGVN *phase, bool can_reshape){
// Convert "x - (x+y)" into "-y"
if( in(2)->is_Add() &&
phase->eqv(in(1),in(2)->in(1) ) )
- return new (phase->C) SubDNode( phase->makecon(TypeD::ZERO),in(2)->in(2));
+ return new SubDNode( phase->makecon(TypeD::ZERO),in(2)->in(2));
}
// Cannot replace 0.0-X with -X because a 'dsub' bytecode computes
@@ -666,11 +666,11 @@ Node *CmpINode::Ideal( PhaseGVN *phase, bool can_reshape ) {
if (phase->type(in(2))->higher_equal(TypeInt::ZERO)) {
switch (in(1)->Opcode()) {
case Op_CmpL3: // Collapse a CmpL3/CmpI into a CmpL
- return new (phase->C) CmpLNode(in(1)->in(1),in(1)->in(2));
+ return new CmpLNode(in(1)->in(1),in(1)->in(2));
case Op_CmpF3: // Collapse a CmpF3/CmpI into a CmpF
- return new (phase->C) CmpFNode(in(1)->in(1),in(1)->in(2));
+ return new CmpFNode(in(1)->in(1),in(1)->in(2));
case Op_CmpD3: // Collapse a CmpD3/CmpI into a CmpD
- return new (phase->C) CmpDNode(in(1)->in(1),in(1)->in(2));
+ return new CmpDNode(in(1)->in(1),in(1)->in(2));
//case Op_SubI:
// If (x - y) cannot overflow, then ((x - y) > 0)
// can be turned into (x > y).
@@ -1109,8 +1109,8 @@ Node *CmpDNode::Ideal(PhaseGVN *phase, bool can_reshape){
new_in2 = tmp;
}
CmpFNode *new_cmp = (Opcode() == Op_CmpD3)
- ? new (phase->C) CmpF3Node( new_in1, new_in2 )
- : new (phase->C) CmpFNode ( new_in1, new_in2 ) ;
+ ? new CmpF3Node( new_in1, new_in2 )
+ : new CmpFNode ( new_in1, new_in2 ) ;
return new_cmp; // Changed to CmpFNode
}
// Testing value required the precision of a double
@@ -1182,9 +1182,9 @@ Node* BoolNode::make_predicate(Node* test_value, PhaseGVN* phase) {
// Else fall through. The CMove gets in the way of the test.
// It should be the case that make_predicate(bol->as_int_value()) == bol.
}
- Node* cmp = new (C) CmpINode(test_value, phase->intcon(0));
+ Node* cmp = new CmpINode(test_value, phase->intcon(0));
cmp = phase->transform(cmp);
- Node* bol = new (C) BoolNode(cmp, BoolTest::ne);
+ Node* bol = new BoolNode(cmp, BoolTest::ne);
return phase->transform(bol);
}
@@ -1200,7 +1200,7 @@ Node* BoolNode::as_int_value(PhaseGVN* phase) {
//----------------------------------negate-------------------------------------
BoolNode* BoolNode::negate(PhaseGVN* phase) {
Compile* C = phase->C;
- return new (C) BoolNode(in(1), _test.negate());
+ return new BoolNode(in(1), _test.negate());
}
@@ -1238,7 +1238,7 @@ Node *BoolNode::Ideal(PhaseGVN *phase, bool can_reshape) {
// Swap inputs to the clone
cmp->swap_edges(1, 2);
cmp = phase->transform( cmp );
- return new (phase->C) BoolNode( cmp, _test.commute() );
+ return new BoolNode( cmp, _test.commute() );
}
// Change "bool eq/ne (cmp (xor X 1) 0)" into "bool ne/eq (cmp X 0)".
@@ -1255,8 +1255,8 @@ Node *BoolNode::Ideal(PhaseGVN *phase, bool can_reshape) {
phase->type( j_xor->in(2) ) == TypeInt::ONE &&
(_test._test == BoolTest::eq ||
_test._test == BoolTest::ne) ) {
- Node *ncmp = phase->transform(new (phase->C) CmpINode(j_xor->in(1),cmp2));
- return new (phase->C) BoolNode( ncmp, _test.negate() );
+ Node *ncmp = phase->transform(new CmpINode(j_xor->in(1),cmp2));
+ return new BoolNode( ncmp, _test.negate() );
}
// Change "bool eq/ne (cmp (Conv2B X) 0)" into "bool eq/ne (cmp X 0)".
@@ -1267,10 +1267,10 @@ Node *BoolNode::Ideal(PhaseGVN *phase, bool can_reshape) {
(_test._test == BoolTest::eq ||
_test._test == BoolTest::ne) ) {
Node *ncmp = phase->transform(phase->type(c2b->in(1))->isa_int()
- ? (Node*)new (phase->C) CmpINode(c2b->in(1),cmp2)
- : (Node*)new (phase->C) CmpPNode(c2b->in(1),phase->makecon(TypePtr::NULL_PTR))
+ ? (Node*)new CmpINode(c2b->in(1),cmp2)
+ : (Node*)new CmpPNode(c2b->in(1),phase->makecon(TypePtr::NULL_PTR))
);
- return new (phase->C) BoolNode( ncmp, _test._test );
+ return new BoolNode( ncmp, _test._test );
}
// Comparing a SubI against a zero is equal to comparing the SubI
@@ -1280,8 +1280,8 @@ Node *BoolNode::Ideal(PhaseGVN *phase, bool can_reshape) {
(cop == Op_CmpI) &&
(cmp1->Opcode() == Op_SubI) &&
( cmp2_type == TypeInt::ZERO ) ) {
- Node *ncmp = phase->transform( new (phase->C) CmpINode(cmp1->in(1),cmp1->in(2)));
- return new (phase->C) BoolNode( ncmp, _test._test );
+ Node *ncmp = phase->transform( new CmpINode(cmp1->in(1),cmp1->in(2)));
+ return new BoolNode( ncmp, _test._test );
}
// Change (-A vs 0) into (A vs 0) by commuting the test. Disallow in the
@@ -1292,8 +1292,8 @@ Node *BoolNode::Ideal(PhaseGVN *phase, bool can_reshape) {
cmp2_type == TypeInt::ZERO &&
phase->type( cmp1->in(1) ) == TypeInt::ZERO &&
phase->type( cmp1->in(2) )->higher_equal(TypeInt::SYMINT) ) {
- Node *ncmp = phase->transform( new (phase->C) CmpINode(cmp1->in(2),cmp2));
- return new (phase->C) BoolNode( ncmp, _test.commute() );
+ Node *ncmp = phase->transform( new CmpINode(cmp1->in(2),cmp2));
+ return new BoolNode( ncmp, _test.commute() );
}
// The transformation below is not valid for either signed or unsigned
diff --git a/hotspot/src/share/vm/opto/superword.cpp b/hotspot/src/share/vm/opto/superword.cpp
index 49a0dae9ece..72fabf9cc22 100644
--- a/hotspot/src/share/vm/opto/superword.cpp
+++ b/hotspot/src/share/vm/opto/superword.cpp
@@ -1456,7 +1456,7 @@ Node* SuperWord::vector_opd(Node_List* p, int opd_idx) {
if (t == NULL || t->_lo < 0 || t->_hi > (int)mask) {
cnt = ConNode::make(C, TypeInt::make(mask));
_igvn.register_new_node_with_optimizer(cnt);
- cnt = new (C) AndINode(opd, cnt);
+ cnt = new AndINode(opd, cnt);
_igvn.register_new_node_with_optimizer(cnt);
_phase->set_ctrl(cnt, _phase->get_ctrl(opd));
}
@@ -2067,42 +2067,42 @@ void SuperWord::align_initial_loop_index(MemNode* align_to_ref) {
if (align_to_ref_p.invar() != NULL) {
// incorporate any extra invariant piece producing (offset +/- invar) >>> log2(elt)
Node* log2_elt = _igvn.intcon(exact_log2(elt_size));
- Node* aref = new (_phase->C) URShiftINode(align_to_ref_p.invar(), log2_elt);
+ Node* aref = new URShiftINode(align_to_ref_p.invar(), log2_elt);
_igvn.register_new_node_with_optimizer(aref);
_phase->set_ctrl(aref, pre_ctrl);
if (align_to_ref_p.negate_invar()) {
- e = new (_phase->C) SubINode(e, aref);
+ e = new SubINode(e, aref);
} else {
- e = new (_phase->C) AddINode(e, aref);
+ e = new AddINode(e, aref);
}
_igvn.register_new_node_with_optimizer(e);
_phase->set_ctrl(e, pre_ctrl);
}
if (vw > ObjectAlignmentInBytes) {
// incorporate base e +/- base && Mask >>> log2(elt)
- Node* xbase = new(_phase->C) CastP2XNode(NULL, align_to_ref_p.base());
+ Node* xbase = new CastP2XNode(NULL, align_to_ref_p.base());
_igvn.register_new_node_with_optimizer(xbase);
#ifdef _LP64
- xbase = new (_phase->C) ConvL2INode(xbase);
+ xbase = new ConvL2INode(xbase);
_igvn.register_new_node_with_optimizer(xbase);
#endif
Node* mask = _igvn.intcon(vw-1);
- Node* masked_xbase = new (_phase->C) AndINode(xbase, mask);
+ Node* masked_xbase = new AndINode(xbase, mask);
_igvn.register_new_node_with_optimizer(masked_xbase);
Node* log2_elt = _igvn.intcon(exact_log2(elt_size));
- Node* bref = new (_phase->C) URShiftINode(masked_xbase, log2_elt);
+ Node* bref = new URShiftINode(masked_xbase, log2_elt);
_igvn.register_new_node_with_optimizer(bref);
_phase->set_ctrl(bref, pre_ctrl);
- e = new (_phase->C) AddINode(e, bref);
+ e = new AddINode(e, bref);
_igvn.register_new_node_with_optimizer(e);
_phase->set_ctrl(e, pre_ctrl);
}
// compute e +/- lim0
if (scale < 0) {
- e = new (_phase->C) SubINode(e, lim0);
+ e = new SubINode(e, lim0);
} else {
- e = new (_phase->C) AddINode(e, lim0);
+ e = new AddINode(e, lim0);
}
_igvn.register_new_node_with_optimizer(e);
_phase->set_ctrl(e, pre_ctrl);
@@ -2110,13 +2110,13 @@ void SuperWord::align_initial_loop_index(MemNode* align_to_ref) {
if (stride * scale > 0) {
// compute V - (e +/- lim0)
Node* va = _igvn.intcon(v_align);
- e = new (_phase->C) SubINode(va, e);
+ e = new SubINode(va, e);
_igvn.register_new_node_with_optimizer(e);
_phase->set_ctrl(e, pre_ctrl);
}
// compute N = (exp) % V
Node* va_msk = _igvn.intcon(v_align - 1);
- Node* N = new (_phase->C) AndINode(e, va_msk);
+ Node* N = new AndINode(e, va_msk);
_igvn.register_new_node_with_optimizer(N);
_phase->set_ctrl(N, pre_ctrl);
@@ -2124,15 +2124,15 @@ void SuperWord::align_initial_loop_index(MemNode* align_to_ref) {
// lim = lim0 + N
Node* lim;
if (stride < 0) {
- lim = new (_phase->C) SubINode(lim0, N);
+ lim = new SubINode(lim0, N);
} else {
- lim = new (_phase->C) AddINode(lim0, N);
+ lim = new AddINode(lim0, N);
}
_igvn.register_new_node_with_optimizer(lim);
_phase->set_ctrl(lim, pre_ctrl);
Node* constrained =
- (stride > 0) ? (Node*) new (_phase->C) MinINode(lim, orig_limit)
- : (Node*) new (_phase->C) MaxINode(lim, orig_limit);
+ (stride > 0) ? (Node*) new MinINode(lim, orig_limit)
+ : (Node*) new MaxINode(lim, orig_limit);
_igvn.register_new_node_with_optimizer(constrained);
_phase->set_ctrl(constrained, pre_ctrl);
_igvn.hash_delete(pre_opaq);
diff --git a/hotspot/src/share/vm/opto/vectornode.cpp b/hotspot/src/share/vm/opto/vectornode.cpp
index 9660d4ed818..21b51e5b524 100644
--- a/hotspot/src/share/vm/opto/vectornode.cpp
+++ b/hotspot/src/share/vm/opto/vectornode.cpp
@@ -252,46 +252,46 @@ VectorNode* VectorNode::make(Compile* C, int opc, Node* n1, Node* n2, uint vlen,
guarantee(vopc > 0, err_msg_res("Vector for '%s' is not implemented", NodeClassNames[opc]));
switch (vopc) {
- case Op_AddVB: return new (C) AddVBNode(n1, n2, vt);
- case Op_AddVS: return new (C) AddVSNode(n1, n2, vt);
- case Op_AddVI: return new (C) AddVINode(n1, n2, vt);
- case Op_AddVL: return new (C) AddVLNode(n1, n2, vt);
- case Op_AddVF: return new (C) AddVFNode(n1, n2, vt);
- case Op_AddVD: return new (C) AddVDNode(n1, n2, vt);
+ case Op_AddVB: return new AddVBNode(n1, n2, vt);
+ case Op_AddVS: return new AddVSNode(n1, n2, vt);
+ case Op_AddVI: return new AddVINode(n1, n2, vt);
+ case Op_AddVL: return new AddVLNode(n1, n2, vt);
+ case Op_AddVF: return new AddVFNode(n1, n2, vt);
+ case Op_AddVD: return new AddVDNode(n1, n2, vt);
- case Op_SubVB: return new (C) SubVBNode(n1, n2, vt);
- case Op_SubVS: return new (C) SubVSNode(n1, n2, vt);
- case Op_SubVI: return new (C) SubVINode(n1, n2, vt);
- case Op_SubVL: return new (C) SubVLNode(n1, n2, vt);
- case Op_SubVF: return new (C) SubVFNode(n1, n2, vt);
- case Op_SubVD: return new (C) SubVDNode(n1, n2, vt);
+ case Op_SubVB: return new SubVBNode(n1, n2, vt);
+ case Op_SubVS: return new SubVSNode(n1, n2, vt);
+ case Op_SubVI: return new SubVINode(n1, n2, vt);
+ case Op_SubVL: return new SubVLNode(n1, n2, vt);
+ case Op_SubVF: return new SubVFNode(n1, n2, vt);
+ case Op_SubVD: return new SubVDNode(n1, n2, vt);
- case Op_MulVS: return new (C) MulVSNode(n1, n2, vt);
- case Op_MulVI: return new (C) MulVINode(n1, n2, vt);
- case Op_MulVF: return new (C) MulVFNode(n1, n2, vt);
- case Op_MulVD: return new (C) MulVDNode(n1, n2, vt);
+ case Op_MulVS: return new MulVSNode(n1, n2, vt);
+ case Op_MulVI: return new MulVINode(n1, n2, vt);
+ case Op_MulVF: return new MulVFNode(n1, n2, vt);
+ case Op_MulVD: return new MulVDNode(n1, n2, vt);
- case Op_DivVF: return new (C) DivVFNode(n1, n2, vt);
- case Op_DivVD: return new (C) DivVDNode(n1, n2, vt);
+ case Op_DivVF: return new DivVFNode(n1, n2, vt);
+ case Op_DivVD: return new DivVDNode(n1, n2, vt);
- case Op_LShiftVB: return new (C) LShiftVBNode(n1, n2, vt);
- case Op_LShiftVS: return new (C) LShiftVSNode(n1, n2, vt);
- case Op_LShiftVI: return new (C) LShiftVINode(n1, n2, vt);
- case Op_LShiftVL: return new (C) LShiftVLNode(n1, n2, vt);
+ case Op_LShiftVB: return new LShiftVBNode(n1, n2, vt);
+ case Op_LShiftVS: return new LShiftVSNode(n1, n2, vt);
+ case Op_LShiftVI: return new LShiftVINode(n1, n2, vt);
+ case Op_LShiftVL: return new LShiftVLNode(n1, n2, vt);
- case Op_RShiftVB: return new (C) RShiftVBNode(n1, n2, vt);
- case Op_RShiftVS: return new (C) RShiftVSNode(n1, n2, vt);
- case Op_RShiftVI: return new (C) RShiftVINode(n1, n2, vt);
- case Op_RShiftVL: return new (C) RShiftVLNode(n1, n2, vt);
+ case Op_RShiftVB: return new RShiftVBNode(n1, n2, vt);
+ case Op_RShiftVS: return new RShiftVSNode(n1, n2, vt);
+ case Op_RShiftVI: return new RShiftVINode(n1, n2, vt);
+ case Op_RShiftVL: return new RShiftVLNode(n1, n2, vt);
- case Op_URShiftVB: return new (C) URShiftVBNode(n1, n2, vt);
- case Op_URShiftVS: return new (C) URShiftVSNode(n1, n2, vt);
- case Op_URShiftVI: return new (C) URShiftVINode(n1, n2, vt);
- case Op_URShiftVL: return new (C) URShiftVLNode(n1, n2, vt);
+ case Op_URShiftVB: return new URShiftVBNode(n1, n2, vt);
+ case Op_URShiftVS: return new URShiftVSNode(n1, n2, vt);
+ case Op_URShiftVI: return new URShiftVINode(n1, n2, vt);
+ case Op_URShiftVL: return new URShiftVLNode(n1, n2, vt);
- case Op_AndV: return new (C) AndVNode(n1, n2, vt);
- case Op_OrV: return new (C) OrVNode (n1, n2, vt);
- case Op_XorV: return new (C) XorVNode(n1, n2, vt);
+ case Op_AndV: return new AndVNode(n1, n2, vt);
+ case Op_OrV: return new OrVNode (n1, n2, vt);
+ case Op_XorV: return new XorVNode(n1, n2, vt);
}
fatal(err_msg_res("Missed vector creation for '%s'", NodeClassNames[vopc]));
return NULL;
@@ -306,18 +306,18 @@ VectorNode* VectorNode::scalar2vector(Compile* C, Node* s, uint vlen, const Type
switch (bt) {
case T_BOOLEAN:
case T_BYTE:
- return new (C) ReplicateBNode(s, vt);
+ return new ReplicateBNode(s, vt);
case T_CHAR:
case T_SHORT:
- return new (C) ReplicateSNode(s, vt);
+ return new ReplicateSNode(s, vt);
case T_INT:
- return new (C) ReplicateINode(s, vt);
+ return new ReplicateINode(s, vt);
case T_LONG:
- return new (C) ReplicateLNode(s, vt);
+ return new ReplicateLNode(s, vt);
case T_FLOAT:
- return new (C) ReplicateFNode(s, vt);
+ return new ReplicateFNode(s, vt);
case T_DOUBLE:
- return new (C) ReplicateDNode(s, vt);
+ return new ReplicateDNode(s, vt);
}
fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt)));
return NULL;
@@ -330,12 +330,12 @@ VectorNode* VectorNode::shift_count(Compile* C, Node* shift, Node* cnt, uint vle
switch (shift->Opcode()) {
case Op_LShiftI:
case Op_LShiftL:
- return new (C) LShiftCntVNode(cnt, vt);
+ return new LShiftCntVNode(cnt, vt);
case Op_RShiftI:
case Op_RShiftL:
case Op_URShiftI:
case Op_URShiftL:
- return new (C) RShiftCntVNode(cnt, vt);
+ return new RShiftCntVNode(cnt, vt);
}
fatal(err_msg_res("Missed vector creation for '%s'", NodeClassNames[shift->Opcode()]));
return NULL;
@@ -347,18 +347,18 @@ PackNode* PackNode::make(Compile* C, Node* s, uint vlen, BasicType bt) {
switch (bt) {
case T_BOOLEAN:
case T_BYTE:
- return new (C) PackBNode(s, vt);
+ return new PackBNode(s, vt);
case T_CHAR:
case T_SHORT:
- return new (C) PackSNode(s, vt);
+ return new PackSNode(s, vt);
case T_INT:
- return new (C) PackINode(s, vt);
+ return new PackINode(s, vt);
case T_LONG:
- return new (C) PackLNode(s, vt);
+ return new PackLNode(s, vt);
case T_FLOAT:
- return new (C) PackFNode(s, vt);
+ return new PackFNode(s, vt);
case T_DOUBLE:
- return new (C) PackDNode(s, vt);
+ return new PackDNode(s, vt);
}
fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt)));
return NULL;
@@ -383,18 +383,18 @@ PackNode* PackNode::binary_tree_pack(Compile* C, int lo, int hi) {
switch (bt) {
case T_BOOLEAN:
case T_BYTE:
- return new (C) PackSNode(n1, n2, TypeVect::make(T_SHORT, 2));
+ return new PackSNode(n1, n2, TypeVect::make(T_SHORT, 2));
case T_CHAR:
case T_SHORT:
- return new (C) PackINode(n1, n2, TypeVect::make(T_INT, 2));
+ return new PackINode(n1, n2, TypeVect::make(T_INT, 2));
case T_INT:
- return new (C) PackLNode(n1, n2, TypeVect::make(T_LONG, 2));
+ return new PackLNode(n1, n2, TypeVect::make(T_LONG, 2));
case T_LONG:
- return new (C) Pack2LNode(n1, n2, TypeVect::make(T_LONG, 2));
+ return new Pack2LNode(n1, n2, TypeVect::make(T_LONG, 2));
case T_FLOAT:
- return new (C) PackDNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
+ return new PackDNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
case T_DOUBLE:
- return new (C) Pack2DNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
+ return new Pack2DNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
}
fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt)));
}
@@ -405,14 +405,14 @@ PackNode* PackNode::binary_tree_pack(Compile* C, int lo, int hi) {
LoadVectorNode* LoadVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem,
Node* adr, const TypePtr* atyp, uint vlen, BasicType bt) {
const TypeVect* vt = TypeVect::make(bt, vlen);
- return new (C) LoadVectorNode(ctl, mem, adr, atyp, vt);
+ return new LoadVectorNode(ctl, mem, adr, atyp, vt);
}
// Return the vector version of a scalar store node.
StoreVectorNode* StoreVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem,
Node* adr, const TypePtr* atyp, Node* val,
uint vlen) {
- return new (C) StoreVectorNode(ctl, mem, adr, atyp, val);
+ return new StoreVectorNode(ctl, mem, adr, atyp, val);
}
// Extract a scalar element of vector.
@@ -421,21 +421,21 @@ Node* ExtractNode::make(Compile* C, Node* v, uint position, BasicType bt) {
ConINode* pos = ConINode::make(C, (int)position);
switch (bt) {
case T_BOOLEAN:
- return new (C) ExtractUBNode(v, pos);
+ return new ExtractUBNode(v, pos);
case T_BYTE:
- return new (C) ExtractBNode(v, pos);
+ return new ExtractBNode(v, pos);
case T_CHAR:
- return new (C) ExtractCNode(v, pos);
+ return new ExtractCNode(v, pos);
case T_SHORT:
- return new (C) ExtractSNode(v, pos);
+ return new ExtractSNode(v, pos);
case T_INT:
- return new (C) ExtractINode(v, pos);
+ return new ExtractINode(v, pos);
case T_LONG:
- return new (C) ExtractLNode(v, pos);
+ return new ExtractLNode(v, pos);
case T_FLOAT:
- return new (C) ExtractFNode(v, pos);
+ return new ExtractFNode(v, pos);
case T_DOUBLE:
- return new (C) ExtractDNode(v, pos);
+ return new ExtractDNode(v, pos);
}
fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt)));
return NULL;
From bdb8050bbf0577ece28f6535d70f9d64b084f5f2 Mon Sep 17 00:00:00 2001
From: Roland Westrelin
Date: Mon, 2 Jun 2014 10:01:15 +0200
Subject: [PATCH 08/76] 8043413: REGRESSION: Hotspot causes segmentation fault
in jdk8ux, but not in jdk7ux
Long series of lambda form calls trigger stack overflow in c2
Reviewed-by: kvn, vlivanov
---
hotspot/src/share/vm/opto/bytecodeInfo.cpp | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/hotspot/src/share/vm/opto/bytecodeInfo.cpp b/hotspot/src/share/vm/opto/bytecodeInfo.cpp
index 101d5f73325..c4ee166a20c 100644
--- a/hotspot/src/share/vm/opto/bytecodeInfo.cpp
+++ b/hotspot/src/share/vm/opto/bytecodeInfo.cpp
@@ -361,11 +361,14 @@ bool InlineTree::try_to_inline(ciMethod* callee_method, ciMethod* caller_method,
set_msg("not an accessor");
return false;
}
+
+ // Limit inlining depth in case inlining is forced or
+ // _max_inline_level was increased to compensate for lambda forms.
+ if (inline_level() > MaxForceInlineLevel) {
+ set_msg("MaxForceInlineLevel");
+ return false;
+ }
if (inline_level() > _max_inline_level) {
- if (callee_method->force_inline() && inline_level() > MaxForceInlineLevel) {
- set_msg("MaxForceInlineLevel");
- return false;
- }
if (!callee_method->force_inline() || !IncrementalInline) {
set_msg("inlining too deep");
return false;
From ddffd7c3f1f062aba5ad6261118a1d2ba209107d Mon Sep 17 00:00:00 2001
From: Igor Veresov
Date: Mon, 2 Jun 2014 07:26:52 -1000
Subject: [PATCH 09/76] 8044496: 8034812 broke build with clang
Remove superfluous clang-diagnostic-pop
Reviewed-by: kvn, drchase
---
hotspot/src/share/vm/opto/node.cpp | 4 ----
1 file changed, 4 deletions(-)
diff --git a/hotspot/src/share/vm/opto/node.cpp b/hotspot/src/share/vm/opto/node.cpp
index c52ac9895ab..7b5ffc48d64 100644
--- a/hotspot/src/share/vm/opto/node.cpp
+++ b/hotspot/src/share/vm/opto/node.cpp
@@ -456,10 +456,6 @@ Node::Node(Node *n0, Node *n1, Node *n2, Node *n3,
_in[6] = n6; if (n6 != NULL) n6->add_out((Node *)this);
}
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
-
//------------------------------clone------------------------------------------
// Clone a Node.
From 23d6ad76d7e661d74b297839eb31e74472c2fd29 Mon Sep 17 00:00:00 2001
From: David Chase
Date: Mon, 2 Jun 2014 14:32:29 -0400
Subject: [PATCH 10/76] 8029381: assert(is_method_type()) failed: bad cast
Access to method_type and appendix from constant pool (cpcache) needs to be guarded by is_f1_null() because of racy update/initialization.
Reviewed-by: kvn, coleenp, jrose
---
hotspot/src/share/vm/oops/cpCache.cpp | 4 ++--
hotspot/src/share/vm/oops/cpCache.hpp | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/hotspot/src/share/vm/oops/cpCache.cpp b/hotspot/src/share/vm/oops/cpCache.cpp
index 527b771fd68..d601367ba99 100644
--- a/hotspot/src/share/vm/oops/cpCache.cpp
+++ b/hotspot/src/share/vm/oops/cpCache.cpp
@@ -407,7 +407,7 @@ Method* ConstantPoolCacheEntry::method_if_resolved(constantPoolHandle cpool) {
oop ConstantPoolCacheEntry::appendix_if_resolved(constantPoolHandle cpool) {
- if (is_f1_null() || !has_appendix())
+ if (!has_appendix())
return NULL;
const int ref_index = f2_as_index() + _indy_resolved_references_appendix_offset;
objArrayOop resolved_references = cpool->resolved_references();
@@ -416,7 +416,7 @@ oop ConstantPoolCacheEntry::appendix_if_resolved(constantPoolHandle cpool) {
oop ConstantPoolCacheEntry::method_type_if_resolved(constantPoolHandle cpool) {
- if (is_f1_null() || !has_method_type())
+ if (!has_method_type())
return NULL;
const int ref_index = f2_as_index() + _indy_resolved_references_method_type_offset;
objArrayOop resolved_references = cpool->resolved_references();
diff --git a/hotspot/src/share/vm/oops/cpCache.hpp b/hotspot/src/share/vm/oops/cpCache.hpp
index ee3a664b352..debd09136c7 100644
--- a/hotspot/src/share/vm/oops/cpCache.hpp
+++ b/hotspot/src/share/vm/oops/cpCache.hpp
@@ -348,8 +348,8 @@ class ConstantPoolCacheEntry VALUE_OBJ_CLASS_SPEC {
bool is_final() const { return (_flags & (1 << is_final_shift)) != 0; }
bool is_forced_virtual() const { return (_flags & (1 << is_forced_virtual_shift)) != 0; }
bool is_vfinal() const { return (_flags & (1 << is_vfinal_shift)) != 0; }
- bool has_appendix() const { return (_flags & (1 << has_appendix_shift)) != 0; }
- bool has_method_type() const { return (_flags & (1 << has_method_type_shift)) != 0; }
+ bool has_appendix() const { return (!is_f1_null()) && (_flags & (1 << has_appendix_shift)) != 0; }
+ bool has_method_type() const { return (!is_f1_null()) && (_flags & (1 << has_method_type_shift)) != 0; }
bool is_method_entry() const { return (_flags & (1 << is_field_entry_shift)) == 0; }
bool is_field_entry() const { return (_flags & (1 << is_field_entry_shift)) != 0; }
bool is_byte() const { return flag_state() == btos; }
From e09b9cbc3ca2f4fc194e79e1c084998b1e798b4b Mon Sep 17 00:00:00 2001
From: Mikael Vidstedt
Date: Mon, 2 Jun 2014 15:48:34 -0700
Subject: [PATCH 11/76] 8044242: Remove dead NativeMovRegMemPatching class
Reviewed-by: twisti, kvn
---
hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp | 143 ------------------
hotspot/src/cpu/sparc/vm/nativeInst_sparc.hpp | 91 -----------
hotspot/src/cpu/x86/vm/nativeInst_x86.hpp | 12 --
3 files changed, 246 deletions(-)
diff --git a/hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp b/hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp
index 3d2f531402c..2ec40f8fd0d 100644
--- a/hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp
+++ b/hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp
@@ -690,149 +690,6 @@ void NativeMovRegMem::test() {
// End code for unit testing implementation of NativeMovRegMem class
-//--------------------------------------------------------------------------------
-
-
-void NativeMovRegMemPatching::copy_instruction_to(address new_instruction_address) {
- Untested("copy_instruction_to");
- int instruction_size = next_instruction_address() - instruction_address();
- for (int i = 0; i < instruction_size; i += wordSize) {
- *(long*)(new_instruction_address + i) = *(long*)(address(this) + i);
- }
-}
-
-
-void NativeMovRegMemPatching::verify() {
- NativeInstruction::verify();
- // make sure code pattern is actually a "ld" or "st" of some sort.
- int i0 = long_at(0);
- int op3 = inv_op3(i0);
-
- assert((int)nop_offset == (int)NativeMovConstReg::add_offset, "sethi size ok");
-
- if (!(is_op(i0, Assembler::ldst_op) &&
- inv_immed(i0) &&
- 0 != (op3 < op3_ldst_int_limit
- ? (1 << op3 ) & (op3_mask_ld | op3_mask_st)
- : (1 << (op3 - op3_ldst_int_limit)) & (op3_mask_ldf | op3_mask_stf)))) {
- int i1 = long_at(ldst_offset);
- Register rd = inv_rd(i0);
-
- op3 = inv_op3(i1);
- if (!is_op(i1, Assembler::ldst_op) && rd == inv_rs2(i1) &&
- 0 != (op3 < op3_ldst_int_limit
- ? (1 << op3 ) & (op3_mask_ld | op3_mask_st)
- : (1 << (op3 - op3_ldst_int_limit)) & (op3_mask_ldf | op3_mask_stf))) {
- fatal("not a ld* or st* op");
- }
- }
-}
-
-
-void NativeMovRegMemPatching::print() {
- if (is_immediate()) {
- tty->print_cr(INTPTR_FORMAT ": mov reg, [reg + %d]", p2i(instruction_address()), offset());
- } else {
- tty->print_cr(INTPTR_FORMAT ": mov reg, [reg + reg]", p2i(instruction_address()));
- }
-}
-
-
-// Code for unit testing implementation of NativeMovRegMemPatching class
-void NativeMovRegMemPatching::test() {
-#ifdef ASSERT
- ResourceMark rm;
- CodeBuffer cb("test", 1000, 1000);
- MacroAssembler* a = new MacroAssembler(&cb);
- NativeMovRegMemPatching* nm;
- uint idx = 0;
- uint idx1;
- int offsets[] = {
- 0x0,
- 0xffffffff,
- 0x7fffffff,
- 0x80000000,
- 4096,
- 4097,
- 0x20,
- 0x4000,
- };
-
- VM_Version::allow_all();
-
- AddressLiteral al(0xffffffff, relocInfo::external_word_type);
- a->ldsw( G5, al.low10(), G4); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->ldsw( G5, I3, G4 ); idx++;
- a->ldsb( G5, al.low10(), G4); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->ldsb( G5, I3, G4 ); idx++;
- a->ldsh( G5, al.low10(), G4); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->ldsh( G5, I3, G4 ); idx++;
- a->lduw( G5, al.low10(), G4); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->lduw( G5, I3, G4 ); idx++;
- a->ldub( G5, al.low10(), G4); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->ldub( G5, I3, G4 ); idx++;
- a->lduh( G5, al.low10(), G4); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->lduh( G5, I3, G4 ); idx++;
- a->ldx( G5, al.low10(), G4); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->ldx( G5, I3, G4 ); idx++;
- a->ldd( G5, al.low10(), G4); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->ldd( G5, I3, G4 ); idx++;
- a->ldf( FloatRegisterImpl::D, O2, -1, F14 ); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->ldf( FloatRegisterImpl::S, O0, I3, F15 ); idx++;
-
- a->stw( G5, G4, al.low10()); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->stw( G5, G4, I3 ); idx++;
- a->stb( G5, G4, al.low10()); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->stb( G5, G4, I3 ); idx++;
- a->sth( G5, G4, al.low10()); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->sth( G5, G4, I3 ); idx++;
- a->stx( G5, G4, al.low10()); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->stx( G5, G4, I3 ); idx++;
- a->std( G5, G4, al.low10()); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->std( G5, G4, I3 ); idx++;
- a->stf( FloatRegisterImpl::S, F18, O2, -1 ); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->stf( FloatRegisterImpl::S, F15, O0, I3 ); idx++;
-
- nm = nativeMovRegMemPatching_at( cb.insts_begin() );
- nm->print();
- nm->set_offset( low10(0) );
- nm->print();
- nm->add_offset_in_bytes( low10(0xbb) * wordSize );
- nm->print();
-
- while (--idx) {
- nm = nativeMovRegMemPatching_at( nm->next_instruction_address() );
- nm->print();
- for (idx1 = 0; idx1 < ARRAY_SIZE(offsets); idx1++) {
- nm->set_offset( nm->is_immediate() ? low10(offsets[idx1]) : offsets[idx1] );
- assert(nm->offset() == (nm->is_immediate() ? low10(offsets[idx1]) : offsets[idx1]),
- "check unit test");
- nm->print();
- }
- nm->add_offset_in_bytes( low10(0xbb) * wordSize );
- nm->print();
- }
-
- VM_Version::revert();
-#endif // ASSERT
-}
-// End code for unit testing implementation of NativeMovRegMemPatching class
-
//--------------------------------------------------------------------------------
diff --git a/hotspot/src/cpu/sparc/vm/nativeInst_sparc.hpp b/hotspot/src/cpu/sparc/vm/nativeInst_sparc.hpp
index 29273e7fe61..698b448de9a 100644
--- a/hotspot/src/cpu/sparc/vm/nativeInst_sparc.hpp
+++ b/hotspot/src/cpu/sparc/vm/nativeInst_sparc.hpp
@@ -38,7 +38,6 @@
// - - NativeMovConstReg
// - - NativeMovConstRegPatching
// - - NativeMovRegMem
-// - - NativeMovRegMemPatching
// - - NativeJump
// - - NativeGeneralJump
// - - NativeIllegalInstruction
@@ -710,96 +709,6 @@ class NativeMovRegMem: public NativeInstruction {
};
-// An interface for accessing/manipulating native memory ops
-// ld* [reg + offset], reg
-// st* reg, [reg + offset]
-// sethi %hi(imm), reg; nop; add reg, %lo(imm), reg; ld* [reg1 + reg], reg2
-// sethi %hi(imm), reg; nop; add reg, %lo(imm), reg; st* reg2, [reg1 + reg]
-// Ops covered: {lds,ldu,st}{w,b,h}, {ld,st}{d,x}
-//
-// Note that it is identical to NativeMovRegMem with the exception of a nop between the
-// sethi and the add. The nop is required to be in the delay slot of the call instruction
-// which overwrites the sethi during patching.
-class NativeMovRegMemPatching;
-inline NativeMovRegMemPatching* nativeMovRegMemPatching_at (address address);
-class NativeMovRegMemPatching: public NativeInstruction {
- public:
- enum Sparc_specific_constants {
- op3_mask_ld = 1 << Assembler::lduw_op3 |
- 1 << Assembler::ldub_op3 |
- 1 << Assembler::lduh_op3 |
- 1 << Assembler::ldd_op3 |
- 1 << Assembler::ldsw_op3 |
- 1 << Assembler::ldsb_op3 |
- 1 << Assembler::ldsh_op3 |
- 1 << Assembler::ldx_op3,
- op3_mask_st = 1 << Assembler::stw_op3 |
- 1 << Assembler::stb_op3 |
- 1 << Assembler::sth_op3 |
- 1 << Assembler::std_op3 |
- 1 << Assembler::stx_op3,
- op3_ldst_int_limit = Assembler::ldf_op3,
- op3_mask_ldf = 1 << (Assembler::ldf_op3 - op3_ldst_int_limit) |
- 1 << (Assembler::lddf_op3 - op3_ldst_int_limit),
- op3_mask_stf = 1 << (Assembler::stf_op3 - op3_ldst_int_limit) |
- 1 << (Assembler::stdf_op3 - op3_ldst_int_limit),
-
- offset_width = 13,
- sethi_offset = 0,
-#ifdef _LP64
- nop_offset = 7 * BytesPerInstWord,
-#else
- nop_offset = 4,
-#endif
- add_offset = nop_offset + BytesPerInstWord,
- ldst_offset = add_offset + BytesPerInstWord
- };
- bool is_immediate() const {
- // check if instruction is ld* [reg + offset], reg or st* reg, [reg + offset]
- int i0 = long_at(0);
- return (is_op(i0, Assembler::ldst_op));
- }
-
- address instruction_address() const { return addr_at(0); }
- address next_instruction_address() const {
- return addr_at(is_immediate()? 4 : 16);
- }
- int offset() const {
- return is_immediate()? inv_simm(long_at(0), offset_width) :
- nativeMovConstRegPatching_at(addr_at(0))->data();
- }
- void set_offset(int x) {
- if (is_immediate()) {
- guarantee(fits_in_simm(x, offset_width), "data block offset overflow");
- set_long_at(0, set_simm(long_at(0), x, offset_width));
- }
- else
- nativeMovConstRegPatching_at(addr_at(0))->set_data(x);
- }
-
- void add_offset_in_bytes(intptr_t radd_offset) {
- set_offset (offset() + radd_offset);
- }
-
- void copy_instruction_to(address new_instruction_address);
-
- void verify();
- void print ();
-
- // unit test stuff
- static void test();
-
- private:
- friend inline NativeMovRegMemPatching* nativeMovRegMemPatching_at (address address) {
- NativeMovRegMemPatching* test = (NativeMovRegMemPatching*)address;
- #ifdef ASSERT
- test->verify();
- #endif
- return test;
- }
-};
-
-
// An interface for accessing/manipulating native jumps
// jump_to addr
// == sethi %hi22(addr), temp ; jumpl reg, %lo10(addr), G0 ;
diff --git a/hotspot/src/cpu/x86/vm/nativeInst_x86.hpp b/hotspot/src/cpu/x86/vm/nativeInst_x86.hpp
index 470e971fe48..4a4de7116bd 100644
--- a/hotspot/src/cpu/x86/vm/nativeInst_x86.hpp
+++ b/hotspot/src/cpu/x86/vm/nativeInst_x86.hpp
@@ -327,18 +327,6 @@ inline NativeMovRegMem* nativeMovRegMem_at (address address) {
return test;
}
-class NativeMovRegMemPatching: public NativeMovRegMem {
- private:
- friend NativeMovRegMemPatching* nativeMovRegMemPatching_at (address address) {
- NativeMovRegMemPatching* test = (NativeMovRegMemPatching*)(address - instruction_offset);
- #ifdef ASSERT
- test->verify();
- #endif
- return test;
- }
-};
-
-
// An interface for accessing/manipulating native leal instruction of form:
// leal reg, [reg + offset]
From f19a51053260b05f01d52cc3f6ecc4ab04b868d4 Mon Sep 17 00:00:00 2001
From: Igor Ignatyev
Date: Wed, 4 Jun 2014 00:25:21 +0400
Subject: [PATCH 12/76] 8044339: Update FilterSpuriousWakeups documentation.
Review "Solaris only" vm options descriptions
Reviewed-by: kvn, dholmes, iignatyev
---
hotspot/src/os/aix/vm/os_aix.cpp | 6 ++----
hotspot/src/os/bsd/vm/os_bsd.cpp | 6 ++----
hotspot/src/os/linux/vm/os_linux.cpp | 6 ++----
hotspot/src/share/vm/runtime/globals.hpp | 8 ++++----
4 files changed, 10 insertions(+), 16 deletions(-)
diff --git a/hotspot/src/os/aix/vm/os_aix.cpp b/hotspot/src/os/aix/vm/os_aix.cpp
index 377ff89eacb..e9d57c580ce 100644
--- a/hotspot/src/os/aix/vm/os_aix.cpp
+++ b/hotspot/src/os/aix/vm/os_aix.cpp
@@ -4734,10 +4734,8 @@ int os::PlatformEvent::park(jlong millis) {
//
// Thread.interrupt and object.notify{All} both call Event::set.
// That is, we treat thread.interrupt as a special case of notification.
- // The underlying Solaris implementation, cond_timedwait, admits
- // spurious/premature wakeups, but the JLS/JVM spec prevents the
- // JVM from making those visible to Java code. As such, we must
- // filter out spurious wakeups. We assume all ETIME returns are valid.
+ // We ignore spurious OS wakeups unless FilterSpuriousWakeups is false.
+ // We assume all ETIME returns are valid.
//
// TODO: properly differentiate simultaneous notify+interrupt.
// In that case, we should propagate the notify to another waiter.
diff --git a/hotspot/src/os/bsd/vm/os_bsd.cpp b/hotspot/src/os/bsd/vm/os_bsd.cpp
index c8313235d0c..9d817380e3e 100644
--- a/hotspot/src/os/bsd/vm/os_bsd.cpp
+++ b/hotspot/src/os/bsd/vm/os_bsd.cpp
@@ -4299,10 +4299,8 @@ int os::PlatformEvent::park(jlong millis) {
//
// Thread.interrupt and object.notify{All} both call Event::set.
// That is, we treat thread.interrupt as a special case of notification.
- // The underlying Solaris implementation, cond_timedwait, admits
- // spurious/premature wakeups, but the JLS/JVM spec prevents the
- // JVM from making those visible to Java code. As such, we must
- // filter out spurious wakeups. We assume all ETIME returns are valid.
+ // We ignore spurious OS wakeups unless FilterSpuriousWakeups is false.
+ // We assume all ETIME returns are valid.
//
// TODO: properly differentiate simultaneous notify+interrupt.
// In that case, we should propagate the notify to another waiter.
diff --git a/hotspot/src/os/linux/vm/os_linux.cpp b/hotspot/src/os/linux/vm/os_linux.cpp
index 7941edf59ce..89ffc72d972 100644
--- a/hotspot/src/os/linux/vm/os_linux.cpp
+++ b/hotspot/src/os/linux/vm/os_linux.cpp
@@ -5538,10 +5538,8 @@ int os::PlatformEvent::park(jlong millis) {
//
// Thread.interrupt and object.notify{All} both call Event::set.
// That is, we treat thread.interrupt as a special case of notification.
- // The underlying Solaris implementation, cond_timedwait, admits
- // spurious/premature wakeups, but the JLS/JVM spec prevents the
- // JVM from making those visible to Java code. As such, we must
- // filter out spurious wakeups. We assume all ETIME returns are valid.
+ // We ignore spurious OS wakeups unless FilterSpuriousWakeups is false.
+ // We assume all ETIME returns are valid.
//
// TODO: properly differentiate simultaneous notify+interrupt.
// In that case, we should propagate the notify to another waiter.
diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp
index b0a342c1352..ec1c1805cee 100644
--- a/hotspot/src/share/vm/runtime/globals.hpp
+++ b/hotspot/src/share/vm/runtime/globals.hpp
@@ -1097,7 +1097,7 @@ class CommandLineFlags {
"Call loadClassInternal() rather than loadClass()") \
\
product_pd(bool, DontYieldALot, \
- "Throw away obvious excess yield calls (for Solaris only)") \
+ "Throw away obvious excess yield calls") \
\
product_pd(bool, ConvertSleepToYield, \
"Convert sleep(0) to thread yield " \
@@ -1105,7 +1105,7 @@ class CommandLineFlags {
\
product(bool, ConvertYieldToSleep, false, \
"Convert yield to a sleep of MinSleepInterval to simulate Win32 " \
- "behavior (Solaris only)") \
+ "behavior") \
\
product(bool, UseBoundThreads, true, \
"Bind user level threads to kernel threads (for Solaris only)") \
@@ -1143,8 +1143,8 @@ class CommandLineFlags {
"avoid NPTL-FUTEX hang pthread_cond_timedwait") \
\
product(bool, FilterSpuriousWakeups, true, \
- "Prevent spurious or premature wakeups from object.wait " \
- "(Solaris only)") \
+ "When true prevents OS-level spurious, or premature, wakeups " \
+ "from Object.wait (Ignored for Windows)") \
\
product(intx, NativeMonitorTimeout, -1, "(Unstable)") \
\
From baadb75921a034621e145a695bb585a8137f3a5f Mon Sep 17 00:00:00 2001
From: Mikael Vidstedt
Date: Tue, 3 Jun 2014 18:24:38 -0700
Subject: [PATCH 13/76] 8044735: Print format/argument warnings
Reviewed-by: twisti, kvn
---
hotspot/src/cpu/sparc/vm/debug_sparc.cpp | 22 +++++++++++--------
.../src/cpu/sparc/vm/methodHandles_sparc.cpp | 2 +-
hotspot/src/cpu/sparc/vm/sparc.ad | 6 ++---
3 files changed, 17 insertions(+), 13 deletions(-)
diff --git a/hotspot/src/cpu/sparc/vm/debug_sparc.cpp b/hotspot/src/cpu/sparc/vm/debug_sparc.cpp
index 05b8de24361..8be1072fc65 100644
--- a/hotspot/src/cpu/sparc/vm/debug_sparc.cpp
+++ b/hotspot/src/cpu/sparc/vm/debug_sparc.cpp
@@ -42,20 +42,24 @@ void pd_ps(frame f) {
intptr_t *pc = NULL;
intptr_t *next_pc = NULL;
int count = 0;
- tty->print("register window backtrace from %#x:\n", sp);
+ tty->print_cr("register window backtrace from " INTPTR_FORMAT ":", p2i(sp));
while (sp != NULL && ((intptr_t)sp & 7) == 0 && sp > prev_sp && sp < prev_sp+1000) {
pc = next_pc;
next_pc = (intptr_t*) sp[I7->sp_offset_in_saved_window()];
- tty->print("[%d] sp=%#x pc=", count, sp);
+ tty->print("[%d] sp=" INTPTR_FORMAT " pc=", count, p2i(sp));
findpc((intptr_t)pc);
if (WizardMode && Verbose) {
// print register window contents also
- tty->print_cr(" L0..L7: {%#x %#x %#x %#x %#x %#x %#x %#x}",
- sp[0+0],sp[0+1],sp[0+2],sp[0+3],
- sp[0+4],sp[0+5],sp[0+6],sp[0+7]);
- tty->print_cr(" I0..I7: {%#x %#x %#x %#x %#x %#x %#x %#x}",
- sp[8+0],sp[8+1],sp[8+2],sp[8+3],
- sp[8+4],sp[8+5],sp[8+6],sp[8+7]);
+ tty->print_cr(" L0..L7: {"
+ INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " "
+ INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " ",
+ sp[0+0], sp[0+1], sp[0+2], sp[0+3],
+ sp[0+4], sp[0+5], sp[0+6], sp[0+7]);
+ tty->print_cr(" I0..I7: {"
+ INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " "
+ INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " ",
+ sp[8+0], sp[8+1], sp[8+2], sp[8+3],
+ sp[8+4], sp[8+5], sp[8+6], sp[8+7]);
// (and print stack frame contents too??)
CodeBlob *b = CodeCache::find_blob((address) pc);
@@ -74,7 +78,7 @@ void pd_ps(frame f) {
count += 1;
}
if (sp != NULL)
- tty->print("[%d] sp=%#x [bogus sp!]", count, sp);
+ tty->print("[%d] sp=" INTPTR_FORMAT " [bogus sp!]", count, p2i(sp));
}
#endif // PRODUCT
diff --git a/hotspot/src/cpu/sparc/vm/methodHandles_sparc.cpp b/hotspot/src/cpu/sparc/vm/methodHandles_sparc.cpp
index af6d6289644..af2e4e1e96c 100644
--- a/hotspot/src/cpu/sparc/vm/methodHandles_sparc.cpp
+++ b/hotspot/src/cpu/sparc/vm/methodHandles_sparc.cpp
@@ -483,7 +483,7 @@ void trace_method_handle_stub(const char* adaptername,
const char* mh_reg_name = has_mh ? "G3_mh" : "G3";
tty->print_cr("MH %s %s="INTPTR_FORMAT " saved_sp=" INTPTR_FORMAT " args=" INTPTR_FORMAT,
adaptername, mh_reg_name,
- (intptr_t) mh, saved_sp, args);
+ p2i(mh), p2i(saved_sp), p2i(args));
if (Verbose) {
// dumping last frame with frame::describe
diff --git a/hotspot/src/cpu/sparc/vm/sparc.ad b/hotspot/src/cpu/sparc/vm/sparc.ad
index 23026eaabb1..ca1d7137db5 100644
--- a/hotspot/src/cpu/sparc/vm/sparc.ad
+++ b/hotspot/src/cpu/sparc/vm/sparc.ad
@@ -1206,10 +1206,10 @@ void MachPrologNode::format( PhaseRegAlloc *ra_, outputStream *st ) const {
}
if (Assembler::is_simm13(-framesize)) {
- st->print ("SAVE R_SP,-%d,R_SP",framesize);
+ st->print ("SAVE R_SP,-" SIZE_FORMAT ",R_SP",framesize);
} else {
- st->print_cr("SETHI R_SP,hi%%(-%d),R_G3",framesize); st->print("\t");
- st->print_cr("ADD R_G3,lo%%(-%d),R_G3",framesize); st->print("\t");
+ st->print_cr("SETHI R_SP,hi%%(-" SIZE_FORMAT "),R_G3",framesize); st->print("\t");
+ st->print_cr("ADD R_G3,lo%%(-" SIZE_FORMAT "),R_G3",framesize); st->print("\t");
st->print ("SAVE R_SP,R_G3,R_SP");
}
From 09151477274d0d14aa2879087c1e29956c7fd5c1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rickard=20B=C3=A4ckman?=
Date: Wed, 4 Jun 2014 10:01:28 +0200
Subject: [PATCH 14/76] 8031994: java/lang/Character/CheckProp test times out
Reviewed-by: iveresov, roland
---
.../cpu/sparc/vm/c1_LIRGenerator_sparc.cpp | 10 ++++------
.../src/cpu/x86/vm/c1_LIRGenerator_x86.cpp | 9 +++------
hotspot/src/share/vm/c1/c1_GraphBuilder.cpp | 2 +-
hotspot/src/share/vm/c1/c1_Instruction.hpp | 6 ++++--
hotspot/src/share/vm/c1/c1_LIRGenerator.cpp | 20 +++++++++++++++----
hotspot/src/share/vm/c1/c1_LIRGenerator.hpp | 6 ++++--
6 files changed, 32 insertions(+), 21 deletions(-)
diff --git a/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp b/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp
index 4c6f0de0010..e91142ee011 100644
--- a/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp
+++ b/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp
@@ -872,21 +872,19 @@ void LIRGenerator::do_Convert(Convert* x) {
void LIRGenerator::do_NewInstance(NewInstance* x) {
+ print_if_not_loaded(x);
+
// This instruction can be deoptimized in the slow path : use
// O0 as result register.
const LIR_Opr reg = result_register_for(x->type());
-#ifndef PRODUCT
- if (PrintNotLoaded && !x->klass()->is_loaded()) {
- tty->print_cr(" ###class not loaded at new bci %d", x->printable_bci());
- }
-#endif
+
CodeEmitInfo* info = state_for(x, x->state());
LIR_Opr tmp1 = FrameMap::G1_oop_opr;
LIR_Opr tmp2 = FrameMap::G3_oop_opr;
LIR_Opr tmp3 = FrameMap::G4_oop_opr;
LIR_Opr tmp4 = FrameMap::O1_oop_opr;
LIR_Opr klass_reg = FrameMap::G5_metadata_opr;
- new_instance(reg, x->klass(), tmp1, tmp2, tmp3, tmp4, klass_reg, info);
+ new_instance(reg, x->klass(), x->is_unresolved(), tmp1, tmp2, tmp3, tmp4, klass_reg, info);
LIR_Opr result = rlock_result(x);
__ move(reg, result);
}
diff --git a/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp b/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp
index b4e8223e1f5..1ee690ea442 100644
--- a/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp
+++ b/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp
@@ -1085,14 +1085,11 @@ void LIRGenerator::do_Convert(Convert* x) {
void LIRGenerator::do_NewInstance(NewInstance* x) {
-#ifndef PRODUCT
- if (PrintNotLoaded && !x->klass()->is_loaded()) {
- tty->print_cr(" ###class not loaded at new bci %d", x->printable_bci());
- }
-#endif
+ print_if_not_loaded(x);
+
CodeEmitInfo* info = state_for(x, x->state());
LIR_Opr reg = result_register_for(x->type());
- new_instance(reg, x->klass(),
+ new_instance(reg, x->klass(), x->is_unresolved(),
FrameMap::rcx_oop_opr,
FrameMap::rdi_oop_opr,
FrameMap::rsi_oop_opr,
diff --git a/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp
index ac62197debe..cada65e1a94 100644
--- a/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp
+++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp
@@ -2054,7 +2054,7 @@ void GraphBuilder::new_instance(int klass_index) {
bool will_link;
ciKlass* klass = stream()->get_klass(will_link);
assert(klass->is_instance_klass(), "must be an instance klass");
- NewInstance* new_instance = new NewInstance(klass->as_instance_klass(), state_before);
+ NewInstance* new_instance = new NewInstance(klass->as_instance_klass(), state_before, stream()->is_unresolved_klass());
_memory->new_instance(new_instance);
apush(append_split(new_instance));
}
diff --git a/hotspot/src/share/vm/c1/c1_Instruction.hpp b/hotspot/src/share/vm/c1/c1_Instruction.hpp
index 19490bbc97b..3121088c9e6 100644
--- a/hotspot/src/share/vm/c1/c1_Instruction.hpp
+++ b/hotspot/src/share/vm/c1/c1_Instruction.hpp
@@ -1291,16 +1291,18 @@ LEAF(Invoke, StateSplit)
LEAF(NewInstance, StateSplit)
private:
ciInstanceKlass* _klass;
+ bool _is_unresolved;
public:
// creation
- NewInstance(ciInstanceKlass* klass, ValueStack* state_before)
+ NewInstance(ciInstanceKlass* klass, ValueStack* state_before, bool is_unresolved)
: StateSplit(instanceType, state_before)
- , _klass(klass)
+ , _klass(klass), _is_unresolved(is_unresolved)
{}
// accessors
ciInstanceKlass* klass() const { return _klass; }
+ bool is_unresolved() const { return _is_unresolved; }
virtual bool needs_exception_state() const { return false; }
diff --git a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp
index 4e4caaa26cb..bf0b6f2f1ea 100644
--- a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp
+++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp
@@ -466,8 +466,11 @@ CodeEmitInfo* LIRGenerator::state_for(Instruction* x) {
}
-void LIRGenerator::klass2reg_with_patching(LIR_Opr r, ciMetadata* obj, CodeEmitInfo* info) {
- if (!obj->is_loaded() || PatchALot) {
+void LIRGenerator::klass2reg_with_patching(LIR_Opr r, ciMetadata* obj, CodeEmitInfo* info, bool need_resolve) {
+ /* C2 relies on constant pool entries being resolved (ciTypeFlow), so if TieredCompilation
+ * is active and the class hasn't yet been resolved we need to emit a patch that resolves
+ * the class. */
+ if ((TieredCompilation && need_resolve) || !obj->is_loaded() || PatchALot) {
assert(info != NULL, "info must be set if class is not loaded");
__ klass2reg_patch(NULL, r, info);
} else {
@@ -660,9 +663,18 @@ void LIRGenerator::monitor_exit(LIR_Opr object, LIR_Opr lock, LIR_Opr new_hdr, L
__ unlock_object(hdr, object, lock, scratch, slow_path);
}
+#ifndef PRODUCT
+void LIRGenerator::print_if_not_loaded(const NewInstance* new_instance) {
+ if (PrintNotLoaded && !new_instance->klass()->is_loaded()) {
+ tty->print_cr(" ###class not loaded at new bci %d", new_instance->printable_bci());
+ } else if (PrintNotLoaded && (TieredCompilation && new_instance->is_unresolved())) {
+ tty->print_cr(" ###class not resolved at new bci %d", new_instance->printable_bci());
+ }
+}
+#endif
-void LIRGenerator::new_instance(LIR_Opr dst, ciInstanceKlass* klass, LIR_Opr scratch1, LIR_Opr scratch2, LIR_Opr scratch3, LIR_Opr scratch4, LIR_Opr klass_reg, CodeEmitInfo* info) {
- klass2reg_with_patching(klass_reg, klass, info);
+void LIRGenerator::new_instance(LIR_Opr dst, ciInstanceKlass* klass, bool is_unresolved, LIR_Opr scratch1, LIR_Opr scratch2, LIR_Opr scratch3, LIR_Opr scratch4, LIR_Opr klass_reg, CodeEmitInfo* info) {
+ klass2reg_with_patching(klass_reg, klass, info, is_unresolved);
// If klass is not loaded we do not know if the klass has finalizers:
if (UseFastNewInstance && klass->is_loaded()
&& !Klass::layout_helper_needs_slow_path(klass->layout_helper())) {
diff --git a/hotspot/src/share/vm/c1/c1_LIRGenerator.hpp b/hotspot/src/share/vm/c1/c1_LIRGenerator.hpp
index 13446a9ebe9..ba003e5851f 100644
--- a/hotspot/src/share/vm/c1/c1_LIRGenerator.hpp
+++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.hpp
@@ -169,6 +169,8 @@ class LIRGenerator: public InstructionVisitor, public BlockClosure {
return this;
}
+ void print_if_not_loaded(const NewInstance* new_instance) PRODUCT_RETURN;
+
#ifdef ASSERT
LIR_List* lir(const char * file, int line) const {
_lir->set_file_and_line(file, line);
@@ -307,7 +309,7 @@ class LIRGenerator: public InstructionVisitor, public BlockClosure {
void store_stack_parameter (LIR_Opr opr, ByteSize offset_from_sp_in_bytes);
- void klass2reg_with_patching(LIR_Opr r, ciMetadata* obj, CodeEmitInfo* info);
+ void klass2reg_with_patching(LIR_Opr r, ciMetadata* obj, CodeEmitInfo* info, bool need_resolve = false);
// this loads the length and compares against the index
void array_range_check (LIR_Opr array, LIR_Opr index, CodeEmitInfo* null_check_info, CodeEmitInfo* range_check_info);
@@ -325,7 +327,7 @@ class LIRGenerator: public InstructionVisitor, public BlockClosure {
void monitor_enter (LIR_Opr object, LIR_Opr lock, LIR_Opr hdr, LIR_Opr scratch, int monitor_no, CodeEmitInfo* info_for_exception, CodeEmitInfo* info);
void monitor_exit (LIR_Opr object, LIR_Opr lock, LIR_Opr hdr, LIR_Opr scratch, int monitor_no);
- void new_instance (LIR_Opr dst, ciInstanceKlass* klass, LIR_Opr scratch1, LIR_Opr scratch2, LIR_Opr scratch3, LIR_Opr scratch4, LIR_Opr klass_reg, CodeEmitInfo* info);
+ void new_instance (LIR_Opr dst, ciInstanceKlass* klass, bool is_unresolved, LIR_Opr scratch1, LIR_Opr scratch2, LIR_Opr scratch3, LIR_Opr scratch4, LIR_Opr klass_reg, CodeEmitInfo* info);
// machine dependent
void cmp_mem_int(LIR_Condition condition, LIR_Opr base, int disp, int c, CodeEmitInfo* info);
From 8bd4b5624c6ece31d965259aadc290a24d44423a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rickard=20B=C3=A4ckman?=
Date: Thu, 22 May 2014 13:42:44 +0200
Subject: [PATCH 15/76] 8030976: Untaken paths should be more vigorously pruned
at highest optimization level
Reviewed-by: roland, vlivanov
---
hotspot/src/share/vm/oops/methodData.hpp | 2 +-
hotspot/src/share/vm/opto/parse2.cpp | 75 ++-----------------
.../src/share/vm/runtime/deoptimization.cpp | 1 +
.../src/share/vm/runtime/deoptimization.hpp | 6 ++
hotspot/src/share/vm/runtime/vmStructs.cpp | 1 +
5 files changed, 14 insertions(+), 71 deletions(-)
diff --git a/hotspot/src/share/vm/oops/methodData.hpp b/hotspot/src/share/vm/oops/methodData.hpp
index be40bad175d..1c88ac55ffa 100644
--- a/hotspot/src/share/vm/oops/methodData.hpp
+++ b/hotspot/src/share/vm/oops/methodData.hpp
@@ -2053,7 +2053,7 @@ public:
// Whole-method sticky bits and flags
enum {
- _trap_hist_limit = 20, // decoupled from Deoptimization::Reason_LIMIT
+ _trap_hist_limit = 21, // decoupled from Deoptimization::Reason_LIMIT
_trap_hist_mask = max_jubyte,
_extra_data_count = 4 // extra DataLayout headers, for trap history
}; // Public flag values
diff --git a/hotspot/src/share/vm/opto/parse2.cpp b/hotspot/src/share/vm/opto/parse2.cpp
index b1c42244641..15826863ee5 100644
--- a/hotspot/src/share/vm/opto/parse2.cpp
+++ b/hotspot/src/share/vm/opto/parse2.cpp
@@ -897,53 +897,12 @@ bool Parse::seems_never_taken(float prob) {
// if a path is never taken, its controlling comparison is
// already acting in a stable fashion. If the comparison
// seems stable, we will put an expensive uncommon trap
-// on the untaken path. To be conservative, and to allow
-// partially executed counted loops to be compiled fully,
-// we will plant uncommon traps only after pointer comparisons.
+// on the untaken path.
bool Parse::seems_stable_comparison(BoolTest::mask btest, Node* cmp) {
- for (int depth = 4; depth > 0; depth--) {
- // The following switch can find CmpP here over half the time for
- // dynamic language code rich with type tests.
- // Code using counted loops or array manipulations (typical
- // of benchmarks) will have many (>80%) CmpI instructions.
- switch (cmp->Opcode()) {
- case Op_CmpP:
- // A never-taken null check looks like CmpP/BoolTest::eq.
- // These certainly should be closed off as uncommon traps.
- if (btest == BoolTest::eq)
- return true;
- // A never-failed type check looks like CmpP/BoolTest::ne.
- // Let's put traps on those, too, so that we don't have to compile
- // unused paths with indeterminate dynamic type information.
- if (ProfileDynamicTypes)
- return true;
- return false;
-
- case Op_CmpI:
- // A small minority (< 10%) of CmpP are masked as CmpI,
- // as if by boolean conversion ((p == q? 1: 0) != 0).
- // Detect that here, even if it hasn't optimized away yet.
- // Specifically, this covers the 'instanceof' operator.
- if (btest == BoolTest::ne || btest == BoolTest::eq) {
- if (_gvn.type(cmp->in(2))->singleton() &&
- cmp->in(1)->is_Phi()) {
- PhiNode* phi = cmp->in(1)->as_Phi();
- int true_path = phi->is_diamond_phi();
- if (true_path > 0 &&
- _gvn.type(phi->in(1))->singleton() &&
- _gvn.type(phi->in(2))->singleton()) {
- // phi->region->if_proj->ifnode->bool->cmp
- BoolNode* bol = phi->in(0)->in(1)->in(0)->in(1)->as_Bool();
- btest = bol->_test._test;
- cmp = bol->in(1);
- continue;
- }
- }
- }
- return false;
- }
+ if (C->too_many_traps(method(), bci(), Deoptimization::Reason_unstable_if)) {
+ return false;
}
- return false;
+ return true;
}
//-------------------------------repush_if_args--------------------------------
@@ -1182,32 +1141,8 @@ void Parse::adjust_map_after_if(BoolTest::mask btest, Node* c, float prob,
bool is_fallthrough = (path == successor_for_bci(iter().next_bci()));
if (seems_never_taken(prob) && seems_stable_comparison(btest, c)) {
- // If this might possibly turn into an implicit null check,
- // and the null has never yet been seen, we need to generate
- // an uncommon trap, so as to recompile instead of suffering
- // with very slow branches. (We'll get the slow branches if
- // the program ever changes phase and starts seeing nulls here.)
- //
- // We do not inspect for a null constant, since a node may
- // optimize to 'null' later on.
- //
- // Null checks, and other tests which expect inequality,
- // show btest == BoolTest::eq along the non-taken branch.
- // On the other hand, type tests, must-be-null tests,
- // and other tests which expect pointer equality,
- // show btest == BoolTest::ne along the non-taken branch.
- // We prune both types of branches if they look unused.
repush_if_args();
- // We need to mark this branch as taken so that if we recompile we will
- // see that it is possible. In the tiered system the interpreter doesn't
- // do profiling and by the time we get to the lower tier from the interpreter
- // the path may be cold again. Make sure it doesn't look untaken
- if (is_fallthrough) {
- profile_not_taken_branch(!ProfileInterpreter);
- } else {
- profile_taken_branch(iter().get_dest(), !ProfileInterpreter);
- }
- uncommon_trap(Deoptimization::Reason_unreached,
+ uncommon_trap(Deoptimization::Reason_unstable_if,
Deoptimization::Action_reinterpret,
NULL,
(is_fallthrough ? "taken always" : "taken never"));
diff --git a/hotspot/src/share/vm/runtime/deoptimization.cpp b/hotspot/src/share/vm/runtime/deoptimization.cpp
index e4b1292c6b6..b15664f4b52 100644
--- a/hotspot/src/share/vm/runtime/deoptimization.cpp
+++ b/hotspot/src/share/vm/runtime/deoptimization.cpp
@@ -1840,6 +1840,7 @@ const char* Deoptimization::_trap_reason_name[] = {
"speculate_class_check",
"speculate_null_check",
"rtm_state_change",
+ "unstable_if",
"tenured"
};
const char* Deoptimization::_trap_action_name[] = {
diff --git a/hotspot/src/share/vm/runtime/deoptimization.hpp b/hotspot/src/share/vm/runtime/deoptimization.hpp
index 02daabccb98..ee461196bd0 100644
--- a/hotspot/src/share/vm/runtime/deoptimization.hpp
+++ b/hotspot/src/share/vm/runtime/deoptimization.hpp
@@ -62,6 +62,10 @@ class Deoptimization : AllStatic {
Reason_speculate_class_check, // saw unexpected object class from type speculation
Reason_speculate_null_check, // saw unexpected null from type speculation
Reason_rtm_state_change, // rtm state change detected
+ Reason_unstable_if, // a branch predicted always false was taken
+
+ // Reason_tenured is counted separately, add normal counted Reasons above.
+ // Related to MethodData::_trap_hist_limit where Reason_tenured isn't included
Reason_tenured, // age of the code has reached the limit
Reason_LIMIT,
// Note: Keep this enum in sync. with _trap_reason_name.
@@ -319,6 +323,8 @@ class Deoptimization : AllStatic {
return Reason_class_check;
else if (reason == Reason_speculate_null_check)
return Reason_null_check;
+ else if (reason == Reason_unstable_if)
+ return Reason_intrinsic;
else
return Reason_none;
}
diff --git a/hotspot/src/share/vm/runtime/vmStructs.cpp b/hotspot/src/share/vm/runtime/vmStructs.cpp
index 49f0b321011..1ae7ddf6681 100644
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp
@@ -2504,6 +2504,7 @@ typedef TwoOopHashtable SymbolTwoOopHashtable;
declare_constant(Deoptimization::Reason_speculate_class_check) \
declare_constant(Deoptimization::Reason_speculate_null_check) \
declare_constant(Deoptimization::Reason_rtm_state_change) \
+ declare_constant(Deoptimization::Reason_unstable_if) \
declare_constant(Deoptimization::Reason_tenured) \
declare_constant(Deoptimization::Reason_LIMIT) \
declare_constant(Deoptimization::Reason_RECORDED_LIMIT) \
From b18841ffa03fbf519e5e217a35358c59fbdc55db Mon Sep 17 00:00:00 2001
From: Kumar Srinivasan
Date: Thu, 22 May 2014 12:16:53 -0700
Subject: [PATCH 16/76] 8042829: [javadoc] index-file output is not sorted
correctly 8043062: JDK 9 platform and compiler upgrade failed on
Solaris-sparcv9 with Javadoc.gmk:360: recipe for target docs/api/index.html
Reviewed-by: erikj, jjg
---
.../doclets/internal/toolkit/util/Util.java | 167 ++++++++----
.../com/sun/javadoc/lib/JavadocTester.java | 8 +-
.../javadoc/testOrdering/TestOrdering.java | 240 ++++++++++++++++--
.../javadoc/testOrdering/pkg1/UsedClass.java | 70 +----
.../sun/javadoc/testOrdering/pkg1/ZZTop.java | 94 -------
5 files changed, 332 insertions(+), 247 deletions(-)
delete mode 100644 langtools/test/com/sun/javadoc/testOrdering/pkg1/ZZTop.java
diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java
index 44d3275f502..f546229aba4 100644
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java
@@ -31,6 +31,7 @@ import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import java.text.Collator;
import java.util.*;
+
import javax.tools.StandardLocation;
import com.sun.javadoc.*;
@@ -783,9 +784,8 @@ public class Util {
}
/**
- * A general purpose String comparator, which compares two Strings using a Collator
- * strength of "SECONDARY", thus providing optimum case insensitive comparisons in
- * most Locales.
+ * A general purpose case insensitive String comparator, which compares two Strings using a Collator
+ * strength of "TERTIARY".
*
* @param s1 first String to compare.
* @param s2 second String to compare.
@@ -793,14 +793,32 @@ public class Util {
* argument is less than, equal to, or greater than the second.
*/
public static int compareStrings(String s1, String s2) {
+ return compareStrings(true, s1, s2);
+ }
+ /**
+ * A general purpose case sensitive String comparator, which compares two Strings using a Collator
+ * strength of "SECONDARY".
+ *
+ * @param s1 first String to compare.
+ * @param s2 second String to compare.
+ * @return a negative integer, zero, or a positive integer as the first
+ * argument is less than, equal to, or greater than the second.
+ */
+ public static int compareCaseCompare(String s1, String s2) {
+ return compareStrings(false, s1, s2);
+ }
+ private static int compareStrings(boolean caseSensitive, String s1, String s2) {
Collator collator = Collator.getInstance();
- collator.setStrength(Collator.SECONDARY);
+ collator.setStrength(caseSensitive ? Collator.TERTIARY : Collator.SECONDARY);
return collator.compare(s1, s2);
}
-
/**
- * A comparator for index file uses, this sorts first on names, then on
- * parameter types and finally on the fully qualified name.
+ * A comparator for index file uses,
+ * 1. this sorts first on simple names
+ * 2. if equal, case insensitive comparison of Parameter types
+ * 3. if equal, case sensitive comparison of Parameter types
+ * 4. if equal, compare the FQNs of the entities
+ * 5. if equal, then compare the DocKinds ex: Package, Interface etc.
* @return a comparator for index file use
*/
public static Comparator makeComparatorForIndexUse() {
@@ -816,29 +834,35 @@ public class Util {
* argument is less than, equal to, or greater than the second.
*/
public int compare(Doc d1, Doc d2) {
- int result = compareStrings(d1.name(), d2.name());
+ int result = compareNames(d1, d2);
if (result != 0) {
return result;
}
if (d1 instanceof ExecutableMemberDoc && d2 instanceof ExecutableMemberDoc) {
- result = compareExecutableMembers(
- (ExecutableMemberDoc) d1,
- (ExecutableMemberDoc) d2);
+ Parameter[] param1 = ((ExecutableMemberDoc) d1).parameters();
+ Parameter[] param2 = ((ExecutableMemberDoc) d2).parameters();
+ result = compareParameters(false, param1, param2);
if (result != 0) {
return result;
}
+ result = compareParameters(true, param1, param2);
}
- if (d1 instanceof ProgramElementDoc && d2 instanceof ProgramElementDoc) {
- return compareProgramElementDoc((ProgramElementDoc)d1, (ProgramElementDoc)d2);
+ if (result != 0) {
+ return result;
}
- return 0;
+ result = compareFullyQualifiedNames(d1, d2);
+ if (result != 0) {
+ return result;
+ }
+ return compareDocKinds(d1, d2);
}
};
}
/**
* Comparator for ClassUse representations, this sorts on member names,
- * fully qualified member names and then the parameter types if applicable.
+ * fully qualified member names and then the parameter types if applicable,
+ * and finally the Doc kinds ie. package, class, interface etc.
* @return a comparator to sort classes and members for class use
*/
public static Comparator makeComparatorForClassUse() {
@@ -853,46 +877,88 @@ public class Util {
* argument is less than, equal to, or greater than the second.
*/
public int compare(Doc d1, Doc d2) {
- int result = compareStrings(d1.name(), d2.name());
+ int result = compareNames(d1, d2);
if (result != 0) {
return result;
}
- if (d1 instanceof ProgramElementDoc && d2 instanceof ProgramElementDoc) {
- result = compareProgramElementDoc((ProgramElementDoc) d1, (ProgramElementDoc) d2);
+ result = compareFullyQualifiedNames(d1, d2);
+ if (result != 0) {
+ return result;
+ }
+ if (d1 instanceof ExecutableMemberDoc && d2 instanceof ExecutableMemberDoc) {
+ Parameter[] param1 = ((ExecutableMemberDoc) d1).parameters();
+ Parameter[] param2 = ((ExecutableMemberDoc) d2).parameters();
+ result = compareParameters(false, param1, param2);
if (result != 0) {
return result;
}
+ return compareParameters(true, param1, param2);
}
- if (d1 instanceof ExecutableMemberDoc && d2 instanceof ExecutableMemberDoc) {
- return compareExecutableMembers((ExecutableMemberDoc)d1, (ExecutableMemberDoc)d2);
- }
- return 0;
+ return compareDocKinds(d1, d2);
}
};
}
+
/**
* A general purpose comparator to sort Doc entities, basically provides the building blocks
* for creating specific comparators for an use-case.
* @param a Doc entity
*/
static abstract class DocComparator implements Comparator {
+ static enum DocKinds {
+ PACKAGE,
+ FIELD,
+ ENUM,
+ ANNOTATION,
+ INTERFACE,
+ CLASS,
+ CONSTRUCTOR,
+ METHOD
+ };
+ private DocKinds getValue(Doc d) {
+ if (d.isAnnotationType() || d.isAnnotationTypeElement()) {
+ return DocKinds.ANNOTATION;
+ } else if (d.isEnum() || d.isEnumConstant()) {
+ return DocKinds.ENUM;
+ } else if (d.isField()) {
+ return DocKinds.FIELD;
+ } else if (d.isInterface()) {
+ return DocKinds.INTERFACE;
+ } else if (d.isClass()) {
+ return DocKinds.CLASS;
+ } else if (d.isConstructor()) {
+ return DocKinds.CONSTRUCTOR;
+ } else if (d.isMethod()) {
+ return DocKinds.METHOD;
+ } else {
+ return DocKinds.PACKAGE;
+ }
+ }
/**
- * compares two parameter arrays by comparing each Type of the parameter in the array,
- * as possible, if the matched strings are identical, and have mismatched array lengths
- * then compare the lengths.
+ * Compares two Doc entities' kinds, and these are ordered as defined in
+ * the DocKinds enumeration.
+ * @param d1 the first Doc object
+ * @param d2 the second Doc object
+ * @return a negative integer, zero, or a positive integer as the first
+ * argument is less than, equal to, or greater than the second.
+ */
+ protected int compareDocKinds(Doc d1, Doc d2) {
+ return getValue(d1).compareTo(getValue(d2));
+ }
+ /**
+ * Compares two parameter arrays by comparing each Type of the parameter in the array,
+ * and as many as possible, otherwise compare their lengths.
+ * @param ignoreCase specifies case sensitive or insensitive comparison.
* @param params1 the first parameter array.
* @param params2 the first parameter array.
* @return a negative integer, zero, or a positive integer as the first
* argument is less than, equal to, or greater than the second.
*/
- protected int compareParameters(Parameter[] params1, Parameter[] params2) {
- if (params1.length == 0 && params2.length == 0) {
- return 0;
- }
+ protected int compareParameters(boolean ignoreCase, Parameter[] params1, Parameter[] params2) {
// try to compare as many as possible
for (int i = 0; i < params1.length && i < params2.length; i++) {
- int result = compareStrings(params1[i].typeName(), params2[i].typeName());
+ int result = compareStrings(ignoreCase, params1[i].typeName(), params2[i].typeName());
if (result != 0) {
return result;
}
@@ -901,41 +967,32 @@ public class Util {
}
/**
- * Compares two MemberDocs, typically the name of a method,
- * field or constructor.
- * @param e1 the first MemberDoc.
- * @param e2 the second MemberDoc.
+ * Compares two Doc entities typically the simple name of a method,
+ * field, constructor etc.
+ * @param d1 the first Doc.
+ * @param d2 the second Doc.
* @return a negative integer, zero, or a positive integer as the first
* argument is less than, equal to, or greater than the second.
*/
- protected int compareMembers(MemberDoc e1, MemberDoc e2) {
- return compareStrings(e1.name(), e2.name());
- }
-
- /**
- * Compares two ExecutableMemberDocs such as methods and constructors,
- * as well as the parameters the entity might take.
- * @param m1 the first ExecutableMemberDoc.
- * @param m2 the second ExecutableMemberDoc.
- * @return a negative integer, zero, or a positive integer as the first
- * argument is less than, equal to, or greater than the second.
- */
- protected int compareExecutableMembers(ExecutableMemberDoc m1, ExecutableMemberDoc m2) {
- int result = compareMembers(m1, m2);
- if (result == 0)
- result = compareParameters(m1.parameters(), m2.parameters());
- return result;
+ protected int compareNames(Doc d1, Doc d2) {
+ return compareStrings(d1.name(), d2.name());
}
/**
* Compares the fully qualified names of the entities
- * @param p1 the first ProgramElementDoc.
- * @param p2 the first ProgramElementDoc.
+ * @param d1 the first entity
+ * @param d2 the second entity
* @return a negative integer, zero, or a positive integer as the first
* argument is less than, equal to, or greater than the second.
*/
- protected int compareProgramElementDoc(ProgramElementDoc p1, ProgramElementDoc p2) {
- return compareStrings(p1.qualifiedName(), p2.qualifiedName());
+ protected int compareFullyQualifiedNames(Doc d1, Doc d2) {
+ String name1 = (d1 instanceof ProgramElementDoc)
+ ? ((ProgramElementDoc)d1).qualifiedName()
+ : d1.name();
+ String name2 = (d2 instanceof ProgramElementDoc)
+ ? ((ProgramElementDoc)d2).qualifiedName()
+ : d2.name();
+ return compareStrings(name1, name2);
}
}
}
diff --git a/langtools/test/com/sun/javadoc/lib/JavadocTester.java b/langtools/test/com/sun/javadoc/lib/JavadocTester.java
index 3fd1bdcc1a8..aa12176b327 100644
--- a/langtools/test/com/sun/javadoc/lib/JavadocTester.java
+++ b/langtools/test/com/sun/javadoc/lib/JavadocTester.java
@@ -451,8 +451,12 @@ public abstract class JavadocTester {
for (String s : strings) {
int currentIndex = fileString.indexOf(s);
checking(s + " at index " + currentIndex);
- if (currentIndex >= prevIndex) {
- passed(s + "is in the correct order");
+ if (currentIndex == -1) {
+ failed(s + " not found.");
+ continue;
+ }
+ if (currentIndex > prevIndex) {
+ passed(s + " is in the correct order");
} else {
failed(s + " is in the wrong order.");
}
diff --git a/langtools/test/com/sun/javadoc/testOrdering/TestOrdering.java b/langtools/test/com/sun/javadoc/testOrdering/TestOrdering.java
index 29286329ac2..98cc674525b 100644
--- a/langtools/test/com/sun/javadoc/testOrdering/TestOrdering.java
+++ b/langtools/test/com/sun/javadoc/testOrdering/TestOrdering.java
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8039410 8042601
+ * @bug 8039410 8042601 8042829
* @summary test to determine if members are ordered correctly
* @author ksrini
* @library ../lib/
@@ -31,6 +31,16 @@
* @run main TestOrdering
*/
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import static java.nio.file.StandardOpenOption.*;
+
public class TestOrdering extends JavadocTester {
public static void main(String[] args) throws Exception {
@@ -39,7 +49,7 @@ public class TestOrdering extends JavadocTester {
}
@Test
- void testUnnamedPackages() {
+ void testUnnamedPackagesForClassUse() {
javadoc("-d", "out",
"-sourcepath", testSrc,
"-use",
@@ -49,16 +59,94 @@ public class TestOrdering extends JavadocTester {
}
@Test
- void testNamedPackages() {
+ void testNamedPackagesForClassUse() {
javadoc("-d", "out-1",
"-sourcepath", testSrc,
"-use",
"pkg1");
checkExit(Exit.OK);
checkClassUseOrdering("pkg1/class-use/UsedClass.html");
- checkIndexPathOrdering("index-all.html");
}
+ enum ListOrder { NONE, REVERSE, SHUFFLE };
+ /*
+ * By default we do not shuffle the input list, in order to keep the list deterministic,
+ * and the test predictable. However, we can turn on the stress mode, by setting the following
+ * property if required.
+ */
+ static final ListOrder STRESS_MODE = Boolean.getBoolean("TestOrder.STRESS")
+ ? ListOrder.SHUFFLE
+ : ListOrder.REVERSE;
+
+ /*
+ * Controls the number of sibling packages, pkg0, pkg1, pkg2, .....
+ */
+ static final int MAX_PACKAGES = 4;
+
+ /*
+ * Controls the number of children packages, pkg0, pkg0.pkg, pkg0.pkg.pkg, .....
+ * Note: having too long a depth (> 256 chars on Windows), will likely lead to
+ * cause problems with automated build and test systems.
+ */
+ static final int MAX_SUBPACKAGES_DEPTH = 4;
+ @Test
+ void testIndexOrdering() throws IOException {
+ final String clsname = "Add";
+ List cmdArgs = new ArrayList();
+ cmdArgs.add("-d");
+ cmdArgs.add("out-2");
+ cmdArgs.add("-sourcepath");
+ cmdArgs.add("src");
+ cmdArgs.add("-package");
+ System.out.println("STRESS_MODE: " + STRESS_MODE);
+ emitFile(null, clsname, STRESS_MODE);
+ for (int width = 0 ; width < MAX_PACKAGES ; width++) {
+ String wpkgname = "add" + width;
+ String dpkgname = wpkgname;
+ emitFile(wpkgname, clsname, ListOrder.NONE); // list as-is
+ cmdArgs.add(wpkgname);
+ for (int depth = 1 ; depth < MAX_SUBPACKAGES_DEPTH ; depth++) {
+ dpkgname = dpkgname + ".add";
+ emitFile(dpkgname, clsname, STRESS_MODE);
+ cmdArgs.add(dpkgname);
+ }
+ }
+ File srcDir = new File(new File("."), "src");
+ cmdArgs.add(new File(srcDir, clsname + ".java").getPath());
+ javadoc(cmdArgs.toArray(new String[cmdArgs.size()]));
+ checkExit(Exit.OK);
+ checkOrder("index-all.html", composeTestVectors());
+ }
+ String[] composeTestVectors() {
+ List testList = new ArrayList<>();
+
+ for (String x : expectedMethodOrdering) {
+ testList.add(x);
+ for (int i = 0; i < MAX_PACKAGES; i++) {
+ String wpkg = "add" + i;
+ testList.add(wpkg + "/" + x);
+ String dpkg = wpkg;
+ for (int j = 1; j < MAX_SUBPACKAGES_DEPTH; j++) {
+ dpkg = dpkg + "/" + "add";
+ testList.add(dpkg + "/" + x);
+ }
+ }
+ }
+ for (String x : expectedEnumOrdering) {
+ testList.add(x.replace("REPLACE_ME", "<Unnamed>"));
+ for (int i = 0; i < MAX_PACKAGES; i++) {
+ String wpkg = "add" + i;
+ testList.add(wpkg + "/" + x.replace("REPLACE_ME", wpkg));
+ String dpkg = wpkg;
+ for (int j = 1; j < MAX_SUBPACKAGES_DEPTH; j++) {
+ dpkg = dpkg + "/" + "add";
+ testList.add(dpkg + "/" + x.replace("REPLACE_ME", pathToPackage(dpkg)));
+ }
+ }
+ }
+ testList.addAll(Arrays.asList(expectedFieldOrdering));
+ return testList.toArray(new String[testList.size()]);
+ }
void checkExecutableMemberOrdering(String usePage) {
String contents = readFile(usePage);
// check constructors
@@ -109,29 +197,125 @@ public class TestOrdering extends JavadocTester {
}
}
- void checkIndexPathOrdering(String indexPage) {
- checkOrder(indexPage,
- "pkg1/UsedClass.html#add--",
- "pkg1/ZZTop.html#add--",
- "pkg1/UsedClass.html#add-double-",
- "pkg1/UsedClass.html#add-java.lang.Double-",
- "pkg1/ZZTop.html#add-double-",
- "pkg1/ZZTop.html#add-java.lang.Double-",
- "pkg1/UsedClass.html#add-double-byte-",
- "pkg1/ZZTop.html#add-double-byte-",
- "pkg1/UsedClass.html#add-double-double-",
- "pkg1/UsedClass.html#add-double-java.lang.Double-",
- "pkg1/ZZTop.html#add-double-double-",
- "pkg1/ZZTop.html#add-double-java.lang.Double-",
- "pkg1/UsedClass.html#add-float-",
- "pkg1/ZZTop.html#add-float-",
- "pkg1/UsedClass.html#add-float-int-",
- "pkg1/ZZTop.html#add-float-int-",
- "pkg1/UsedClass.html#add-int-",
- "pkg1/ZZTop.html#add-int-",
- "pkg1/UsedClass.html#add-int-float-",
- "pkg1/ZZTop.html#add-int-float-",
- "pkg1/UsedClass.html#add-java.lang.Integer-",
- "pkg1/ZZTop.html#add-java.lang.Integer-");
+ static String[] contents = {
+ "public add ADDADD;",
+ "public add AddAdd;",
+ "public add addadd;",
+ "public enum add {add, ADD, addd, ADDD};",
+ "public enum ADD {ADD, add, addd, ADDD};",
+ "public void add(){}",
+ "public void add(double d){}",
+ "public void add(int i, float f){}",
+ "public void add(float f, int i){}",
+ "public void add(double d, byte b){}",
+ "public Double add(Double d) {return (double) 22/7;}",
+ "public double add(double d1, double d2) {return d1 + d2;}",
+ "public double add(double d1, Double d2) {return d1 + d2;}",
+ "public Float add(float f) {return (float) 22/7;}",
+ "public void add(int i){}",
+ "public int add(Integer i) {return 0;}"
+ };
+
+ void emitFile(String pkgname, String clsname, ListOrder order) throws IOException {
+ File srcDir = new File("src");
+ File outDir = pkgname == null
+ ? srcDir
+ : new File(srcDir, pkgname.replace(".", File.separator));
+ File outFile = new File(outDir, clsname + ".java");
+ outDir.mkdirs();
+ List scratch = new ArrayList<>(Arrays.asList(contents));
+ switch (order) {
+ case SHUFFLE:
+ Collections.shuffle(scratch);
+ break;
+ case REVERSE:
+ Collections.reverse(scratch);
+ break;
+ default:
+ // leave list as-is
+ }
+ // insert the header
+ scratch.add(0, "public class " + clsname + " {");
+ if (pkgname != null) {
+ scratch.add(0, "package " + pkgname + ";");
+ }
+ // append the footer
+ scratch.add("}");
+ Files.write(outFile.toPath(), scratch, CREATE, TRUNCATE_EXISTING);
}
+
+ String pathToPackage(String in) {
+ return in.replace("/", ".");
+ }
+
+ final String expectedMethodOrdering[] = {
+ "Add.html#add--",
+ "Add.html#add-double-",
+ "Add.html#add-java.lang.Double-",
+ "Add.html#add-double-byte-",
+ "Add.html#add-double-double-",
+ "Add.html#add-double-java.lang.Double-",
+ "Add.html#add-float-",
+ "Add.html#add-float-int-",
+ "Add.html#add-int-",
+ "Add.html#add-int-float-",
+ "Add.html#add-java.lang.Integer-"
+ };
+ final String expectedEnumOrdering[] = {
+ "Add.add.html\" title=\"enum in REPLACE_ME\"",
+ "Add.ADD.html\" title=\"enum in REPLACE_ME\""
+ };
+ final String expectedFieldOrdering[] = {
+ "Add.html#addadd\"",
+ "add0/add/add/add/Add.html#addadd\"",
+ "add0/add/add/Add.html#addadd\"",
+ "add0/add/Add.html#addadd\"",
+ "add0/Add.html#addadd\"",
+ "add1/add/add/add/Add.html#addadd\"",
+ "add1/add/add/Add.html#addadd\"",
+ "add1/add/Add.html#addadd\"",
+ "add1/Add.html#addadd\"",
+ "add2/add/add/add/Add.html#addadd\"",
+ "add2/add/add/Add.html#addadd\"",
+ "add2/add/Add.html#addadd\"",
+ "add2/Add.html#addadd\"",
+ "add3/add/add/add/Add.html#addadd\"",
+ "add3/add/add/Add.html#addadd\"",
+ "add3/add/Add.html#addadd\"",
+ "add3/Add.html#addadd\"",
+ "Add.html#AddAdd\"",
+ "add0/add/add/add/Add.html#AddAdd\"",
+ "add0/add/add/Add.html#AddAdd\"",
+ "add0/add/Add.html#AddAdd\"",
+ "add0/Add.html#AddAdd\"",
+ "add1/add/add/add/Add.html#AddAdd\"",
+ "add1/add/add/Add.html#AddAdd\"",
+ "add1/add/Add.html#AddAdd\"",
+ "add1/Add.html#AddAdd\"",
+ "add2/add/add/add/Add.html#AddAdd\"",
+ "add2/add/add/Add.html#AddAdd\"",
+ "add2/add/Add.html#AddAdd\"",
+ "add2/Add.html#AddAdd\"",
+ "add3/add/add/add/Add.html#AddAdd\"",
+ "add3/add/add/Add.html#AddAdd\"",
+ "add3/add/Add.html#AddAdd\"",
+ "add3/Add.html#AddAdd\"",
+ "Add.html#ADDADD\"",
+ "add0/add/add/add/Add.html#ADDADD\"",
+ "add0/add/add/Add.html#ADDADD\"",
+ "add0/add/Add.html#ADDADD\"",
+ "add0/Add.html#ADDADD\"",
+ "add1/add/add/add/Add.html#ADDADD\"",
+ "add1/add/add/Add.html#ADDADD\"",
+ "add1/add/Add.html#ADDADD\"",
+ "add1/Add.html#ADDADD\"",
+ "add2/add/add/add/Add.html#ADDADD\"",
+ "add2/add/add/Add.html#ADDADD\"",
+ "add2/add/Add.html#ADDADD\"",
+ "add2/Add.html#ADDADD\"",
+ "add3/add/add/add/Add.html#ADDADD\"",
+ "add3/add/add/Add.html#ADDADD\"",
+ "add3/add/Add.html#ADDADD\"",
+ "add3/Add.html#ADDADD\""
+ };
}
diff --git a/langtools/test/com/sun/javadoc/testOrdering/pkg1/UsedClass.java b/langtools/test/com/sun/javadoc/testOrdering/pkg1/UsedClass.java
index 020dd7bb031..ed35353e9fd 100644
--- a/langtools/test/com/sun/javadoc/testOrdering/pkg1/UsedClass.java
+++ b/langtools/test/com/sun/javadoc/testOrdering/pkg1/UsedClass.java
@@ -23,72 +23,6 @@
package pkg1;
/**
- * For index and class-use testing
+ * For class-use testing
*/
-public class UsedClass {
-
- /**
- * just an empty param method.
- */
- public void add(){}
-
- /**
- * @param d param
- */
- public void add(double d){}
-
- /**
- * @param i param
- * @param f param
- */
- public void add(int i, float f){}
-
- /**
- * @param f param
- * @param i param
- */
- public void add(float f, int i){}
-
- /**
- * @param d param
- * @param b param
- */
- public void add(double d, byte b){}
-
- /**
- * @param d param
- * @return Double
- */
- public Double add(Double d) {return (double) 22/7;}
-
- /**
- * @param d1 param
- * @param d2 param
- * @return double
- */
- public double add(double d1, double d2) {return d1 + d2;}
-
- /**
- * @param d1 param
- * @param d2 param
- * @return double
- */
- public double add(double d1, Double d2) {return d1 + d2;}
-
- /**
- * @param f param
- * @return Float
- */
- public Float add(float f) {return (float) 22/7;}
-
- /**
- * @param i param
- */
- public void add(int i){}
-
- /**
- * @param i param
- * @return double
- */
- public int add(Integer i) {return 0;}
-}
+public class UsedClass {}
diff --git a/langtools/test/com/sun/javadoc/testOrdering/pkg1/ZZTop.java b/langtools/test/com/sun/javadoc/testOrdering/pkg1/ZZTop.java
deleted file mode 100644
index 6ad1cb4aa84..00000000000
--- a/langtools/test/com/sun/javadoc/testOrdering/pkg1/ZZTop.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package pkg1;
-/**
- * For index testing only
- */
-public class ZZTop {
-
- /**
- * just an empty param method.
- */
- public void add(){}
-
- /**
- * @param d param
- */
- public void add(double d){}
-
- /**
- * @param i param
- * @param f param
- */
- public void add(int i, float f){}
-
- /**
- * @param f param
- * @param i param
- */
- public void add(float f, int i){}
-
- /**
- * @param d param
- * @param b param
- */
- public void add(double d, byte b){}
-
- /**
- * @param d param
- * @return Double
- */
- public Double add(Double d) {return (double) 22/7;}
-
- /**
- * @param d1 param
- * @param d2 param
- * @return double
- */
- public double add(double d1, double d2) {return d1 + d2;}
-
- /**
- * @param d1 param
- * @param d2 param
- * @return double
- */
- public double add(double d1, Double d2) {return d1 + d2;}
-
- /**
- * @param f param
- * @return Float
- */
- public Float add(float f) {return (float) 22/7;}
-
- /**
- * @param i param
- */
- public void add(int i){}
-
- /**
- * @param i param
- * @return double
- */
- public int add(Integer i) {return 0;}
-}
From aeff8925b30d0532ee50b19e42b3ebc0c8ac4f68 Mon Sep 17 00:00:00 2001
From: Tobias Hartmann
Date: Thu, 5 Jun 2014 10:43:16 +0200
Subject: [PATCH 17/76] 8031389: On x86 C1 emits two relocations for polls
C1 emits two poll_type relocations at safepoint polls because LIR_Assembler::safepoint_poll(..) adds a relocation and calls LIR_Assembler::add_debug_info_for_branch(..) which adds a relocation as well. The implementation of add_debug_info_for_branch(..) is changed to not emit a poll relocation.
Reviewed-by: kvn, roland
---
hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp | 5 +----
hotspot/src/share/vm/c1/c1_LIRAssembler.cpp | 1 -
2 files changed, 1 insertion(+), 5 deletions(-)
diff --git a/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp b/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp
index 813cbf0fa03..0c733a7b1b9 100644
--- a/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp
+++ b/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp
@@ -1612,13 +1612,10 @@ int LIR_Assembler::safepoint_poll(LIR_Opr tmp, CodeEmitInfo* info) {
__ set((intptr_t)os::get_polling_page(), tmp->as_register());
if (info != NULL) {
add_debug_info_for_branch(info);
- } else {
- __ relocate(relocInfo::poll_type);
}
-
int offset = __ offset();
+ __ relocate(relocInfo::poll_type);
__ ld_ptr(tmp->as_register(), 0, G0);
-
return offset;
}
diff --git a/hotspot/src/share/vm/c1/c1_LIRAssembler.cpp b/hotspot/src/share/vm/c1/c1_LIRAssembler.cpp
index ef2b10623a4..5697e9046aa 100644
--- a/hotspot/src/share/vm/c1/c1_LIRAssembler.cpp
+++ b/hotspot/src/share/vm/c1/c1_LIRAssembler.cpp
@@ -336,7 +336,6 @@ void LIR_Assembler::check_no_unbound_labels() {
void LIR_Assembler::add_debug_info_for_branch(CodeEmitInfo* info) {
- _masm->code_section()->relocate(pc(), relocInfo::poll_type);
int pc_offset = code_offset();
flush_debug_info(pc_offset);
info->record_debug_info(compilation()->debug_info_recorder(), pc_offset);
From cdd2105184ddc9df5d19605729ef7728f773a5e9 Mon Sep 17 00:00:00 2001
From: Nils Eliasson
Date: Mon, 9 Jun 2014 10:32:49 +0200
Subject: [PATCH 18/76] 8040244: compiler/whitebox/IsMethodCompilableTest.java
fails
Prevent from running with Xcomp
Reviewed-by: kvn, twisti
---
hotspot/test/compiler/whitebox/IsMethodCompilableTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hotspot/test/compiler/whitebox/IsMethodCompilableTest.java b/hotspot/test/compiler/whitebox/IsMethodCompilableTest.java
index 88e5cd835e4..acede605a4f 100644
--- a/hotspot/test/compiler/whitebox/IsMethodCompilableTest.java
+++ b/hotspot/test/compiler/whitebox/IsMethodCompilableTest.java
@@ -28,7 +28,7 @@
* @build IsMethodCompilableTest
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* @run main ClassFileInstaller com.oracle.java.testlibrary.Platform
- * @run main/othervm/timeout=2400 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:PerMethodRecompilationCutoff=3 -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* IsMethodCompilableTest
+ * @run main/othervm/timeout=2400 -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:PerMethodRecompilationCutoff=3 -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* IsMethodCompilableTest
* @summary testing of WB::isMethodCompilable()
* @author igor.ignatyev@oracle.com
*/
From 075ea2546214161898cca9bee6ca8939ecdf4c88 Mon Sep 17 00:00:00 2001
From: Vladimir Ivanov
Date: Mon, 9 Jun 2014 11:49:02 +0000
Subject: [PATCH 19/76] 8046226: assert(_thread == Thread::current()) failed:
thread must be current w/ -XX:+TraceDeoptimization -XX:+Verbose
Reviewed-by: twisti, dcubed, fparain
---
hotspot/src/share/vm/runtime/vframe.cpp | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/hotspot/src/share/vm/runtime/vframe.cpp b/hotspot/src/share/vm/runtime/vframe.cpp
index a32d03a7b21..79da635c443 100644
--- a/hotspot/src/share/vm/runtime/vframe.cpp
+++ b/hotspot/src/share/vm/runtime/vframe.cpp
@@ -274,7 +274,8 @@ StackValueCollection* interpretedVFrame::locals() const {
// Get oopmap describing oops and int for current bci
InterpreterOopMap oop_mask;
if (TraceDeoptimization && Verbose) {
- methodHandle m_h(thread(), method());
+ // need the current JavaThread and not thread()
+ methodHandle m_h(Thread::current(), method());
OopMapCache::compute_one_oop_map(m_h, bci(), &oop_mask);
} else {
method()->mask_for(bci(), &oop_mask);
@@ -335,7 +336,8 @@ StackValueCollection* interpretedVFrame::expressions() const {
if (!method()->is_native()) {
// Get oopmap describing oops and int for current bci
if (TraceDeoptimization && Verbose) {
- methodHandle m_h(method());
+ // need the current JavaThread and not thread()
+ methodHandle m_h(Thread::current(), method());
OopMapCache::compute_one_oop_map(m_h, bci(), &oop_mask);
} else {
method()->mask_for(bci(), &oop_mask);
From 0853423f46c43d5a2cd8ccfab6223287a693d5cb Mon Sep 17 00:00:00 2001
From: Vladimir Kozlov
Date: Mon, 9 Jun 2014 15:42:31 -0700
Subject: [PATCH 20/76] 8046275: Fastdebug build failing on jdk9/hs/ control
jobs after pulling some hs-comp changes
Add missing check for Opaque nodes from loop predicates in clone_loop().
Reviewed-by: iveresov
---
hotspot/src/share/vm/opto/loopopts.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/hotspot/src/share/vm/opto/loopopts.cpp b/hotspot/src/share/vm/opto/loopopts.cpp
index 7b722674391..93519a7cdb1 100644
--- a/hotspot/src/share/vm/opto/loopopts.cpp
+++ b/hotspot/src/share/vm/opto/loopopts.cpp
@@ -1403,7 +1403,8 @@ void PhaseIdealLoop::clone_loop( IdealLoopTree *loop, Node_List &old_new, int dd
// loop. Happens if people set a loop-exit flag; then test the flag
// in the loop to break the loop, then test is again outside of the
// loop to determine which way the loop exited.
- if( use->is_If() || use->is_CMove() ) {
+ // Loop predicate If node connects to Bool node through Opaque1 node.
+ if (use->is_If() || use->is_CMove() || C->is_predicate_opaq(use)) {
// Since this code is highly unlikely, we lazily build the worklist
// of such Nodes to go split.
if( !split_if_set )
From 5067eae483f87b683c1ca88b98324e171b6788e6 Mon Sep 17 00:00:00 2001
From: Tobias Hartmann
Date: Tue, 10 Jun 2014 08:53:22 +0200
Subject: [PATCH 21/76] 8033145: Runtime1::arraycopy_count_address uses wrong
_oop_arraycopy_cnt variable
The method Runtime1::arraycopy_count_address(..) returns the address of Runtime::_oop_arraycopy_cnt instead of the the file static variable _oop_arraycopy_cnt.
Reviewed-by: roland, kvn, twisti
---
hotspot/src/share/vm/c1/c1_Runtime1.cpp | 30 ++++++++++++-------------
1 file changed, 15 insertions(+), 15 deletions(-)
diff --git a/hotspot/src/share/vm/c1/c1_Runtime1.cpp b/hotspot/src/share/vm/c1/c1_Runtime1.cpp
index 1bafb67f69c..3c2e2ecf8fe 100644
--- a/hotspot/src/share/vm/c1/c1_Runtime1.cpp
+++ b/hotspot/src/share/vm/c1/c1_Runtime1.cpp
@@ -123,24 +123,24 @@ int Runtime1::_throw_incompatible_class_change_error_count = 0;
int Runtime1::_throw_array_store_exception_count = 0;
int Runtime1::_throw_count = 0;
-static int _byte_arraycopy_cnt = 0;
-static int _short_arraycopy_cnt = 0;
-static int _int_arraycopy_cnt = 0;
-static int _long_arraycopy_cnt = 0;
-static int _oop_arraycopy_cnt = 0;
+static int _byte_arraycopy_stub_cnt = 0;
+static int _short_arraycopy_stub_cnt = 0;
+static int _int_arraycopy_stub_cnt = 0;
+static int _long_arraycopy_stub_cnt = 0;
+static int _oop_arraycopy_stub_cnt = 0;
address Runtime1::arraycopy_count_address(BasicType type) {
switch (type) {
case T_BOOLEAN:
- case T_BYTE: return (address)&_byte_arraycopy_cnt;
+ case T_BYTE: return (address)&_byte_arraycopy_stub_cnt;
case T_CHAR:
- case T_SHORT: return (address)&_short_arraycopy_cnt;
+ case T_SHORT: return (address)&_short_arraycopy_stub_cnt;
case T_FLOAT:
- case T_INT: return (address)&_int_arraycopy_cnt;
+ case T_INT: return (address)&_int_arraycopy_stub_cnt;
case T_DOUBLE:
- case T_LONG: return (address)&_long_arraycopy_cnt;
+ case T_LONG: return (address)&_long_arraycopy_stub_cnt;
case T_ARRAY:
- case T_OBJECT: return (address)&_oop_arraycopy_cnt;
+ case T_OBJECT: return (address)&_oop_arraycopy_stub_cnt;
default:
ShouldNotReachHere();
return NULL;
@@ -1479,13 +1479,13 @@ void Runtime1::print_statistics() {
tty->print_cr(" _ic_miss_cnt: %d", SharedRuntime::_ic_miss_ctr);
tty->print_cr(" _generic_arraycopy_cnt: %d", _generic_arraycopy_cnt);
tty->print_cr(" _generic_arraycopystub_cnt: %d", _generic_arraycopystub_cnt);
- tty->print_cr(" _byte_arraycopy_cnt: %d", _byte_arraycopy_cnt);
- tty->print_cr(" _short_arraycopy_cnt: %d", _short_arraycopy_cnt);
- tty->print_cr(" _int_arraycopy_cnt: %d", _int_arraycopy_cnt);
- tty->print_cr(" _long_arraycopy_cnt: %d", _long_arraycopy_cnt);
+ tty->print_cr(" _byte_arraycopy_cnt: %d", _byte_arraycopy_stub_cnt);
+ tty->print_cr(" _short_arraycopy_cnt: %d", _short_arraycopy_stub_cnt);
+ tty->print_cr(" _int_arraycopy_cnt: %d", _int_arraycopy_stub_cnt);
+ tty->print_cr(" _long_arraycopy_cnt: %d", _long_arraycopy_stub_cnt);
tty->print_cr(" _primitive_arraycopy_cnt: %d", _primitive_arraycopy_cnt);
tty->print_cr(" _oop_arraycopy_cnt (C): %d", Runtime1::_oop_arraycopy_cnt);
- tty->print_cr(" _oop_arraycopy_cnt (stub): %d", _oop_arraycopy_cnt);
+ tty->print_cr(" _oop_arraycopy_cnt (stub): %d", _oop_arraycopy_stub_cnt);
tty->print_cr(" _arraycopy_slowcase_cnt: %d", _arraycopy_slowcase_cnt);
tty->print_cr(" _arraycopy_checkcast_cnt: %d", _arraycopy_checkcast_cnt);
tty->print_cr(" _arraycopy_checkcast_attempt_cnt:%d", _arraycopy_checkcast_attempt_cnt);
From ea0470002e3f1ba7bc06fadb4b70fcf421d10ba6 Mon Sep 17 00:00:00 2001
From: Vladimir Ivanov
Date: Tue, 10 Jun 2014 10:00:59 +0000
Subject: [PATCH 22/76] 8033626:
assert(ex_map->jvms()->same_calls_as(_exceptions->jvms())) failed: all
collected exceptions must come from the same place
Reviewed-by: kvn, roland
---
hotspot/src/share/vm/opto/graphKit.cpp | 34 +++++---
hotspot/src/share/vm/opto/graphKit.hpp | 11 ++-
hotspot/src/share/vm/opto/library_call.cpp | 5 +-
.../intrinsics/clone/TestObjectClone.java | 80 +++++++++++++++++++
4 files changed, 113 insertions(+), 17 deletions(-)
create mode 100644 hotspot/test/compiler/intrinsics/clone/TestObjectClone.java
diff --git a/hotspot/src/share/vm/opto/graphKit.cpp b/hotspot/src/share/vm/opto/graphKit.cpp
index 9e07ebf8949..5a5b7da97e1 100644
--- a/hotspot/src/share/vm/opto/graphKit.cpp
+++ b/hotspot/src/share/vm/opto/graphKit.cpp
@@ -2513,7 +2513,7 @@ void GraphKit::merge_memory(Node* new_mem, Node* region, int new_path) {
//------------------------------make_slow_call_ex------------------------------
// Make the exception handler hookups for the slow call
-void GraphKit::make_slow_call_ex(Node* call, ciInstanceKlass* ex_klass, bool separate_io_proj) {
+void GraphKit::make_slow_call_ex(Node* call, ciInstanceKlass* ex_klass, bool separate_io_proj, bool deoptimize) {
if (stopped()) return;
// Make a catch node with just two handlers: fall-through and catch-all
@@ -2527,11 +2527,17 @@ void GraphKit::make_slow_call_ex(Node* call, ciInstanceKlass* ex_klass, bool sep
set_i_o(i_o);
if (excp != top()) {
- // Create an exception state also.
- // Use an exact type if the caller has specified a specific exception.
- const Type* ex_type = TypeOopPtr::make_from_klass_unique(ex_klass)->cast_to_ptr_type(TypePtr::NotNull);
- Node* ex_oop = new CreateExNode(ex_type, control(), i_o);
- add_exception_state(make_exception_state(_gvn.transform(ex_oop)));
+ if (deoptimize) {
+ // Deoptimize if an exception is caught. Don't construct exception state in this case.
+ uncommon_trap(Deoptimization::Reason_unhandled,
+ Deoptimization::Action_none);
+ } else {
+ // Create an exception state also.
+ // Use an exact type if the caller has specified a specific exception.
+ const Type* ex_type = TypeOopPtr::make_from_klass_unique(ex_klass)->cast_to_ptr_type(TypePtr::NotNull);
+ Node* ex_oop = new CreateExNode(ex_type, control(), i_o);
+ add_exception_state(make_exception_state(_gvn.transform(ex_oop)));
+ }
}
}
@@ -3352,7 +3358,8 @@ static void hook_memory_on_init(GraphKit& kit, int alias_idx,
//---------------------------set_output_for_allocation-------------------------
Node* GraphKit::set_output_for_allocation(AllocateNode* alloc,
- const TypeOopPtr* oop_type) {
+ const TypeOopPtr* oop_type,
+ bool deoptimize_on_exception) {
int rawidx = Compile::AliasIdxRaw;
alloc->set_req( TypeFunc::FramePtr, frameptr() );
add_safepoint_edges(alloc);
@@ -3360,7 +3367,7 @@ Node* GraphKit::set_output_for_allocation(AllocateNode* alloc,
set_control( _gvn.transform(new ProjNode(allocx, TypeFunc::Control) ) );
// create memory projection for i_o
set_memory ( _gvn.transform( new ProjNode(allocx, TypeFunc::Memory, true) ), rawidx );
- make_slow_call_ex(allocx, env()->Throwable_klass(), true);
+ make_slow_call_ex(allocx, env()->Throwable_klass(), true, deoptimize_on_exception);
// create a memory projection as for the normal control path
Node* malloc = _gvn.transform(new ProjNode(allocx, TypeFunc::Memory));
@@ -3438,9 +3445,11 @@ Node* GraphKit::set_output_for_allocation(AllocateNode* alloc,
// The optional arguments are for specialized use by intrinsics:
// - If 'extra_slow_test' if not null is an extra condition for the slow-path.
// - If 'return_size_val', report the the total object size to the caller.
+// - deoptimize_on_exception controls how Java exceptions are handled (rethrow vs deoptimize)
Node* GraphKit::new_instance(Node* klass_node,
Node* extra_slow_test,
- Node* *return_size_val) {
+ Node* *return_size_val,
+ bool deoptimize_on_exception) {
// Compute size in doublewords
// The size is always an integral number of doublewords, represented
// as a positive bytewise size stored in the klass's layout_helper.
@@ -3508,7 +3517,7 @@ Node* GraphKit::new_instance(Node* klass_node,
size, klass_node,
initial_slow_test);
- return set_output_for_allocation(alloc, oop_type);
+ return set_output_for_allocation(alloc, oop_type, deoptimize_on_exception);
}
//-------------------------------new_array-------------------------------------
@@ -3518,7 +3527,8 @@ Node* GraphKit::new_instance(Node* klass_node,
Node* GraphKit::new_array(Node* klass_node, // array klass (maybe variable)
Node* length, // number of array elements
int nargs, // number of arguments to push back for uncommon trap
- Node* *return_size_val) {
+ Node* *return_size_val,
+ bool deoptimize_on_exception) {
jint layout_con = Klass::_lh_neutral_value;
Node* layout_val = get_layout_helper(klass_node, layout_con);
int layout_is_con = (layout_val == NULL);
@@ -3661,7 +3671,7 @@ Node* GraphKit::new_array(Node* klass_node, // array klass (maybe variable)
ary_type = ary_type->is_aryptr()->cast_to_size(length_type);
}
- Node* javaoop = set_output_for_allocation(alloc, ary_type);
+ Node* javaoop = set_output_for_allocation(alloc, ary_type, deoptimize_on_exception);
// Cast length on remaining path to be as narrow as possible
if (map()->find_edge(length) >= 0) {
diff --git a/hotspot/src/share/vm/opto/graphKit.hpp b/hotspot/src/share/vm/opto/graphKit.hpp
index 2433c95d2ab..9cd7d3526e1 100644
--- a/hotspot/src/share/vm/opto/graphKit.hpp
+++ b/hotspot/src/share/vm/opto/graphKit.hpp
@@ -807,7 +807,7 @@ class GraphKit : public Phase {
// merge in all memory slices from new_mem, along the given path
void merge_memory(Node* new_mem, Node* region, int new_path);
- void make_slow_call_ex(Node* call, ciInstanceKlass* ex_klass, bool separate_io_proj);
+ void make_slow_call_ex(Node* call, ciInstanceKlass* ex_klass, bool separate_io_proj, bool deoptimize = false);
// Helper functions to build synchronizations
int next_monitor();
@@ -849,13 +849,16 @@ class GraphKit : public Phase {
// implementation of object creation
Node* set_output_for_allocation(AllocateNode* alloc,
- const TypeOopPtr* oop_type);
+ const TypeOopPtr* oop_type,
+ bool deoptimize_on_exception=false);
Node* get_layout_helper(Node* klass_node, jint& constant_value);
Node* new_instance(Node* klass_node,
Node* slow_test = NULL,
- Node* *return_size_val = NULL);
+ Node* *return_size_val = NULL,
+ bool deoptimize_on_exception = false);
Node* new_array(Node* klass_node, Node* count_val, int nargs,
- Node* *return_size_val = NULL);
+ Node* *return_size_val = NULL,
+ bool deoptimize_on_exception = false);
// java.lang.String helpers
Node* load_String_offset(Node* ctrl, Node* str);
diff --git a/hotspot/src/share/vm/opto/library_call.cpp b/hotspot/src/share/vm/opto/library_call.cpp
index 5199e224a49..7f572959854 100644
--- a/hotspot/src/share/vm/opto/library_call.cpp
+++ b/hotspot/src/share/vm/opto/library_call.cpp
@@ -4579,7 +4579,10 @@ bool LibraryCallKit::inline_native_clone(bool is_virtual) {
// It's an instance, and it passed the slow-path tests.
PreserveJVMState pjvms(this);
Node* obj_size = NULL;
- Node* alloc_obj = new_instance(obj_klass, NULL, &obj_size);
+ // Need to deoptimize on exception from allocation since Object.clone intrinsic
+ // is reexecuted if deoptimization occurs and there could be problems when merging
+ // exception state between multiple Object.clone versions (reexecute=true vs reexecute=false).
+ Node* alloc_obj = new_instance(obj_klass, NULL, &obj_size, /*deoptimize_on_exception=*/true);
copy_to_clone(obj, alloc_obj, obj_size, false, !use_ReduceInitialCardMarks());
diff --git a/hotspot/test/compiler/intrinsics/clone/TestObjectClone.java b/hotspot/test/compiler/intrinsics/clone/TestObjectClone.java
new file mode 100644
index 00000000000..8a9759d6b93
--- /dev/null
+++ b/hotspot/test/compiler/intrinsics/clone/TestObjectClone.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+/*
+ * @test
+ * @bug 8033626
+ * @summary assert(ex_map->jvms()->same_calls_as(_exceptions->jvms())) failed: all collected exceptions must come from the same place
+ * @library /testlibrary
+ * @run main/othervm -XX:-TieredCompilation -Xbatch -XX:CompileOnly=TestObjectClone::f TestObjectClone
+ */
+import com.oracle.java.testlibrary.Asserts;
+
+public class TestObjectClone implements Cloneable {
+ static class A extends TestObjectClone {}
+ static class B extends TestObjectClone {
+ public B clone() {
+ return (B)TestObjectClone.b;
+ }
+ }
+ static class C extends TestObjectClone {
+ public C clone() {
+ return (C)TestObjectClone.c;
+ }
+ }
+ static class D extends TestObjectClone {
+ public D clone() {
+ return (D)TestObjectClone.d;
+ }
+ }
+ static TestObjectClone a = new A(), b = new B(), c = new C(), d = new D();
+
+ public static Object f(TestObjectClone o) throws CloneNotSupportedException {
+ // Polymorphic call site: >90% Object::clone / <10% other methods
+ return o.clone();
+ }
+
+ public static void main(String[] args) throws Exception {
+ TestObjectClone[] params1 = {a, a, a, a, a, a, a, a, a, a, a,
+ a, a, a, a, a, a, a, a, a, a, a,
+ a, a, a, a, a, a, a, a, a, a, a,
+ b, c, d};
+
+ for (int i = 0; i < 15000; i++) {
+ f(params1[i % params1.length]);
+ }
+
+ Asserts.assertTrue(f(a) != a);
+ Asserts.assertTrue(f(b) == b);
+ Asserts.assertTrue(f(c) == c);
+ Asserts.assertTrue(f(d) == d);
+
+ try {
+ f(null);
+ throw new AssertionError("");
+ } catch (NullPointerException e) { /* expected */ }
+
+ System.out.println("TEST PASSED");
+ }
+}
From 2838bcc3bf3b63c41bc78dd65b47d8a11a4118ed Mon Sep 17 00:00:00 2001
From: Roland Westrelin
Date: Tue, 10 Jun 2014 13:37:16 +0200
Subject: [PATCH 23/76] 8026796: Make replace_in_map() on parent maps generic
Propagate node replacements along control flow edges to callers
Reviewed-by: kvn, vlivanov
---
hotspot/src/share/vm/opto/c2_globals.hpp | 3 -
hotspot/src/share/vm/opto/callGenerator.cpp | 74 +++---
hotspot/src/share/vm/opto/callGenerator.hpp | 4 +-
hotspot/src/share/vm/opto/callnode.cpp | 1 +
hotspot/src/share/vm/opto/callnode.hpp | 33 +++
hotspot/src/share/vm/opto/compile.cpp | 19 +-
hotspot/src/share/vm/opto/compile.hpp | 18 --
hotspot/src/share/vm/opto/doCall.cpp | 4 +-
hotspot/src/share/vm/opto/graphKit.cpp | 82 +++----
hotspot/src/share/vm/opto/graphKit.hpp | 2 +-
hotspot/src/share/vm/opto/library_call.cpp | 4 +-
hotspot/src/share/vm/opto/node.cpp | 6 +
hotspot/src/share/vm/opto/parse.hpp | 9 +-
hotspot/src/share/vm/opto/parse1.cpp | 31 ++-
hotspot/src/share/vm/opto/replacednodes.cpp | 219 ++++++++++++++++++
hotspot/src/share/vm/opto/replacednodes.hpp | 81 +++++++
hotspot/src/share/vm/runtime/arguments.cpp | 4 -
.../src/share/vm/utilities/growableArray.hpp | 3 +-
18 files changed, 463 insertions(+), 134 deletions(-)
create mode 100644 hotspot/src/share/vm/opto/replacednodes.cpp
create mode 100644 hotspot/src/share/vm/opto/replacednodes.hpp
diff --git a/hotspot/src/share/vm/opto/c2_globals.hpp b/hotspot/src/share/vm/opto/c2_globals.hpp
index 4f45d28666b..d745cbb022b 100644
--- a/hotspot/src/share/vm/opto/c2_globals.hpp
+++ b/hotspot/src/share/vm/opto/c2_globals.hpp
@@ -650,9 +650,6 @@
product(bool, UseMathExactIntrinsics, true, \
"Enables intrinsification of various java.lang.Math functions") \
\
- experimental(bool, ReplaceInParentMaps, false, \
- "Propagate type improvements in callers of inlinee if possible") \
- \
product(bool, UseTypeSpeculation, true, \
"Speculatively propagate types from profiles") \
\
diff --git a/hotspot/src/share/vm/opto/callGenerator.cpp b/hotspot/src/share/vm/opto/callGenerator.cpp
index 563f5ae4d78..6022957497d 100644
--- a/hotspot/src/share/vm/opto/callGenerator.cpp
+++ b/hotspot/src/share/vm/opto/callGenerator.cpp
@@ -63,12 +63,12 @@ public:
}
virtual bool is_parse() const { return true; }
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser);
+ virtual JVMState* generate(JVMState* jvms);
int is_osr() { return _is_osr; }
};
-JVMState* ParseGenerator::generate(JVMState* jvms, Parse* parent_parser) {
+JVMState* ParseGenerator::generate(JVMState* jvms) {
Compile* C = Compile::current();
C->print_inlining_update(this);
@@ -81,7 +81,7 @@ JVMState* ParseGenerator::generate(JVMState* jvms, Parse* parent_parser) {
return NULL; // bailing out of the compile; do not try to parse
}
- Parse parser(jvms, method(), _expected_uses, parent_parser);
+ Parse parser(jvms, method(), _expected_uses);
// Grab signature for matching/allocation
#ifdef ASSERT
if (parser.tf() != (parser.depth() == 1 ? C->tf() : tf())) {
@@ -120,12 +120,12 @@ class DirectCallGenerator : public CallGenerator {
_separate_io_proj(separate_io_proj)
{
}
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser);
+ virtual JVMState* generate(JVMState* jvms);
CallStaticJavaNode* call_node() const { return _call_node; }
};
-JVMState* DirectCallGenerator::generate(JVMState* jvms, Parse* parent_parser) {
+JVMState* DirectCallGenerator::generate(JVMState* jvms) {
GraphKit kit(jvms);
kit.C->print_inlining_update(this);
bool is_static = method()->is_static();
@@ -173,10 +173,10 @@ public:
vtable_index >= 0, "either invalid or usable");
}
virtual bool is_virtual() const { return true; }
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser);
+ virtual JVMState* generate(JVMState* jvms);
};
-JVMState* VirtualCallGenerator::generate(JVMState* jvms, Parse* parent_parser) {
+JVMState* VirtualCallGenerator::generate(JVMState* jvms) {
GraphKit kit(jvms);
Node* receiver = kit.argument(0);
@@ -283,7 +283,7 @@ class LateInlineCallGenerator : public DirectCallGenerator {
// Convert the CallStaticJava into an inline
virtual void do_late_inline();
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser) {
+ virtual JVMState* generate(JVMState* jvms) {
Compile *C = Compile::current();
C->log_inline_id(this);
@@ -298,7 +298,7 @@ class LateInlineCallGenerator : public DirectCallGenerator {
// that the late inlining logic can distinguish between fall
// through and exceptional uses of the memory and io projections
// as is done for allocations and macro expansion.
- return DirectCallGenerator::generate(jvms, parent_parser);
+ return DirectCallGenerator::generate(jvms);
}
virtual void print_inlining_late(const char* msg) {
@@ -399,7 +399,7 @@ void LateInlineCallGenerator::do_late_inline() {
}
// Now perform the inlining using the synthesized JVMState
- JVMState* new_jvms = _inline_cg->generate(jvms, NULL);
+ JVMState* new_jvms = _inline_cg->generate(jvms);
if (new_jvms == NULL) return; // no change
if (C->failing()) return;
@@ -417,7 +417,7 @@ void LateInlineCallGenerator::do_late_inline() {
C->env()->notice_inlined_method(_inline_cg->method());
C->set_inlining_progress(true);
- kit.replace_call(call, result);
+ kit.replace_call(call, result, true);
}
@@ -439,8 +439,8 @@ class LateInlineMHCallGenerator : public LateInlineCallGenerator {
virtual bool is_mh_late_inline() const { return true; }
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser) {
- JVMState* new_jvms = LateInlineCallGenerator::generate(jvms, parent_parser);
+ virtual JVMState* generate(JVMState* jvms) {
+ JVMState* new_jvms = LateInlineCallGenerator::generate(jvms);
Compile* C = Compile::current();
if (_input_not_const) {
@@ -486,14 +486,14 @@ class LateInlineStringCallGenerator : public LateInlineCallGenerator {
LateInlineStringCallGenerator(ciMethod* method, CallGenerator* inline_cg) :
LateInlineCallGenerator(method, inline_cg) {}
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser) {
+ virtual JVMState* generate(JVMState* jvms) {
Compile *C = Compile::current();
C->log_inline_id(this);
C->add_string_late_inline(this);
- JVMState* new_jvms = DirectCallGenerator::generate(jvms, parent_parser);
+ JVMState* new_jvms = DirectCallGenerator::generate(jvms);
return new_jvms;
}
@@ -510,14 +510,14 @@ class LateInlineBoxingCallGenerator : public LateInlineCallGenerator {
LateInlineBoxingCallGenerator(ciMethod* method, CallGenerator* inline_cg) :
LateInlineCallGenerator(method, inline_cg) {}
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser) {
+ virtual JVMState* generate(JVMState* jvms) {
Compile *C = Compile::current();
C->log_inline_id(this);
C->add_boxing_late_inline(this);
- JVMState* new_jvms = DirectCallGenerator::generate(jvms, parent_parser);
+ JVMState* new_jvms = DirectCallGenerator::generate(jvms);
return new_jvms;
}
};
@@ -553,7 +553,7 @@ public:
virtual bool is_virtual() const { return _is_virtual; }
virtual bool is_deferred() const { return true; }
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser);
+ virtual JVMState* generate(JVMState* jvms);
};
@@ -563,14 +563,14 @@ CallGenerator* CallGenerator::for_warm_call(WarmCallInfo* ci,
return new WarmCallGenerator(ci, if_cold, if_hot);
}
-JVMState* WarmCallGenerator::generate(JVMState* jvms, Parse* parent_parser) {
+JVMState* WarmCallGenerator::generate(JVMState* jvms) {
Compile* C = Compile::current();
C->print_inlining_update(this);
if (C->log() != NULL) {
C->log()->elem("warm_call bci='%d'", jvms->bci());
}
- jvms = _if_cold->generate(jvms, parent_parser);
+ jvms = _if_cold->generate(jvms);
if (jvms != NULL) {
Node* m = jvms->map()->control();
if (m->is_CatchProj()) m = m->in(0); else m = C->top();
@@ -631,7 +631,7 @@ public:
virtual bool is_inline() const { return _if_hit->is_inline(); }
virtual bool is_deferred() const { return _if_hit->is_deferred(); }
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser);
+ virtual JVMState* generate(JVMState* jvms);
};
@@ -643,14 +643,13 @@ CallGenerator* CallGenerator::for_predicted_call(ciKlass* predicted_receiver,
}
-JVMState* PredictedCallGenerator::generate(JVMState* jvms, Parse* parent_parser) {
+JVMState* PredictedCallGenerator::generate(JVMState* jvms) {
GraphKit kit(jvms);
kit.C->print_inlining_update(this);
PhaseGVN& gvn = kit.gvn();
// We need an explicit receiver null_check before checking its type.
// We share a map with the caller, so his JVMS gets adjusted.
Node* receiver = kit.argument(0);
-
CompileLog* log = kit.C->log();
if (log != NULL) {
log->elem("predicted_call bci='%d' klass='%d'",
@@ -662,6 +661,10 @@ JVMState* PredictedCallGenerator::generate(JVMState* jvms, Parse* parent_parser)
return kit.transfer_exceptions_into_jvms();
}
+ // Make a copy of the replaced nodes in case we need to restore them
+ ReplacedNodes replaced_nodes = kit.map()->replaced_nodes();
+ replaced_nodes.clone();
+
Node* exact_receiver = receiver; // will get updated in place...
Node* slow_ctl = kit.type_check_receiver(receiver,
_predicted_receiver, _hit_prob,
@@ -672,7 +675,7 @@ JVMState* PredictedCallGenerator::generate(JVMState* jvms, Parse* parent_parser)
{ PreserveJVMState pjvms(&kit);
kit.set_control(slow_ctl);
if (!kit.stopped()) {
- slow_jvms = _if_missed->generate(kit.sync_jvms(), parent_parser);
+ slow_jvms = _if_missed->generate(kit.sync_jvms());
if (kit.failing())
return NULL; // might happen because of NodeCountInliningCutoff
assert(slow_jvms != NULL, "must be");
@@ -693,12 +696,12 @@ JVMState* PredictedCallGenerator::generate(JVMState* jvms, Parse* parent_parser)
kit.replace_in_map(receiver, exact_receiver);
// Make the hot call:
- JVMState* new_jvms = _if_hit->generate(kit.sync_jvms(), parent_parser);
+ JVMState* new_jvms = _if_hit->generate(kit.sync_jvms());
if (new_jvms == NULL) {
// Inline failed, so make a direct call.
assert(_if_hit->is_inline(), "must have been a failed inline");
CallGenerator* cg = CallGenerator::for_direct_call(_if_hit->method());
- new_jvms = cg->generate(kit.sync_jvms(), parent_parser);
+ new_jvms = cg->generate(kit.sync_jvms());
}
kit.add_exception_states_from(new_jvms);
kit.set_jvms(new_jvms);
@@ -715,6 +718,11 @@ JVMState* PredictedCallGenerator::generate(JVMState* jvms, Parse* parent_parser)
return kit.transfer_exceptions_into_jvms();
}
+ // There are 2 branches and the replaced nodes are only valid on
+ // one: restore the replaced nodes to what they were before the
+ // branch.
+ kit.map()->set_replaced_nodes(replaced_nodes);
+
// Finish the diamond.
kit.C->set_has_split_ifs(true); // Has chance for split-if optimization
RegionNode* region = new RegionNode(3);
@@ -901,7 +909,7 @@ public:
virtual bool is_inlined() const { return true; }
virtual bool is_intrinsic() const { return true; }
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser);
+ virtual JVMState* generate(JVMState* jvms);
};
@@ -911,7 +919,7 @@ CallGenerator* CallGenerator::for_predicted_intrinsic(CallGenerator* intrinsic,
}
-JVMState* PredictedIntrinsicGenerator::generate(JVMState* jvms, Parse* parent_parser) {
+JVMState* PredictedIntrinsicGenerator::generate(JVMState* jvms) {
GraphKit kit(jvms);
PhaseGVN& gvn = kit.gvn();
@@ -932,7 +940,7 @@ JVMState* PredictedIntrinsicGenerator::generate(JVMState* jvms, Parse* parent_pa
PreserveJVMState pjvms(&kit);
kit.set_control(slow_ctl);
if (!kit.stopped()) {
- slow_jvms = _cg->generate(kit.sync_jvms(), parent_parser);
+ slow_jvms = _cg->generate(kit.sync_jvms());
if (kit.failing())
return NULL; // might happen because of NodeCountInliningCutoff
assert(slow_jvms != NULL, "must be");
@@ -950,12 +958,12 @@ JVMState* PredictedIntrinsicGenerator::generate(JVMState* jvms, Parse* parent_pa
}
// Generate intrinsic code:
- JVMState* new_jvms = _intrinsic->generate(kit.sync_jvms(), parent_parser);
+ JVMState* new_jvms = _intrinsic->generate(kit.sync_jvms());
if (new_jvms == NULL) {
// Intrinsic failed, so use slow code or make a direct call.
if (slow_map == NULL) {
CallGenerator* cg = CallGenerator::for_direct_call(method());
- new_jvms = cg->generate(kit.sync_jvms(), parent_parser);
+ new_jvms = cg->generate(kit.sync_jvms());
} else {
kit.set_jvms(slow_jvms);
return kit.transfer_exceptions_into_jvms();
@@ -1025,7 +1033,7 @@ public:
virtual bool is_virtual() const { ShouldNotReachHere(); return false; }
virtual bool is_trap() const { return true; }
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser);
+ virtual JVMState* generate(JVMState* jvms);
};
@@ -1037,7 +1045,7 @@ CallGenerator::for_uncommon_trap(ciMethod* m,
}
-JVMState* UncommonTrapCallGenerator::generate(JVMState* jvms, Parse* parent_parser) {
+JVMState* UncommonTrapCallGenerator::generate(JVMState* jvms) {
GraphKit kit(jvms);
kit.C->print_inlining_update(this);
// Take the trap with arguments pushed on the stack. (Cf. null_check_receiver).
diff --git a/hotspot/src/share/vm/opto/callGenerator.hpp b/hotspot/src/share/vm/opto/callGenerator.hpp
index 707015ffa4e..129fe4a754c 100644
--- a/hotspot/src/share/vm/opto/callGenerator.hpp
+++ b/hotspot/src/share/vm/opto/callGenerator.hpp
@@ -31,8 +31,6 @@
#include "opto/type.hpp"
#include "runtime/deoptimization.hpp"
-class Parse;
-
//---------------------------CallGenerator-------------------------------------
// The subclasses of this class handle generation of ideal nodes for
// call sites and method entry points.
@@ -114,7 +112,7 @@ class CallGenerator : public ResourceObj {
//
// If the result is NULL, it means that this CallGenerator was unable
// to handle the given call, and another CallGenerator should be consulted.
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser) = 0;
+ virtual JVMState* generate(JVMState* jvms) = 0;
// How to generate a call site that is inlined:
static CallGenerator* for_inline(ciMethod* m, float expected_uses = -1);
diff --git a/hotspot/src/share/vm/opto/callnode.cpp b/hotspot/src/share/vm/opto/callnode.cpp
index 848e3aeb029..275052bf8a9 100644
--- a/hotspot/src/share/vm/opto/callnode.cpp
+++ b/hotspot/src/share/vm/opto/callnode.cpp
@@ -1090,6 +1090,7 @@ const Type *SafePointNode::Value( PhaseTransform *phase ) const {
#ifndef PRODUCT
void SafePointNode::dump_spec(outputStream *st) const {
st->print(" SafePoint ");
+ _replaced_nodes.dump(st);
}
#endif
diff --git a/hotspot/src/share/vm/opto/callnode.hpp b/hotspot/src/share/vm/opto/callnode.hpp
index 398cbfecff9..6eb78b0cb7b 100644
--- a/hotspot/src/share/vm/opto/callnode.hpp
+++ b/hotspot/src/share/vm/opto/callnode.hpp
@@ -30,6 +30,7 @@
#include "opto/multnode.hpp"
#include "opto/opcodes.hpp"
#include "opto/phaseX.hpp"
+#include "opto/replacednodes.hpp"
#include "opto/type.hpp"
// Portions of code courtesy of Clifford Click
@@ -335,6 +336,7 @@ public:
OopMap* _oop_map; // Array of OopMap info (8-bit char) for GC
JVMState* const _jvms; // Pointer to list of JVM State objects
const TypePtr* _adr_type; // What type of memory does this node produce?
+ ReplacedNodes _replaced_nodes; // During parsing: list of pair of nodes from calls to GraphKit::replace_in_map()
// Many calls take *all* of memory as input,
// but some produce a limited subset of that memory as output.
@@ -426,6 +428,37 @@ public:
void set_next_exception(SafePointNode* n);
bool has_exceptions() const { return next_exception() != NULL; }
+ // Helper methods to operate on replaced nodes
+ ReplacedNodes replaced_nodes() const {
+ return _replaced_nodes;
+ }
+
+ void set_replaced_nodes(ReplacedNodes replaced_nodes) {
+ _replaced_nodes = replaced_nodes;
+ }
+
+ void clone_replaced_nodes() {
+ _replaced_nodes.clone();
+ }
+ void record_replaced_node(Node* initial, Node* improved) {
+ _replaced_nodes.record(initial, improved);
+ }
+ void transfer_replaced_nodes_from(SafePointNode* sfpt, uint idx = 0) {
+ _replaced_nodes.transfer_from(sfpt->_replaced_nodes, idx);
+ }
+ void delete_replaced_nodes() {
+ _replaced_nodes.reset();
+ }
+ void apply_replaced_nodes() {
+ _replaced_nodes.apply(this);
+ }
+ void merge_replaced_nodes_with(SafePointNode* sfpt) {
+ _replaced_nodes.merge_with(sfpt->_replaced_nodes);
+ }
+ bool has_replaced_nodes() const {
+ return !_replaced_nodes.is_empty();
+ }
+
// Standard Node stuff
virtual int Opcode() const;
virtual bool pinned() const { return true; }
diff --git a/hotspot/src/share/vm/opto/compile.cpp b/hotspot/src/share/vm/opto/compile.cpp
index f93e985ae11..0036e76518e 100644
--- a/hotspot/src/share/vm/opto/compile.cpp
+++ b/hotspot/src/share/vm/opto/compile.cpp
@@ -392,6 +392,11 @@ void Compile::remove_useless_nodes(Unique_Node_List &useful) {
uint next = 0;
while (next < useful.size()) {
Node *n = useful.at(next++);
+ if (n->is_SafePoint()) {
+ // We're done with a parsing phase. Replaced nodes are not valid
+ // beyond that point.
+ n->as_SafePoint()->delete_replaced_nodes();
+ }
// Use raw traversal of out edges since this code removes out edges
int max = n->outcnt();
for (int j = 0; j < max; ++j) {
@@ -673,7 +678,6 @@ Compile::Compile( ciEnv* ci_env, C2Compiler* compiler, ciMethod* target, int osr
_print_inlining_stream(NULL),
_print_inlining_idx(0),
_print_inlining_output(NULL),
- _preserve_jvm_state(0),
_interpreter_frame_size(0) {
C = this;
@@ -783,7 +787,7 @@ Compile::Compile( ciEnv* ci_env, C2Compiler* compiler, ciMethod* target, int osr
return;
}
JVMState* jvms = build_start_state(start(), tf());
- if ((jvms = cg->generate(jvms, NULL)) == NULL) {
+ if ((jvms = cg->generate(jvms)) == NULL) {
record_method_not_compilable("method parse failed");
return;
}
@@ -980,7 +984,6 @@ Compile::Compile( ciEnv* ci_env,
_print_inlining_stream(NULL),
_print_inlining_idx(0),
_print_inlining_output(NULL),
- _preserve_jvm_state(0),
_allowed_reasons(0),
_interpreter_frame_size(0) {
C = this;
@@ -1914,6 +1917,8 @@ void Compile::inline_boxing_calls(PhaseIterGVN& igvn) {
for_igvn()->clear();
gvn->replace_with(&igvn);
+ _late_inlines_pos = _late_inlines.length();
+
while (_boxing_late_inlines.length() > 0) {
CallGenerator* cg = _boxing_late_inlines.pop();
cg->do_late_inline();
@@ -1977,8 +1982,8 @@ void Compile::inline_incrementally(PhaseIterGVN& igvn) {
if (live_nodes() > (uint)LiveNodeCountInliningCutoff) {
if (low_live_nodes < (uint)LiveNodeCountInliningCutoff * 8 / 10) {
// PhaseIdealLoop is expensive so we only try it once we are
- // out of loop and we only try it again if the previous helped
- // got the number of nodes down significantly
+ // out of live nodes and we only try it again if the previous
+ // helped got the number of nodes down significantly
PhaseIdealLoop ideal_loop( igvn, false, true );
if (failing()) return;
low_live_nodes = live_nodes();
@@ -2072,6 +2077,10 @@ void Compile::Optimize() {
// Inline valueOf() methods now.
inline_boxing_calls(igvn);
+ if (AlwaysIncrementalInline) {
+ inline_incrementally(igvn);
+ }
+
print_method(PHASE_INCREMENTAL_BOXING_INLINE, 2);
if (failing()) return;
diff --git a/hotspot/src/share/vm/opto/compile.hpp b/hotspot/src/share/vm/opto/compile.hpp
index 36ff03906f1..7d7dd653aaa 100644
--- a/hotspot/src/share/vm/opto/compile.hpp
+++ b/hotspot/src/share/vm/opto/compile.hpp
@@ -431,9 +431,6 @@ class Compile : public Phase {
// Remove the speculative part of types and clean up the graph
void remove_speculative_types(PhaseIterGVN &igvn);
- // Are we within a PreserveJVMState block?
- int _preserve_jvm_state;
-
void* _replay_inline_data; // Pointer to data loaded from file
void print_inlining_init();
@@ -1198,21 +1195,6 @@ class Compile : public Phase {
// Auxiliary method for randomized fuzzing/stressing
static bool randomized_select(int count);
-
- // enter a PreserveJVMState block
- void inc_preserve_jvm_state() {
- _preserve_jvm_state++;
- }
-
- // exit a PreserveJVMState block
- void dec_preserve_jvm_state() {
- _preserve_jvm_state--;
- assert(_preserve_jvm_state >= 0, "_preserve_jvm_state shouldn't be negative");
- }
-
- bool has_preserve_jvm_state() const {
- return _preserve_jvm_state > 0;
- }
};
#endif // SHARE_VM_OPTO_COMPILE_HPP
diff --git a/hotspot/src/share/vm/opto/doCall.cpp b/hotspot/src/share/vm/opto/doCall.cpp
index d3a85d4d29f..2a4a85fcd8e 100644
--- a/hotspot/src/share/vm/opto/doCall.cpp
+++ b/hotspot/src/share/vm/opto/doCall.cpp
@@ -525,7 +525,7 @@ void Parse::do_call() {
// because exceptions don't return to the call site.)
profile_call(receiver);
- JVMState* new_jvms = cg->generate(jvms, this);
+ JVMState* new_jvms = cg->generate(jvms);
if (new_jvms == NULL) {
// When inlining attempt fails (e.g., too many arguments),
// it may contaminate the current compile state, making it
@@ -539,7 +539,7 @@ void Parse::do_call() {
// intrinsic was expecting to optimize. Should always be possible to
// get a normal java call that may inline in that case
cg = C->call_generator(cg->method(), vtable_index, call_does_dispatch, jvms, try_inline, prof_factor(), speculative_receiver_type, /* allow_intrinsics= */ false);
- new_jvms = cg->generate(jvms, this);
+ new_jvms = cg->generate(jvms);
if (new_jvms == NULL) {
guarantee(failing(), "call failed to generate: calls should work");
return;
diff --git a/hotspot/src/share/vm/opto/graphKit.cpp b/hotspot/src/share/vm/opto/graphKit.cpp
index 5a5b7da97e1..6d0037f9b30 100644
--- a/hotspot/src/share/vm/opto/graphKit.cpp
+++ b/hotspot/src/share/vm/opto/graphKit.cpp
@@ -432,6 +432,7 @@ void GraphKit::combine_exception_states(SafePointNode* ex_map, SafePointNode* ph
}
}
}
+ phi_map->merge_replaced_nodes_with(ex_map);
}
//--------------------------use_exception_state--------------------------------
@@ -645,7 +646,6 @@ PreserveJVMState::PreserveJVMState(GraphKit* kit, bool clone_map) {
_map = kit->map(); // preserve the map
_sp = kit->sp();
kit->set_map(clone_map ? kit->clone_map() : NULL);
- Compile::current()->inc_preserve_jvm_state();
#ifdef ASSERT
_bci = kit->bci();
Parse* parser = kit->is_Parse();
@@ -663,7 +663,6 @@ PreserveJVMState::~PreserveJVMState() {
#endif
kit->set_map(_map);
kit->set_sp(_sp);
- Compile::current()->dec_preserve_jvm_state();
}
@@ -1403,60 +1402,17 @@ void GraphKit::replace_in_map(Node* old, Node* neww) {
// on the map. This includes locals, stack, and monitors
// of the current (innermost) JVM state.
- if (!ReplaceInParentMaps) {
+ // don't let inconsistent types from profiling escape this
+ // method
+
+ const Type* told = _gvn.type(old);
+ const Type* tnew = _gvn.type(neww);
+
+ if (!tnew->higher_equal(told)) {
return;
}
- // PreserveJVMState doesn't do a deep copy so we can't modify
- // parents
- if (Compile::current()->has_preserve_jvm_state()) {
- return;
- }
-
- Parse* parser = is_Parse();
- bool progress = true;
- Node* ctrl = map()->in(0);
- // Follow the chain of parsers and see whether the update can be
- // done in the map of callers. We can do the replace for a caller if
- // the current control post dominates the control of a caller.
- while (parser != NULL && parser->caller() != NULL && progress) {
- progress = false;
- Node* parent_map = parser->caller()->map();
- assert(parser->exits().map()->jvms()->depth() == parser->caller()->depth(), "map mismatch");
-
- Node* parent_ctrl = parent_map->in(0);
-
- while (parent_ctrl->is_Region()) {
- Node* n = parent_ctrl->as_Region()->is_copy();
- if (n == NULL) {
- break;
- }
- parent_ctrl = n;
- }
-
- for (;;) {
- if (ctrl == parent_ctrl) {
- // update the map of the exits which is the one that will be
- // used when compilation resume after inlining
- parser->exits().map()->replace_edge(old, neww);
- progress = true;
- break;
- }
- if (ctrl->is_Proj() && ctrl->as_Proj()->is_uncommon_trap_if_pattern(Deoptimization::Reason_none)) {
- ctrl = ctrl->in(0)->in(0);
- } else if (ctrl->is_Region()) {
- Node* n = ctrl->as_Region()->is_copy();
- if (n == NULL) {
- break;
- }
- ctrl = n;
- } else {
- break;
- }
- }
-
- parser = parser->parent_parser();
- }
+ map()->record_replaced_node(old, neww);
}
@@ -1864,12 +1820,16 @@ void GraphKit::set_predefined_output_for_runtime_call(Node* call,
// Replace the call with the current state of the kit.
-void GraphKit::replace_call(CallNode* call, Node* result) {
+void GraphKit::replace_call(CallNode* call, Node* result, bool do_replaced_nodes) {
JVMState* ejvms = NULL;
if (has_exceptions()) {
ejvms = transfer_exceptions_into_jvms();
}
+ ReplacedNodes replaced_nodes = map()->replaced_nodes();
+ ReplacedNodes replaced_nodes_exception;
+ Node* ex_ctl = top();
+
SafePointNode* final_state = stop();
// Find all the needed outputs of this call
@@ -1886,6 +1846,10 @@ void GraphKit::replace_call(CallNode* call, Node* result) {
C->gvn_replace_by(callprojs.fallthrough_catchproj, final_ctl);
}
if (callprojs.fallthrough_memproj != NULL) {
+ if (final_mem->is_MergeMem()) {
+ // Parser's exits MergeMem was not transformed but may be optimized
+ final_mem = _gvn.transform(final_mem);
+ }
C->gvn_replace_by(callprojs.fallthrough_memproj, final_mem);
}
if (callprojs.fallthrough_ioproj != NULL) {
@@ -1917,10 +1881,13 @@ void GraphKit::replace_call(CallNode* call, Node* result) {
// Load my combined exception state into the kit, with all phis transformed:
SafePointNode* ex_map = ekit.combine_and_pop_all_exception_states();
+ replaced_nodes_exception = ex_map->replaced_nodes();
Node* ex_oop = ekit.use_exception_state(ex_map);
+
if (callprojs.catchall_catchproj != NULL) {
C->gvn_replace_by(callprojs.catchall_catchproj, ekit.control());
+ ex_ctl = ekit.control();
}
if (callprojs.catchall_memproj != NULL) {
C->gvn_replace_by(callprojs.catchall_memproj, ekit.reset_memory());
@@ -1953,6 +1920,13 @@ void GraphKit::replace_call(CallNode* call, Node* result) {
_gvn.transform(wl.pop());
}
}
+
+ if (callprojs.fallthrough_catchproj != NULL && !final_ctl->is_top() && do_replaced_nodes) {
+ replaced_nodes.apply(C, final_ctl);
+ }
+ if (!ex_ctl->is_top() && do_replaced_nodes) {
+ replaced_nodes_exception.apply(C, ex_ctl);
+ }
}
diff --git a/hotspot/src/share/vm/opto/graphKit.hpp b/hotspot/src/share/vm/opto/graphKit.hpp
index 9cd7d3526e1..683be5c9060 100644
--- a/hotspot/src/share/vm/opto/graphKit.hpp
+++ b/hotspot/src/share/vm/opto/graphKit.hpp
@@ -690,7 +690,7 @@ class GraphKit : public Phase {
// Replace the call with the current state of the kit. Requires
// that the call was generated with separate io_projs so that
// exceptional control flow can be handled properly.
- void replace_call(CallNode* call, Node* result);
+ void replace_call(CallNode* call, Node* result, bool do_replaced_nodes = false);
// helper functions for statistics
void increment_counter(address counter_addr); // increment a debug counter
diff --git a/hotspot/src/share/vm/opto/library_call.cpp b/hotspot/src/share/vm/opto/library_call.cpp
index 7f572959854..1bbb986e469 100644
--- a/hotspot/src/share/vm/opto/library_call.cpp
+++ b/hotspot/src/share/vm/opto/library_call.cpp
@@ -69,7 +69,7 @@ class LibraryIntrinsic : public InlineCallGenerator {
virtual bool is_virtual() const { return _is_virtual; }
virtual bool is_predicted() const { return _is_predicted; }
virtual bool does_virtual_dispatch() const { return _does_virtual_dispatch; }
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser);
+ virtual JVMState* generate(JVMState* jvms);
virtual Node* generate_predicate(JVMState* jvms);
vmIntrinsics::ID intrinsic_id() const { return _intrinsic_id; }
};
@@ -591,7 +591,7 @@ void Compile::register_library_intrinsics() {
// Nothing to do here.
}
-JVMState* LibraryIntrinsic::generate(JVMState* jvms, Parse* parent_parser) {
+JVMState* LibraryIntrinsic::generate(JVMState* jvms) {
LibraryCallKit kit(jvms, this);
Compile* C = kit.C;
int nodes = C->unique();
diff --git a/hotspot/src/share/vm/opto/node.cpp b/hotspot/src/share/vm/opto/node.cpp
index 7b5ffc48d64..f48e87c0c33 100644
--- a/hotspot/src/share/vm/opto/node.cpp
+++ b/hotspot/src/share/vm/opto/node.cpp
@@ -514,6 +514,9 @@ Node *Node::clone() const {
if (n->is_Call()) {
n->as_Call()->clone_jvms(C);
}
+ if (n->is_SafePoint()) {
+ n->as_SafePoint()->clone_replaced_nodes();
+ }
return n; // Return the clone
}
@@ -609,6 +612,9 @@ void Node::destruct() {
if (is_expensive()) {
compile->remove_expensive_node(this);
}
+ if (is_SafePoint()) {
+ as_SafePoint()->delete_replaced_nodes();
+ }
#ifdef ASSERT
// We will not actually delete the storage, but we'll make the node unusable.
*(address*)this = badAddress; // smash the C++ vtbl, probably
diff --git a/hotspot/src/share/vm/opto/parse.hpp b/hotspot/src/share/vm/opto/parse.hpp
index e810c9d4d58..fe941c07298 100644
--- a/hotspot/src/share/vm/opto/parse.hpp
+++ b/hotspot/src/share/vm/opto/parse.hpp
@@ -359,12 +359,13 @@ class Parse : public GraphKit {
int _est_switch_depth; // Debugging SwitchRanges.
#endif
- // parser for the caller of the method of this object
- Parse* const _parent;
+ bool _first_return; // true if return is the first to be parsed
+ bool _replaced_nodes_for_exceptions; // needs processing of replaced nodes in exception paths?
+ uint _new_idx; // any node with _idx above were new during this parsing. Used to trim the replaced nodes list.
public:
// Constructor
- Parse(JVMState* caller, ciMethod* parse_method, float expected_uses, Parse* parent);
+ Parse(JVMState* caller, ciMethod* parse_method, float expected_uses);
virtual Parse* is_Parse() const { return (Parse*)this; }
@@ -425,8 +426,6 @@ class Parse : public GraphKit {
return block()->successor_for_bci(bci);
}
- Parse* parent_parser() const { return _parent; }
-
private:
// Create a JVMS & map for the initial state of this method.
SafePointNode* create_entry_map();
diff --git a/hotspot/src/share/vm/opto/parse1.cpp b/hotspot/src/share/vm/opto/parse1.cpp
index 838c9b08d7b..a758f72acdc 100644
--- a/hotspot/src/share/vm/opto/parse1.cpp
+++ b/hotspot/src/share/vm/opto/parse1.cpp
@@ -383,8 +383,8 @@ void Parse::load_interpreter_state(Node* osr_buf) {
//------------------------------Parse------------------------------------------
// Main parser constructor.
-Parse::Parse(JVMState* caller, ciMethod* parse_method, float expected_uses, Parse* parent)
- : _exits(caller), _parent(parent)
+Parse::Parse(JVMState* caller, ciMethod* parse_method, float expected_uses)
+ : _exits(caller)
{
// Init some variables
_caller = caller;
@@ -399,6 +399,9 @@ Parse::Parse(JVMState* caller, ciMethod* parse_method, float expected_uses, Pars
_entry_bci = InvocationEntryBci;
_tf = NULL;
_block = NULL;
+ _first_return = true;
+ _replaced_nodes_for_exceptions = false;
+ _new_idx = C->unique();
debug_only(_block_count = -1);
debug_only(_blocks = (Block*)-1);
#ifndef PRODUCT
@@ -901,6 +904,10 @@ void Parse::throw_to_exit(SafePointNode* ex_map) {
for (uint i = 0; i < TypeFunc::Parms; i++) {
caller.map()->set_req(i, ex_map->in(i));
}
+ if (ex_map->has_replaced_nodes()) {
+ _replaced_nodes_for_exceptions = true;
+ }
+ caller.map()->transfer_replaced_nodes_from(ex_map, _new_idx);
// ...and the exception:
Node* ex_oop = saved_ex_oop(ex_map);
SafePointNode* caller_ex_map = caller.make_exception_state(ex_oop);
@@ -991,7 +998,7 @@ void Parse::do_exits() {
bool do_synch = method()->is_synchronized() && GenerateSynchronizationCode;
// record exit from a method if compiled while Dtrace is turned on.
- if (do_synch || C->env()->dtrace_method_probes()) {
+ if (do_synch || C->env()->dtrace_method_probes() || _replaced_nodes_for_exceptions) {
// First move the exception list out of _exits:
GraphKit kit(_exits.transfer_exceptions_into_jvms());
SafePointNode* normal_map = kit.map(); // keep this guy safe
@@ -1016,6 +1023,9 @@ void Parse::do_exits() {
if (C->env()->dtrace_method_probes()) {
kit.make_dtrace_method_exit(method());
}
+ if (_replaced_nodes_for_exceptions) {
+ kit.map()->apply_replaced_nodes();
+ }
// Done with exception-path processing.
ex_map = kit.make_exception_state(ex_oop);
assert(ex_jvms->same_calls_as(ex_map->jvms()), "sanity");
@@ -1035,6 +1045,7 @@ void Parse::do_exits() {
_exits.add_exception_state(ex_map);
}
}
+ _exits.map()->apply_replaced_nodes();
}
//-----------------------------create_entry_map-------------------------------
@@ -1049,6 +1060,9 @@ SafePointNode* Parse::create_entry_map() {
return NULL;
}
+ // clear current replaced nodes that are of no use from here on (map was cloned in build_exits).
+ _caller->map()->delete_replaced_nodes();
+
// If this is an inlined method, we may have to do a receiver null check.
if (_caller->has_method() && is_normal_parse() && !method()->is_static()) {
GraphKit kit(_caller);
@@ -1072,6 +1086,8 @@ SafePointNode* Parse::create_entry_map() {
SafePointNode* inmap = _caller->map();
assert(inmap != NULL, "must have inmap");
+ // In case of null check on receiver above
+ map()->transfer_replaced_nodes_from(inmap, _new_idx);
uint i;
@@ -1701,6 +1717,8 @@ void Parse::merge_common(Parse::Block* target, int pnum) {
set_control(r->nonnull_req());
}
+ map()->merge_replaced_nodes_with(newin);
+
// newin has been subsumed into the lazy merge, and is now dead.
set_block(save_block);
@@ -2130,6 +2148,13 @@ void Parse::return_current(Node* value) {
phi->add_req(value);
}
+ if (_first_return) {
+ _exits.map()->transfer_replaced_nodes_from(map(), _new_idx);
+ _first_return = false;
+ } else {
+ _exits.map()->merge_replaced_nodes_with(map());
+ }
+
stop_and_kill_map(); // This CFG path dies here
}
diff --git a/hotspot/src/share/vm/opto/replacednodes.cpp b/hotspot/src/share/vm/opto/replacednodes.cpp
new file mode 100644
index 00000000000..bf647e96481
--- /dev/null
+++ b/hotspot/src/share/vm/opto/replacednodes.cpp
@@ -0,0 +1,219 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "opto/cfgnode.hpp"
+#include "opto/phaseX.hpp"
+#include "opto/replacednodes.hpp"
+
+void ReplacedNodes::allocate_if_necessary() {
+ if (_replaced_nodes == NULL) {
+ _replaced_nodes = new GrowableArray();
+ }
+}
+
+bool ReplacedNodes::is_empty() const {
+ return _replaced_nodes == NULL || _replaced_nodes->length() == 0;
+}
+
+bool ReplacedNodes::has_node(const ReplacedNode& r) const {
+ return _replaced_nodes->find(r) != -1;
+}
+
+bool ReplacedNodes::has_target_node(Node* n) const {
+ for (int i = 0; i < _replaced_nodes->length(); i++) {
+ if (_replaced_nodes->at(i).improved() == n) {
+ return true;
+ }
+ }
+ return false;
+}
+
+// Record replaced node if not seen before
+void ReplacedNodes::record(Node* initial, Node* improved) {
+ allocate_if_necessary();
+ ReplacedNode r(initial, improved);
+ if (!has_node(r)) {
+ _replaced_nodes->push(r);
+ }
+}
+
+// Copy replaced nodes from one map to another. idx is used to
+// identify nodes that are too new to be of interest in the target
+// node list.
+void ReplacedNodes::transfer_from(const ReplacedNodes& other, uint idx) {
+ if (other.is_empty()) {
+ return;
+ }
+ allocate_if_necessary();
+ for (int i = 0; i < other._replaced_nodes->length(); i++) {
+ ReplacedNode replaced = other._replaced_nodes->at(i);
+ // Only transfer the nodes that can actually be useful
+ if (!has_node(replaced) && (replaced.initial()->_idx < idx || has_target_node(replaced.initial()))) {
+ _replaced_nodes->push(replaced);
+ }
+ }
+}
+
+void ReplacedNodes::clone() {
+ if (_replaced_nodes != NULL) {
+ GrowableArray* replaced_nodes_clone = new GrowableArray();
+ replaced_nodes_clone->appendAll(_replaced_nodes);
+ _replaced_nodes = replaced_nodes_clone;
+ }
+}
+
+void ReplacedNodes::reset() {
+ if (_replaced_nodes != NULL) {
+ _replaced_nodes->clear();
+ }
+}
+
+// Perfom node replacement (used when returning to caller)
+void ReplacedNodes::apply(Node* n) {
+ if (is_empty()) {
+ return;
+ }
+ for (int i = 0; i < _replaced_nodes->length(); i++) {
+ ReplacedNode replaced = _replaced_nodes->at(i);
+ n->replace_edge(replaced.initial(), replaced.improved());
+ }
+}
+
+static void enqueue_use(Node* n, Node* use, Unique_Node_List& work) {
+ if (use->is_Phi()) {
+ Node* r = use->in(0);
+ assert(r->is_Region(), "Phi should have Region");
+ for (uint i = 1; i < use->req(); i++) {
+ if (use->in(i) == n) {
+ work.push(r->in(i));
+ }
+ }
+ } else {
+ work.push(use);
+ }
+}
+
+// Perfom node replacement following late inlining
+void ReplacedNodes::apply(Compile* C, Node* ctl) {
+ // ctl is the control on exit of the method that was late inlined
+ if (is_empty()) {
+ return;
+ }
+ for (int i = 0; i < _replaced_nodes->length(); i++) {
+ ReplacedNode replaced = _replaced_nodes->at(i);
+ Node* initial = replaced.initial();
+ Node* improved = replaced.improved();
+ assert (ctl != NULL && !ctl->is_top(), "replaced node should have actual control");
+
+ ResourceMark rm;
+ Unique_Node_List work;
+ // Go over all the uses of the node that is considered for replacement...
+ for (DUIterator j = initial->outs(); initial->has_out(j); j++) {
+ Node* use = initial->out(j);
+
+ if (use == improved || use->outcnt() == 0) {
+ continue;
+ }
+ work.clear();
+ enqueue_use(initial, use, work);
+ bool replace = true;
+ // Check that this use is dominated by ctl. Go ahead with the
+ // replacement if it is.
+ while (work.size() != 0 && replace) {
+ Node* n = work.pop();
+ if (use->outcnt() == 0) {
+ continue;
+ }
+ if (n->is_CFG() || (n->in(0) != NULL && !n->in(0)->is_top())) {
+ int depth = 0;
+ Node *m = n;
+ if (!n->is_CFG()) {
+ n = n->in(0);
+ }
+ assert(n->is_CFG(), "should be CFG now");
+ while(n != ctl) {
+ n = IfNode::up_one_dom(n);
+ depth++;
+ // limit search depth
+ if (depth >= 100 || n == NULL) {
+ replace = false;
+ break;
+ }
+ }
+ } else {
+ for (DUIterator k = n->outs(); n->has_out(k); k++) {
+ enqueue_use(n, n->out(k), work);
+ }
+ }
+ }
+ if (replace) {
+ bool is_in_table = C->initial_gvn()->hash_delete(use);
+ int replaced = use->replace_edge(initial, improved);
+ if (is_in_table) {
+ C->initial_gvn()->hash_find_insert(use);
+ }
+ C->record_for_igvn(use);
+
+ assert(replaced > 0, "inconsistent");
+ --j;
+ }
+ }
+ }
+}
+
+void ReplacedNodes::dump(outputStream *st) const {
+ if (!is_empty()) {
+ tty->print("replaced nodes: ");
+ for (int i = 0; i < _replaced_nodes->length(); i++) {
+ tty->print("%d->%d", _replaced_nodes->at(i).initial()->_idx, _replaced_nodes->at(i).improved()->_idx);
+ if (i < _replaced_nodes->length()-1) {
+ tty->print(",");
+ }
+ }
+ }
+}
+
+// Merge 2 list of replaced node at a point where control flow paths merge
+void ReplacedNodes::merge_with(const ReplacedNodes& other) {
+ if (is_empty()) {
+ return;
+ }
+ if (other.is_empty()) {
+ reset();
+ return;
+ }
+ int shift = 0;
+ int len = _replaced_nodes->length();
+ for (int i = 0; i < len; i++) {
+ if (!other.has_node(_replaced_nodes->at(i))) {
+ shift++;
+ } else if (shift > 0) {
+ _replaced_nodes->at_put(i-shift, _replaced_nodes->at(i));
+ }
+ }
+ if (shift > 0) {
+ _replaced_nodes->trunc_to(len - shift);
+ }
+}
diff --git a/hotspot/src/share/vm/opto/replacednodes.hpp b/hotspot/src/share/vm/opto/replacednodes.hpp
new file mode 100644
index 00000000000..0f68fe986d5
--- /dev/null
+++ b/hotspot/src/share/vm/opto/replacednodes.hpp
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#ifndef SHARE_VM_OPTO_REPLACEDNODES_HPP
+#define SHARE_VM_OPTO_REPLACEDNODES_HPP
+
+#include "opto/connode.hpp"
+
+// During parsing, when a node is "improved",
+// GraphKit::replace_in_map() is called to update the current map so
+// that the improved node is used from that point
+// on. GraphKit::replace_in_map() doesn't operate on the callers maps
+// and so some optimization opportunities may be lost. The
+// ReplacedNodes class addresses that problem.
+//
+// A ReplacedNodes object is a list of pair of nodes. Every
+// SafePointNode carries a ReplacedNodes object. Every time
+// GraphKit::replace_in_map() is called, a new pair of nodes is pushed
+// on the list of replaced nodes. When control flow paths merge, their
+// replaced nodes are also merged. When parsing exits a method to
+// return to a caller, the replaced nodes on the exit path are used to
+// update the caller's map.
+class ReplacedNodes VALUE_OBJ_CLASS_SPEC {
+ private:
+ class ReplacedNode VALUE_OBJ_CLASS_SPEC {
+ private:
+ Node* _initial;
+ Node* _improved;
+ public:
+ ReplacedNode() : _initial(NULL), _improved(NULL) {}
+ ReplacedNode(Node* initial, Node* improved) : _initial(initial), _improved(improved) {}
+ Node* initial() const { return _initial; }
+ Node* improved() const { return _improved; }
+
+ bool operator==(const ReplacedNode& other) {
+ return _initial == other._initial && _improved == other._improved;
+ }
+ };
+ GrowableArray* _replaced_nodes;
+
+ void allocate_if_necessary();
+ bool has_node(const ReplacedNode& r) const;
+ bool has_target_node(Node* n) const;
+
+ public:
+ ReplacedNodes()
+ : _replaced_nodes(NULL) {}
+
+ void clone();
+ void record(Node* initial, Node* improved);
+ void transfer_from(const ReplacedNodes& other, uint idx);
+ void reset();
+ void apply(Node* n);
+ void merge_with(const ReplacedNodes& other);
+ bool is_empty() const;
+ void dump(outputStream *st) const;
+ void apply(Compile* C, Node* ctl);
+};
+
+#endif // SHARE_VM_OPTO_REPLACEDNODES_HPP
diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp
index 91e485e7aed..63b52373e41 100644
--- a/hotspot/src/share/vm/runtime/arguments.cpp
+++ b/hotspot/src/share/vm/runtime/arguments.cpp
@@ -3834,10 +3834,6 @@ jint Arguments::apply_ergo() {
// nothing to use the profiling, turn if off
FLAG_SET_DEFAULT(TypeProfileLevel, 0);
}
- if (UseTypeSpeculation && FLAG_IS_DEFAULT(ReplaceInParentMaps)) {
- // Doing the replace in parent maps helps speculation
- FLAG_SET_DEFAULT(ReplaceInParentMaps, true);
- }
#endif
if (PrintAssembly && FLAG_IS_DEFAULT(DebugNonSafepoints)) {
diff --git a/hotspot/src/share/vm/utilities/growableArray.hpp b/hotspot/src/share/vm/utilities/growableArray.hpp
index 1fca26e4b28..c92848d200e 100644
--- a/hotspot/src/share/vm/utilities/growableArray.hpp
+++ b/hotspot/src/share/vm/utilities/growableArray.hpp
@@ -349,6 +349,7 @@ template class GrowableArray : public GenericGrowableArray {
// inserts the given element before the element at index i
void insert_before(const int idx, const E& elem) {
+ assert(0 <= idx && idx <= _len, "illegal index");
check_nesting();
if (_len == _max) grow(_len);
for (int j = _len - 1; j >= idx; j--) {
@@ -360,7 +361,7 @@ template class GrowableArray : public GenericGrowableArray {
void appendAll(const GrowableArray* l) {
for (int i = 0; i < l->_len; i++) {
- raw_at_put_grow(_len, l->_data[i], 0);
+ raw_at_put_grow(_len, l->_data[i], E());
}
}
From dc14ad30cef75c29101d29c7b9b41c34caf42431 Mon Sep 17 00:00:00 2001
From: Igor Ignatyev
Date: Tue, 10 Jun 2014 23:18:25 +0400
Subject: [PATCH 24/76] 8044575:
testlibrary_tests/whitebox/vm_flags/UintxTest.java failed: assert(!res ||
TypeEntriesAtCall::arguments_profiling_enabled()) failed: no profiling of
arguments
Reviewed-by: kvn, jmasa
---
.../test/testlibrary_tests/whitebox/vm_flags/UintxTest.java | 2 +-
.../test/testlibrary_tests/whitebox/vm_flags/VmFlagTest.java | 4 +---
2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/hotspot/test/testlibrary_tests/whitebox/vm_flags/UintxTest.java b/hotspot/test/testlibrary_tests/whitebox/vm_flags/UintxTest.java
index 688962f0267..7141221f204 100644
--- a/hotspot/test/testlibrary_tests/whitebox/vm_flags/UintxTest.java
+++ b/hotspot/test/testlibrary_tests/whitebox/vm_flags/UintxTest.java
@@ -34,7 +34,7 @@
import com.oracle.java.testlibrary.Platform;
public class UintxTest {
- private static final String FLAG_NAME = "TypeProfileLevel";
+ private static final String FLAG_NAME = "VerifyGCStartAt";
private static final Long[] TESTS = {0L, 100L, (long) Integer.MAX_VALUE,
(1L << 32L) - 1L, 1L << 32L};
private static final Long[] EXPECTED_64 = TESTS;
diff --git a/hotspot/test/testlibrary_tests/whitebox/vm_flags/VmFlagTest.java b/hotspot/test/testlibrary_tests/whitebox/vm_flags/VmFlagTest.java
index fa8915f3a49..0818f21f1c0 100644
--- a/hotspot/test/testlibrary_tests/whitebox/vm_flags/VmFlagTest.java
+++ b/hotspot/test/testlibrary_tests/whitebox/vm_flags/VmFlagTest.java
@@ -55,9 +55,7 @@ public final class VmFlagTest {
}
private T getValue() {
- T t = get.apply(flagName);
- System.out.println("T = " + t);
- return t;
+ return get.apply(flagName);
}
protected static void runTest(String existentFlag, T[] tests,
From 56cea022c9dd80b9167e1509b4279e446cc030ad Mon Sep 17 00:00:00 2001
From: Vladimir Kozlov
Date: Tue, 10 Jun 2014 12:28:06 -0700
Subject: [PATCH 25/76] 8035605: Expand functionality of
PredictedIntrinsicGenerator
Allow several predicates and separate intrinsic methods per one intrinsified (virtual) method.
Reviewed-by: roland
---
hotspot/src/share/vm/opto/callGenerator.cpp | 226 ++++++++++++++------
hotspot/src/share/vm/opto/callGenerator.hpp | 11 +-
hotspot/src/share/vm/opto/doCall.cpp | 4 +-
hotspot/src/share/vm/opto/graphKit.cpp | 27 +--
hotspot/src/share/vm/opto/library_call.cpp | 52 +++--
5 files changed, 207 insertions(+), 113 deletions(-)
diff --git a/hotspot/src/share/vm/opto/callGenerator.cpp b/hotspot/src/share/vm/opto/callGenerator.cpp
index 6022957497d..73282119981 100644
--- a/hotspot/src/share/vm/opto/callGenerator.cpp
+++ b/hotspot/src/share/vm/opto/callGenerator.cpp
@@ -732,7 +732,15 @@ JVMState* PredictedCallGenerator::generate(JVMState* jvms) {
Node* iophi = PhiNode::make(region, kit.i_o(), Type::ABIO);
iophi->set_req(2, slow_map->i_o());
kit.set_i_o(gvn.transform(iophi));
+ // Merge memory
kit.merge_memory(slow_map->merged_memory(), region, 2);
+ // Transform new memory Phis.
+ for (MergeMemStream mms(kit.merged_memory()); mms.next_non_empty();) {
+ Node* phi = mms.memory();
+ if (phi->is_Phi() && phi->in(0) == region) {
+ mms.set_memory(gvn.transform(phi));
+ }
+ }
uint tos = kit.jvms()->stkoff() + kit.sp();
uint limit = slow_map->req();
for (uint i = TypeFunc::Parms; i < limit; i++) {
@@ -890,15 +898,15 @@ CallGenerator* CallGenerator::for_method_handle_inline(JVMState* jvms, ciMethod*
}
-//------------------------PredictedIntrinsicGenerator------------------------------
-// Internal class which handles all predicted Intrinsic calls.
-class PredictedIntrinsicGenerator : public CallGenerator {
+//------------------------PredicatedIntrinsicGenerator------------------------------
+// Internal class which handles all predicated Intrinsic calls.
+class PredicatedIntrinsicGenerator : public CallGenerator {
CallGenerator* _intrinsic;
CallGenerator* _cg;
public:
- PredictedIntrinsicGenerator(CallGenerator* intrinsic,
- CallGenerator* cg)
+ PredicatedIntrinsicGenerator(CallGenerator* intrinsic,
+ CallGenerator* cg)
: CallGenerator(cg->method())
{
_intrinsic = intrinsic;
@@ -913,104 +921,182 @@ public:
};
-CallGenerator* CallGenerator::for_predicted_intrinsic(CallGenerator* intrinsic,
- CallGenerator* cg) {
- return new PredictedIntrinsicGenerator(intrinsic, cg);
+CallGenerator* CallGenerator::for_predicated_intrinsic(CallGenerator* intrinsic,
+ CallGenerator* cg) {
+ return new PredicatedIntrinsicGenerator(intrinsic, cg);
}
-JVMState* PredictedIntrinsicGenerator::generate(JVMState* jvms) {
+JVMState* PredicatedIntrinsicGenerator::generate(JVMState* jvms) {
+ // The code we want to generate here is:
+ // if (receiver == NULL)
+ // uncommon_Trap
+ // if (predicate(0))
+ // do_intrinsic(0)
+ // else
+ // if (predicate(1))
+ // do_intrinsic(1)
+ // ...
+ // else
+ // do_java_comp
+
GraphKit kit(jvms);
PhaseGVN& gvn = kit.gvn();
CompileLog* log = kit.C->log();
if (log != NULL) {
- log->elem("predicted_intrinsic bci='%d' method='%d'",
+ log->elem("predicated_intrinsic bci='%d' method='%d'",
jvms->bci(), log->identify(method()));
}
- Node* slow_ctl = _intrinsic->generate_predicate(kit.sync_jvms());
- if (kit.failing())
- return NULL; // might happen because of NodeCountInliningCutoff
-
- kit.C->print_inlining_update(this);
- SafePointNode* slow_map = NULL;
- JVMState* slow_jvms;
- if (slow_ctl != NULL) {
- PreserveJVMState pjvms(&kit);
- kit.set_control(slow_ctl);
- if (!kit.stopped()) {
- slow_jvms = _cg->generate(kit.sync_jvms());
- if (kit.failing())
- return NULL; // might happen because of NodeCountInliningCutoff
- assert(slow_jvms != NULL, "must be");
- kit.add_exception_states_from(slow_jvms);
- kit.set_map(slow_jvms->map());
- if (!kit.stopped())
- slow_map = kit.stop();
- }
- }
-
- if (kit.stopped()) {
- // Predicate is always false.
- kit.set_jvms(slow_jvms);
- return kit.transfer_exceptions_into_jvms();
- }
-
- // Generate intrinsic code:
- JVMState* new_jvms = _intrinsic->generate(kit.sync_jvms());
- if (new_jvms == NULL) {
- // Intrinsic failed, so use slow code or make a direct call.
- if (slow_map == NULL) {
- CallGenerator* cg = CallGenerator::for_direct_call(method());
- new_jvms = cg->generate(kit.sync_jvms());
- } else {
- kit.set_jvms(slow_jvms);
+ if (!method()->is_static()) {
+ // We need an explicit receiver null_check before checking its type in predicate.
+ // We share a map with the caller, so his JVMS gets adjusted.
+ Node* receiver = kit.null_check_receiver_before_call(method());
+ if (kit.stopped()) {
return kit.transfer_exceptions_into_jvms();
}
}
- kit.add_exception_states_from(new_jvms);
- kit.set_jvms(new_jvms);
- // Need to merge slow and fast?
- if (slow_map == NULL) {
- // The fast path is the only path remaining.
+ int n_predicates = _intrinsic->predicates_count();
+ assert(n_predicates > 0, "sanity");
+
+ JVMState** result_jvms = NEW_RESOURCE_ARRAY(JVMState*, (n_predicates+1));
+
+ // Region for normal compilation code if intrinsic failed.
+ Node* slow_region = new RegionNode(1);
+
+ int results = 0;
+ for (int predicate = 0; (predicate < n_predicates) && !kit.stopped(); predicate++) {
+#ifdef ASSERT
+ JVMState* old_jvms = kit.jvms();
+ SafePointNode* old_map = kit.map();
+ Node* old_io = old_map->i_o();
+ Node* old_mem = old_map->memory();
+ Node* old_exc = old_map->next_exception();
+#endif
+ Node* else_ctrl = _intrinsic->generate_predicate(kit.sync_jvms(), predicate);
+#ifdef ASSERT
+ // Assert(no_new_memory && no_new_io && no_new_exceptions) after generate_predicate.
+ assert(old_jvms == kit.jvms(), "generate_predicate should not change jvm state");
+ SafePointNode* new_map = kit.map();
+ assert(old_io == new_map->i_o(), "generate_predicate should not change i_o");
+ assert(old_mem == new_map->memory(), "generate_predicate should not change memory");
+ assert(old_exc == new_map->next_exception(), "generate_predicate should not add exceptions");
+#endif
+ if (!kit.stopped()) {
+ PreserveJVMState pjvms(&kit);
+ // Generate intrinsic code:
+ JVMState* new_jvms = _intrinsic->generate(kit.sync_jvms());
+ if (new_jvms == NULL) {
+ // Intrinsic failed, use normal compilation path for this predicate.
+ slow_region->add_req(kit.control());
+ } else {
+ kit.add_exception_states_from(new_jvms);
+ kit.set_jvms(new_jvms);
+ if (!kit.stopped()) {
+ result_jvms[results++] = kit.jvms();
+ }
+ }
+ }
+ if (else_ctrl == NULL) {
+ else_ctrl = kit.C->top();
+ }
+ kit.set_control(else_ctrl);
+ }
+ if (!kit.stopped()) {
+ // Final 'else' after predicates.
+ slow_region->add_req(kit.control());
+ }
+ if (slow_region->req() > 1) {
+ PreserveJVMState pjvms(&kit);
+ // Generate normal compilation code:
+ kit.set_control(gvn.transform(slow_region));
+ JVMState* new_jvms = _cg->generate(kit.sync_jvms());
+ if (kit.failing())
+ return NULL; // might happen because of NodeCountInliningCutoff
+ assert(new_jvms != NULL, "must be");
+ kit.add_exception_states_from(new_jvms);
+ kit.set_jvms(new_jvms);
+ if (!kit.stopped()) {
+ result_jvms[results++] = kit.jvms();
+ }
+ }
+
+ if (results == 0) {
+ // All paths ended in uncommon traps.
+ (void) kit.stop();
return kit.transfer_exceptions_into_jvms();
}
- if (kit.stopped()) {
- // Intrinsic method threw an exception, so it's just the slow path after all.
- kit.set_jvms(slow_jvms);
+ if (results == 1) { // Only one path
+ kit.set_jvms(result_jvms[0]);
return kit.transfer_exceptions_into_jvms();
}
- // Finish the diamond.
+ // Merge all paths.
kit.C->set_has_split_ifs(true); // Has chance for split-if optimization
- RegionNode* region = new RegionNode(3);
- region->init_req(1, kit.control());
- region->init_req(2, slow_map->control());
- kit.set_control(gvn.transform(region));
+ RegionNode* region = new RegionNode(results + 1);
Node* iophi = PhiNode::make(region, kit.i_o(), Type::ABIO);
- iophi->set_req(2, slow_map->i_o());
+ for (int i = 0; i < results; i++) {
+ JVMState* jvms = result_jvms[i];
+ int path = i + 1;
+ SafePointNode* map = jvms->map();
+ region->init_req(path, map->control());
+ iophi->set_req(path, map->i_o());
+ if (i == 0) {
+ kit.set_jvms(jvms);
+ } else {
+ kit.merge_memory(map->merged_memory(), region, path);
+ }
+ }
+ kit.set_control(gvn.transform(region));
kit.set_i_o(gvn.transform(iophi));
- kit.merge_memory(slow_map->merged_memory(), region, 2);
+ // Transform new memory Phis.
+ for (MergeMemStream mms(kit.merged_memory()); mms.next_non_empty();) {
+ Node* phi = mms.memory();
+ if (phi->is_Phi() && phi->in(0) == region) {
+ mms.set_memory(gvn.transform(phi));
+ }
+ }
+
+ // Merge debug info.
+ Node** ins = NEW_RESOURCE_ARRAY(Node*, results);
uint tos = kit.jvms()->stkoff() + kit.sp();
- uint limit = slow_map->req();
+ Node* map = kit.map();
+ uint limit = map->req();
for (uint i = TypeFunc::Parms; i < limit; i++) {
// Skip unused stack slots; fast forward to monoff();
if (i == tos) {
i = kit.jvms()->monoff();
if( i >= limit ) break;
}
- Node* m = kit.map()->in(i);
- Node* n = slow_map->in(i);
- if (m != n) {
- const Type* t = gvn.type(m)->meet_speculative(gvn.type(n));
- Node* phi = PhiNode::make(region, m, t);
- phi->set_req(2, n);
- kit.map()->set_req(i, gvn.transform(phi));
+ Node* n = map->in(i);
+ ins[0] = n;
+ const Type* t = gvn.type(n);
+ bool needs_phi = false;
+ for (int j = 1; j < results; j++) {
+ JVMState* jvms = result_jvms[j];
+ Node* jmap = jvms->map();
+ Node* m = NULL;
+ if (jmap->req() > i) {
+ m = jmap->in(i);
+ if (m != n) {
+ needs_phi = true;
+ t = t->meet_speculative(gvn.type(m));
+ }
+ }
+ ins[j] = m;
+ }
+ if (needs_phi) {
+ Node* phi = PhiNode::make(region, n, t);
+ for (int j = 1; j < results; j++) {
+ phi->set_req(j + 1, ins[j]);
+ }
+ map->set_req(i, gvn.transform(phi));
}
}
+
return kit.transfer_exceptions_into_jvms();
}
diff --git a/hotspot/src/share/vm/opto/callGenerator.hpp b/hotspot/src/share/vm/opto/callGenerator.hpp
index 129fe4a754c..238fba2ce4a 100644
--- a/hotspot/src/share/vm/opto/callGenerator.hpp
+++ b/hotspot/src/share/vm/opto/callGenerator.hpp
@@ -61,8 +61,9 @@ class CallGenerator : public ResourceObj {
virtual bool is_virtual() const { return false; }
// is_deferred: The decision whether to inline or not is deferred.
virtual bool is_deferred() const { return false; }
- // is_predicted: Uses an explicit check against a predicted type.
- virtual bool is_predicted() const { return false; }
+ // is_predicated: Uses an explicit check (predicate).
+ virtual bool is_predicated() const { return false; }
+ virtual int predicates_count() const { return 0; }
// is_trap: Does not return to the caller. (E.g., uncommon trap.)
virtual bool is_trap() const { return false; }
// does_virtual_dispatch: Should try inlining as normal method first.
@@ -158,9 +159,9 @@ class CallGenerator : public ResourceObj {
// Registry for intrinsics:
static CallGenerator* for_intrinsic(ciMethod* m);
static void register_intrinsic(ciMethod* m, CallGenerator* cg);
- static CallGenerator* for_predicted_intrinsic(CallGenerator* intrinsic,
- CallGenerator* cg);
- virtual Node* generate_predicate(JVMState* jvms) { return NULL; };
+ static CallGenerator* for_predicated_intrinsic(CallGenerator* intrinsic,
+ CallGenerator* cg);
+ virtual Node* generate_predicate(JVMState* jvms, int predicate) { return NULL; };
virtual void print_inlining_late(const char* msg) { ShouldNotReachHere(); }
diff --git a/hotspot/src/share/vm/opto/doCall.cpp b/hotspot/src/share/vm/opto/doCall.cpp
index 2a4a85fcd8e..72dc6b8a79c 100644
--- a/hotspot/src/share/vm/opto/doCall.cpp
+++ b/hotspot/src/share/vm/opto/doCall.cpp
@@ -119,12 +119,12 @@ CallGenerator* Compile::call_generator(ciMethod* callee, int vtable_index, bool
if (allow_inline && allow_intrinsics) {
CallGenerator* cg = find_intrinsic(callee, call_does_dispatch);
if (cg != NULL) {
- if (cg->is_predicted()) {
+ if (cg->is_predicated()) {
// Code without intrinsic but, hopefully, inlined.
CallGenerator* inline_cg = this->call_generator(callee,
vtable_index, call_does_dispatch, jvms, allow_inline, prof_factor, speculative_receiver_type, false);
if (inline_cg != NULL) {
- cg = CallGenerator::for_predicted_intrinsic(cg, inline_cg);
+ cg = CallGenerator::for_predicated_intrinsic(cg, inline_cg);
}
}
diff --git a/hotspot/src/share/vm/opto/graphKit.cpp b/hotspot/src/share/vm/opto/graphKit.cpp
index 6d0037f9b30..e7269aa514e 100644
--- a/hotspot/src/share/vm/opto/graphKit.cpp
+++ b/hotspot/src/share/vm/opto/graphKit.cpp
@@ -2464,23 +2464,24 @@ void GraphKit::merge_memory(Node* new_mem, Node* region, int new_path) {
Node* new_slice = mms.memory2();
if (old_slice != new_slice) {
PhiNode* phi;
- if (new_slice->is_Phi() && new_slice->as_Phi()->region() == region) {
- phi = new_slice->as_Phi();
- #ifdef ASSERT
- if (old_slice->is_Phi() && old_slice->as_Phi()->region() == region)
- old_slice = old_slice->in(new_path);
- // Caller is responsible for ensuring that any pre-existing
- // phis are already aware of old memory.
- int old_path = (new_path > 1) ? 1 : 2; // choose old_path != new_path
- assert(phi->in(old_path) == old_slice, "pre-existing phis OK");
- #endif
- mms.set_memory(phi);
+ if (old_slice->is_Phi() && old_slice->as_Phi()->region() == region) {
+ if (mms.is_empty()) {
+ // clone base memory Phi's inputs for this memory slice
+ assert(old_slice == mms.base_memory(), "sanity");
+ phi = PhiNode::make(region, NULL, Type::MEMORY, mms.adr_type(C));
+ _gvn.set_type(phi, Type::MEMORY);
+ for (uint i = 1; i < phi->req(); i++) {
+ phi->init_req(i, old_slice->in(i));
+ }
+ } else {
+ phi = old_slice->as_Phi(); // Phi was generated already
+ }
} else {
phi = PhiNode::make(region, old_slice, Type::MEMORY, mms.adr_type(C));
_gvn.set_type(phi, Type::MEMORY);
- phi->set_req(new_path, new_slice);
- mms.set_memory(_gvn.transform(phi)); // assume it is complete
}
+ phi->set_req(new_path, new_slice);
+ mms.set_memory(phi);
}
}
}
diff --git a/hotspot/src/share/vm/opto/library_call.cpp b/hotspot/src/share/vm/opto/library_call.cpp
index 1bbb986e469..fe9034cc46d 100644
--- a/hotspot/src/share/vm/opto/library_call.cpp
+++ b/hotspot/src/share/vm/opto/library_call.cpp
@@ -52,25 +52,28 @@ class LibraryIntrinsic : public InlineCallGenerator {
public:
private:
bool _is_virtual;
- bool _is_predicted;
bool _does_virtual_dispatch;
+ int8_t _predicates_count; // Intrinsic is predicated by several conditions
+ int8_t _last_predicate; // Last generated predicate
vmIntrinsics::ID _intrinsic_id;
public:
- LibraryIntrinsic(ciMethod* m, bool is_virtual, bool is_predicted, bool does_virtual_dispatch, vmIntrinsics::ID id)
+ LibraryIntrinsic(ciMethod* m, bool is_virtual, int predicates_count, bool does_virtual_dispatch, vmIntrinsics::ID id)
: InlineCallGenerator(m),
_is_virtual(is_virtual),
- _is_predicted(is_predicted),
_does_virtual_dispatch(does_virtual_dispatch),
+ _predicates_count((int8_t)predicates_count),
+ _last_predicate((int8_t)-1),
_intrinsic_id(id)
{
}
virtual bool is_intrinsic() const { return true; }
virtual bool is_virtual() const { return _is_virtual; }
- virtual bool is_predicted() const { return _is_predicted; }
+ virtual bool is_predicated() const { return _predicates_count > 0; }
+ virtual int predicates_count() const { return _predicates_count; }
virtual bool does_virtual_dispatch() const { return _does_virtual_dispatch; }
virtual JVMState* generate(JVMState* jvms);
- virtual Node* generate_predicate(JVMState* jvms);
+ virtual Node* generate_predicate(JVMState* jvms, int predicate);
vmIntrinsics::ID intrinsic_id() const { return _intrinsic_id; }
};
@@ -113,8 +116,8 @@ class LibraryCallKit : public GraphKit {
vmIntrinsics::ID intrinsic_id() const { return _intrinsic->intrinsic_id(); }
ciMethod* callee() const { return _intrinsic->method(); }
- bool try_to_inline();
- Node* try_to_predicate();
+ bool try_to_inline(int predicate);
+ Node* try_to_predicate(int predicate);
void push_result() {
// Push the result onto the stack.
@@ -373,7 +376,7 @@ CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) {
}
}
- bool is_predicted = false;
+ int predicates = 0;
bool does_virtual_dispatch = false;
switch (id) {
@@ -513,7 +516,7 @@ CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) {
case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt:
if (!UseAESIntrinsics) return NULL;
// these two require the predicated logic
- is_predicted = true;
+ predicates = 1;
break;
case vmIntrinsics::_updateCRC32:
@@ -582,7 +585,7 @@ CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) {
if (!InlineUnsafeOps) return NULL;
}
- return new LibraryIntrinsic(m, is_virtual, is_predicted, does_virtual_dispatch, (vmIntrinsics::ID) id);
+ return new LibraryIntrinsic(m, is_virtual, predicates, does_virtual_dispatch, (vmIntrinsics::ID) id);
}
//----------------------register_library_intrinsics-----------------------
@@ -606,7 +609,7 @@ JVMState* LibraryIntrinsic::generate(JVMState* jvms) {
const int bci = kit.bci();
// Try to inline the intrinsic.
- if (kit.try_to_inline()) {
+ if (kit.try_to_inline(_last_predicate)) {
if (C->print_intrinsics() || C->print_inlining()) {
C->print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual)" : "(intrinsic)");
}
@@ -641,12 +644,13 @@ JVMState* LibraryIntrinsic::generate(JVMState* jvms) {
return NULL;
}
-Node* LibraryIntrinsic::generate_predicate(JVMState* jvms) {
+Node* LibraryIntrinsic::generate_predicate(JVMState* jvms, int predicate) {
LibraryCallKit kit(jvms, this);
Compile* C = kit.C;
int nodes = C->unique();
+ _last_predicate = predicate;
#ifndef PRODUCT
- assert(is_predicted(), "sanity");
+ assert(is_predicated() && predicate < predicates_count(), "sanity");
if ((C->print_intrinsics() || C->print_inlining()) && Verbose) {
char buf[1000];
const char* str = vmIntrinsics::short_name_as_C_string(intrinsic_id(), buf, sizeof(buf));
@@ -656,10 +660,10 @@ Node* LibraryIntrinsic::generate_predicate(JVMState* jvms) {
ciMethod* callee = kit.callee();
const int bci = kit.bci();
- Node* slow_ctl = kit.try_to_predicate();
+ Node* slow_ctl = kit.try_to_predicate(predicate);
if (!kit.failing()) {
if (C->print_intrinsics() || C->print_inlining()) {
- C->print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual)" : "(intrinsic)");
+ C->print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual, predicate)" : "(intrinsic, predicate)");
}
C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_worked);
if (C->log()) {
@@ -688,7 +692,7 @@ Node* LibraryIntrinsic::generate_predicate(JVMState* jvms) {
return NULL;
}
-bool LibraryCallKit::try_to_inline() {
+bool LibraryCallKit::try_to_inline(int predicate) {
// Handle symbolic names for otherwise undistinguished boolean switches:
const bool is_store = true;
const bool is_native_ptr = true;
@@ -905,7 +909,7 @@ bool LibraryCallKit::try_to_inline() {
}
}
-Node* LibraryCallKit::try_to_predicate() {
+Node* LibraryCallKit::try_to_predicate(int predicate) {
if (!jvms()->has_method()) {
// Root JVMState has a null method.
assert(map()->memory()->Opcode() == Op_Parm, "");
@@ -5868,7 +5872,12 @@ Node * LibraryCallKit::load_field_from_object(Node * fromObj, const char * field
BasicType bt = field->layout_type();
// Build the resultant type of the load
- const Type *type = TypeOopPtr::make_from_klass(field_klass->as_klass());
+ const Type *type;
+ if (bt == T_OBJECT) {
+ type = TypeOopPtr::make_from_klass(field_klass->as_klass());
+ } else {
+ type = Type::get_const_basic_type(bt);
+ }
// Build the load.
Node* loadedField = make_load(NULL, adr, type, bt, adr_type, MemNode::unordered, is_vol);
@@ -5998,7 +6007,7 @@ bool LibraryCallKit::inline_cipherBlockChaining_AESCrypt(vmIntrinsics::ID id) {
assert(tinst != NULL, "CBC obj is null");
assert(tinst->klass()->is_loaded(), "CBC obj is not loaded");
ciKlass* klass_AESCrypt = tinst->klass()->as_instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt"));
- if (!klass_AESCrypt->is_loaded()) return false;
+ assert(klass_AESCrypt->is_loaded(), "predicate checks that this class is loaded");
ciInstanceKlass* instklass_AESCrypt = klass_AESCrypt->as_instance_klass();
const TypeKlassPtr* aklass = TypeKlassPtr::make(instklass_AESCrypt);
@@ -6073,11 +6082,8 @@ Node * LibraryCallKit::get_original_key_start_from_aescrypt_object(Node *aescryp
// note cipher==plain is more conservative than the original java code but that's OK
//
Node* LibraryCallKit::inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting) {
- // First, check receiver for NULL since it is virtual method.
+ // The receiver was checked for NULL already.
Node* objCBC = argument(0);
- objCBC = null_check(objCBC);
-
- if (stopped()) return NULL; // Always NULL
// Load embeddedCipher field of CipherBlockChaining object.
Node* embeddedCipherObj = load_field_from_object(objCBC, "embeddedCipher", "Lcom/sun/crypto/provider/SymmetricCipher;", /*is_exact*/ false);
From 83fc2acbd75efcadb61b33f9fe3851a0bca410a3 Mon Sep 17 00:00:00 2001
From: Tobias Hartmann
Date: Wed, 11 Jun 2014 09:16:19 +0200
Subject: [PATCH 26/76] 8044538: assert(which != imm_operand) failed:
instruction is not a movq reg, imm64
Fixed internal_word_Relocation::target() to not retrieve target address from code if relocation points into the constant section. Added test.
Reviewed-by: kvn, twisti, dlong
---
hotspot/src/share/vm/code/relocInfo.cpp | 12 +++---
.../relocations/TestPrintRelocations.java | 38 +++++++++++++++++++
2 files changed, 44 insertions(+), 6 deletions(-)
create mode 100644 hotspot/test/compiler/relocations/TestPrintRelocations.java
diff --git a/hotspot/src/share/vm/code/relocInfo.cpp b/hotspot/src/share/vm/code/relocInfo.cpp
index aa0ef6b106e..174a615deaf 100644
--- a/hotspot/src/share/vm/code/relocInfo.cpp
+++ b/hotspot/src/share/vm/code/relocInfo.cpp
@@ -877,11 +877,7 @@ address external_word_Relocation::target() {
void internal_word_Relocation::fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dest) {
address target = _target;
if (target == NULL) {
- if (addr_in_const()) {
- target = new_addr_for(*(address*)addr(), src, dest);
- } else {
- target = new_addr_for(pd_get_address_from_code(), src, dest);
- }
+ target = new_addr_for(this->target(), src, dest);
}
set_value(target);
}
@@ -890,7 +886,11 @@ void internal_word_Relocation::fix_relocation_after_move(const CodeBuffer* src,
address internal_word_Relocation::target() {
address target = _target;
if (target == NULL) {
- target = pd_get_address_from_code();
+ if (addr_in_const()) {
+ target = *(address*)addr();
+ } else {
+ target = pd_get_address_from_code();
+ }
}
return target;
}
diff --git a/hotspot/test/compiler/relocations/TestPrintRelocations.java b/hotspot/test/compiler/relocations/TestPrintRelocations.java
new file mode 100644
index 00000000000..2cfb038b83e
--- /dev/null
+++ b/hotspot/test/compiler/relocations/TestPrintRelocations.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8044538
+ * @summary assert hit while printing relocations for jump table entries
+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -Xcomp -XX:+PrintRelocations TestPrintRelocations
+ */
+
+/**
+ * The test compiles all methods (-Xcomp) and prints their relocation
+ * entries (-XX:+PrintRelocations) to make sure the printing works.
+ */
+public class TestPrintRelocations {
+
+ static public void main(String[] args) { }
+}
From f3cb0b79b830b8ca766d39197c80156d25240e8e Mon Sep 17 00:00:00 2001
From: Dmitry Fazunenko
Date: Wed, 11 Jun 2014 18:56:01 +0400
Subject: [PATCH 27/76] 8044673: Create jtreg groups to list GC specific tests
Reviewed-by: dholmes, iignatyev
---
hotspot/test/TEST.groups | 108 +++++++++++++++++++++++++++++++++++++++
1 file changed, 108 insertions(+)
diff --git a/hotspot/test/TEST.groups b/hotspot/test/TEST.groups
index eb64ab57fe1..22ff9c82228 100644
--- a/hotspot/test/TEST.groups
+++ b/hotspot/test/TEST.groups
@@ -217,3 +217,111 @@ compact1_minimal = \
-:needs_compact3 \
-:needs_jre \
-:needs_jdk
+
+# All tests that explicitly set the G1 GC
+#
+needs_g1gc = \
+ compiler/regalloc/C1ObjectSpillInLogicOp.java \
+ gc/8000311/Test8000311.java \
+ gc/TestG1ZeroPGCTJcmdThreadPrint.java \
+ gc/TestSystemGC.java \
+ gc/arguments/TestAlignmentToUseLargePages.java \
+ gc/arguments/TestG1HeapRegionSize.java \
+ gc/arguments/TestG1HeapSizeFlags.java \
+ gc/arguments/TestMaxHeapSizeTools.java \
+ gc/arguments/TestMaxNewSize.java \
+ gc/arguments/TestUseCompressedOopsErgo.java \
+ gc/g1/ \
+ gc/metaspace/G1AddMetaspaceDependency.java \
+ gc/metaspace/TestMetaspacePerfCounters.java \
+ gc/startup_warnings/TestG1.java
+
+# All tests that explicitly set the serial GC
+#
+needs_serialgc = \
+ gc/TestSystemGC.java \
+ gc/arguments/TestAlignmentToUseLargePages.java \
+ gc/arguments/TestMaxNewSize.java \
+ gc/arguments/TestSerialHeapSizeFlags.java \
+ gc/arguments/TestUseCompressedOopsErgo.java \
+ gc/defnew/HeapChangeLogging.java \
+ gc/metaspace/TestMetaspacePerfCounters.java \
+ gc/metaspace/TestPerfCountersAndMemoryPools.java \
+ gc/startup_warnings/TestSerialGC.java
+
+# All tests that explicitly set the parallel GC
+#
+needs_parallelgc = \
+ gc/TestSystemGC.java \
+ gc/arguments/TestAlignmentToUseLargePages.java \
+ gc/arguments/TestMaxNewSize.java \
+ gc/arguments/TestMinInitialErgonomics.java \
+ gc/arguments/TestUseCompressedOopsErgo.java \
+ gc/metaspace/TestMetaspacePerfCounters.java \
+ gc/parallelScavenge/ \
+ gc/startup_warnings/TestParallelGC.java \
+ gc/startup_warnings/TestParallelScavengeSerialOld.java
+
+# All tests that explicitly set the CMS GC
+#
+needs_cmsgc = \
+ gc/6581734/Test6581734.java \
+ gc/TestSystemGC.java \
+ gc/arguments/TestAlignmentToUseLargePages.java \
+ gc/arguments/TestCMSHeapSizeFlags.java \
+ gc/arguments/TestMaxNewSize.java \
+ gc/arguments/TestUseCompressedOopsErgo.java \
+ gc/concurrentMarkSweep/ \
+ gc/startup_warnings/TestCMS.java \
+ gc/startup_warnings/TestCMSIncrementalMode.java \
+ gc/startup_warnings/TestCMSNoIncrementalMode.java \
+ gc/startup_warnings/TestDefNewCMS.java \
+ gc/startup_warnings/TestParNewCMS.java
+
+# All tests that explicitly set some GC
+#
+needs_gc = \
+ :needs_g1gc \
+ :needs_serialgc \
+ :needs_parallelgc \
+ :needs_cmsgc
+
+# All tests that do not set any GC explicitly
+#
+not_needs_gc = \
+ :jdk \
+ -:needs_gc
+
+# All tests that could be executed with the G1 GC without VM flags conflict
+#
+applicable_g1gc = \
+ :jdk \
+ -:needs_serialgc \
+ -:needs_parallelgc \
+ -:needs_cmsgc
+
+# All tests that could be executed with the serial GC without VM flags conflict
+#
+applicable_serialgc = \
+ :jdk \
+ -:needs_g1gc \
+ -:needs_parallelgc \
+ -:needs_cmsgc
+
+# All tests that could be executed with the parallel GC without VM flags conflict
+#
+applicable_parallelgc = \
+ :jdk \
+ -:needs_g1gc \
+ -:needs_serialgc \
+ -:needs_cmsgc
+
+# All tests that could be executed with the CMS GC without VM flags conflict
+#
+applicable_cmsgc = \
+ :jdk \
+ -:needs_g1gc \
+ -:needs_serialgc \
+ -:needs_parallelgc
+
+
From 395560c42846f8e0ca1a8699e2b6157d706fcadd Mon Sep 17 00:00:00 2001
From: James Cheng
Date: Wed, 11 Jun 2014 11:05:10 -0700
Subject: [PATCH 28/76] 8035968: Leverage CPU Instructions to Improve SHA
Performance on SPARC
Add C2 SHA intrinsics on SPARC
Reviewed-by: kvn, roland
---
hotspot/src/cpu/sparc/vm/assembler_sparc.hpp | 19 +-
.../src/cpu/sparc/vm/stubGenerator_sparc.cpp | 227 ++++++++++++++
.../src/cpu/sparc/vm/stubRoutines_sparc.hpp | 2 +-
hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp | 57 +++-
hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp | 13 +-
hotspot/src/cpu/x86/vm/vm_version_x86.cpp | 11 +
.../vm/vm_version_solaris_sparc.cpp | 17 +-
hotspot/src/share/vm/classfile/vmSymbols.hpp | 20 ++
hotspot/src/share/vm/opto/escape.cpp | 10 +-
hotspot/src/share/vm/opto/library_call.cpp | 290 ++++++++++++++++++
hotspot/src/share/vm/opto/runtime.cpp | 44 +++
hotspot/src/share/vm/opto/runtime.hpp | 5 +-
hotspot/src/share/vm/runtime/globals.hpp | 12 +
hotspot/src/share/vm/runtime/stubRoutines.cpp | 9 +-
hotspot/src/share/vm/runtime/stubRoutines.hpp | 16 +-
.../test/compiler/intrinsics/sha/TestSHA.java | 141 +++++++++
16 files changed, 881 insertions(+), 12 deletions(-)
create mode 100644 hotspot/test/compiler/intrinsics/sha/TestSHA.java
diff --git a/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp b/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp
index db7ff9eca81..dd83b092f75 100644
--- a/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp
+++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp
@@ -123,6 +123,7 @@ class Assembler : public AbstractAssembler {
fpop2_op3 = 0x35,
impdep1_op3 = 0x36,
aes3_op3 = 0x36,
+ sha_op3 = 0x36,
alignaddr_op3 = 0x36,
faligndata_op3 = 0x36,
flog3_op3 = 0x36,
@@ -223,7 +224,11 @@ class Assembler : public AbstractAssembler {
mwtos_opf = 0x119,
aes_kexpand0_opf = 0x130,
- aes_kexpand2_opf = 0x131
+ aes_kexpand2_opf = 0x131,
+
+ sha1_opf = 0x141,
+ sha256_opf = 0x142,
+ sha512_opf = 0x143
};
enum op5s {
@@ -595,6 +600,11 @@ class Assembler : public AbstractAssembler {
// AES crypto instructions supported only on certain processors
static void aes_only() { assert( VM_Version::has_aes(), "This instruction only works on SPARC with AES instructions support"); }
+ // SHA crypto instructions supported only on certain processors
+ static void sha1_only() { assert( VM_Version::has_sha1(), "This instruction only works on SPARC with SHA1"); }
+ static void sha256_only() { assert( VM_Version::has_sha256(), "This instruction only works on SPARC with SHA256"); }
+ static void sha512_only() { assert( VM_Version::has_sha512(), "This instruction only works on SPARC with SHA512"); }
+
// instruction only in VIS1
static void vis1_only() { assert( VM_Version::has_vis1(), "This instruction only works on SPARC with VIS1"); }
@@ -1179,7 +1189,6 @@ public:
u_field(3, 29, 25) | immed(true) | simm(simm13a, 13)); }
inline void wrfprs( Register d) { v9_only(); emit_int32( op(arith_op) | rs1(d) | op3(wrreg_op3) | u_field(6, 29, 25)); }
-
// VIS1 instructions
void alignaddr( Register s1, Register s2, Register d ) { vis1_only(); emit_int32( op(arith_op) | rd(d) | op3(alignaddr_op3) | rs1(s1) | opf(alignaddr_opf) | rs2(s2)); }
@@ -1203,6 +1212,12 @@ public:
void movwtos( Register s, FloatRegister d ) { vis3_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::S) | op3(mftoi_op3) | opf(mwtos_opf) | rs2(s)); }
void movxtod( Register s, FloatRegister d ) { vis3_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(mftoi_op3) | opf(mxtod_opf) | rs2(s)); }
+ // Crypto SHA instructions
+
+ void sha1() { sha1_only(); emit_int32( op(arith_op) | op3(sha_op3) | opf(sha1_opf)); }
+ void sha256() { sha256_only(); emit_int32( op(arith_op) | op3(sha_op3) | opf(sha256_opf)); }
+ void sha512() { sha512_only(); emit_int32( op(arith_op) | op3(sha_op3) | opf(sha512_opf)); }
+
// Creation
Assembler(CodeBuffer* code) : AbstractAssembler(code) {
#ifdef CHECK_DELAY
diff --git a/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp b/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp
index 231d1f7d932..e4cc113c2e2 100644
--- a/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp
+++ b/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp
@@ -4575,6 +4575,219 @@ class StubGenerator: public StubCodeGenerator {
return start;
}
+ address generate_sha1_implCompress(bool multi_block, const char *name) {
+ __ align(CodeEntryAlignment);
+ StubCodeMark mark(this, "StubRoutines", name);
+ address start = __ pc();
+
+ Label L_sha1_loop, L_sha1_unaligned_input, L_sha1_unaligned_input_loop;
+ int i;
+
+ Register buf = O0; // byte[] source+offset
+ Register state = O1; // int[] SHA.state
+ Register ofs = O2; // int offset
+ Register limit = O3; // int limit
+
+ // load state into F0-F4
+ for (i = 0; i < 5; i++) {
+ __ ldf(FloatRegisterImpl::S, state, i*4, as_FloatRegister(i));
+ }
+
+ __ andcc(buf, 7, G0);
+ __ br(Assembler::notZero, false, Assembler::pn, L_sha1_unaligned_input);
+ __ delayed()->nop();
+
+ __ BIND(L_sha1_loop);
+ // load buf into F8-F22
+ for (i = 0; i < 8; i++) {
+ __ ldf(FloatRegisterImpl::D, buf, i*8, as_FloatRegister(i*2 + 8));
+ }
+ __ sha1();
+ if (multi_block) {
+ __ add(ofs, 64, ofs);
+ __ add(buf, 64, buf);
+ __ cmp_and_brx_short(ofs, limit, Assembler::lessEqual, Assembler::pt, L_sha1_loop);
+ __ mov(ofs, O0); // to be returned
+ }
+
+ // store F0-F4 into state and return
+ for (i = 0; i < 4; i++) {
+ __ stf(FloatRegisterImpl::S, as_FloatRegister(i), state, i*4);
+ }
+ __ retl();
+ __ delayed()->stf(FloatRegisterImpl::S, F4, state, 0x10);
+
+ __ BIND(L_sha1_unaligned_input);
+ __ alignaddr(buf, G0, buf);
+
+ __ BIND(L_sha1_unaligned_input_loop);
+ // load buf into F8-F22
+ for (i = 0; i < 9; i++) {
+ __ ldf(FloatRegisterImpl::D, buf, i*8, as_FloatRegister(i*2 + 8));
+ }
+ for (i = 0; i < 8; i++) {
+ __ faligndata(as_FloatRegister(i*2 + 8), as_FloatRegister(i*2 + 10), as_FloatRegister(i*2 + 8));
+ }
+ __ sha1();
+ if (multi_block) {
+ __ add(ofs, 64, ofs);
+ __ add(buf, 64, buf);
+ __ cmp_and_brx_short(ofs, limit, Assembler::lessEqual, Assembler::pt, L_sha1_unaligned_input_loop);
+ __ mov(ofs, O0); // to be returned
+ }
+
+ // store F0-F4 into state and return
+ for (i = 0; i < 4; i++) {
+ __ stf(FloatRegisterImpl::S, as_FloatRegister(i), state, i*4);
+ }
+ __ retl();
+ __ delayed()->stf(FloatRegisterImpl::S, F4, state, 0x10);
+
+ return start;
+ }
+
+ address generate_sha256_implCompress(bool multi_block, const char *name) {
+ __ align(CodeEntryAlignment);
+ StubCodeMark mark(this, "StubRoutines", name);
+ address start = __ pc();
+
+ Label L_sha256_loop, L_sha256_unaligned_input, L_sha256_unaligned_input_loop;
+ int i;
+
+ Register buf = O0; // byte[] source+offset
+ Register state = O1; // int[] SHA2.state
+ Register ofs = O2; // int offset
+ Register limit = O3; // int limit
+
+ // load state into F0-F7
+ for (i = 0; i < 8; i++) {
+ __ ldf(FloatRegisterImpl::S, state, i*4, as_FloatRegister(i));
+ }
+
+ __ andcc(buf, 7, G0);
+ __ br(Assembler::notZero, false, Assembler::pn, L_sha256_unaligned_input);
+ __ delayed()->nop();
+
+ __ BIND(L_sha256_loop);
+ // load buf into F8-F22
+ for (i = 0; i < 8; i++) {
+ __ ldf(FloatRegisterImpl::D, buf, i*8, as_FloatRegister(i*2 + 8));
+ }
+ __ sha256();
+ if (multi_block) {
+ __ add(ofs, 64, ofs);
+ __ add(buf, 64, buf);
+ __ cmp_and_brx_short(ofs, limit, Assembler::lessEqual, Assembler::pt, L_sha256_loop);
+ __ mov(ofs, O0); // to be returned
+ }
+
+ // store F0-F7 into state and return
+ for (i = 0; i < 7; i++) {
+ __ stf(FloatRegisterImpl::S, as_FloatRegister(i), state, i*4);
+ }
+ __ retl();
+ __ delayed()->stf(FloatRegisterImpl::S, F7, state, 0x1c);
+
+ __ BIND(L_sha256_unaligned_input);
+ __ alignaddr(buf, G0, buf);
+
+ __ BIND(L_sha256_unaligned_input_loop);
+ // load buf into F8-F22
+ for (i = 0; i < 9; i++) {
+ __ ldf(FloatRegisterImpl::D, buf, i*8, as_FloatRegister(i*2 + 8));
+ }
+ for (i = 0; i < 8; i++) {
+ __ faligndata(as_FloatRegister(i*2 + 8), as_FloatRegister(i*2 + 10), as_FloatRegister(i*2 + 8));
+ }
+ __ sha256();
+ if (multi_block) {
+ __ add(ofs, 64, ofs);
+ __ add(buf, 64, buf);
+ __ cmp_and_brx_short(ofs, limit, Assembler::lessEqual, Assembler::pt, L_sha256_unaligned_input_loop);
+ __ mov(ofs, O0); // to be returned
+ }
+
+ // store F0-F7 into state and return
+ for (i = 0; i < 7; i++) {
+ __ stf(FloatRegisterImpl::S, as_FloatRegister(i), state, i*4);
+ }
+ __ retl();
+ __ delayed()->stf(FloatRegisterImpl::S, F7, state, 0x1c);
+
+ return start;
+ }
+
+ address generate_sha512_implCompress(bool multi_block, const char *name) {
+ __ align(CodeEntryAlignment);
+ StubCodeMark mark(this, "StubRoutines", name);
+ address start = __ pc();
+
+ Label L_sha512_loop, L_sha512_unaligned_input, L_sha512_unaligned_input_loop;
+ int i;
+
+ Register buf = O0; // byte[] source+offset
+ Register state = O1; // long[] SHA5.state
+ Register ofs = O2; // int offset
+ Register limit = O3; // int limit
+
+ // load state into F0-F14
+ for (i = 0; i < 8; i++) {
+ __ ldf(FloatRegisterImpl::D, state, i*8, as_FloatRegister(i*2));
+ }
+
+ __ andcc(buf, 7, G0);
+ __ br(Assembler::notZero, false, Assembler::pn, L_sha512_unaligned_input);
+ __ delayed()->nop();
+
+ __ BIND(L_sha512_loop);
+ // load buf into F16-F46
+ for (i = 0; i < 16; i++) {
+ __ ldf(FloatRegisterImpl::D, buf, i*8, as_FloatRegister(i*2 + 16));
+ }
+ __ sha512();
+ if (multi_block) {
+ __ add(ofs, 128, ofs);
+ __ add(buf, 128, buf);
+ __ cmp_and_brx_short(ofs, limit, Assembler::lessEqual, Assembler::pt, L_sha512_loop);
+ __ mov(ofs, O0); // to be returned
+ }
+
+ // store F0-F14 into state and return
+ for (i = 0; i < 7; i++) {
+ __ stf(FloatRegisterImpl::D, as_FloatRegister(i*2), state, i*8);
+ }
+ __ retl();
+ __ delayed()->stf(FloatRegisterImpl::D, F14, state, 0x38);
+
+ __ BIND(L_sha512_unaligned_input);
+ __ alignaddr(buf, G0, buf);
+
+ __ BIND(L_sha512_unaligned_input_loop);
+ // load buf into F16-F46
+ for (i = 0; i < 17; i++) {
+ __ ldf(FloatRegisterImpl::D, buf, i*8, as_FloatRegister(i*2 + 16));
+ }
+ for (i = 0; i < 16; i++) {
+ __ faligndata(as_FloatRegister(i*2 + 16), as_FloatRegister(i*2 + 18), as_FloatRegister(i*2 + 16));
+ }
+ __ sha512();
+ if (multi_block) {
+ __ add(ofs, 128, ofs);
+ __ add(buf, 128, buf);
+ __ cmp_and_brx_short(ofs, limit, Assembler::lessEqual, Assembler::pt, L_sha512_unaligned_input_loop);
+ __ mov(ofs, O0); // to be returned
+ }
+
+ // store F0-F14 into state and return
+ for (i = 0; i < 7; i++) {
+ __ stf(FloatRegisterImpl::D, as_FloatRegister(i*2), state, i*8);
+ }
+ __ retl();
+ __ delayed()->stf(FloatRegisterImpl::D, F14, state, 0x38);
+
+ return start;
+ }
+
void generate_initial() {
// Generates all stubs and initializes the entry points
@@ -4647,6 +4860,20 @@ class StubGenerator: public StubCodeGenerator {
StubRoutines::_cipherBlockChaining_encryptAESCrypt = generate_cipherBlockChaining_encryptAESCrypt();
StubRoutines::_cipherBlockChaining_decryptAESCrypt = generate_cipherBlockChaining_decryptAESCrypt_Parallel();
}
+
+ // generate SHA1/SHA256/SHA512 intrinsics code
+ if (UseSHA1Intrinsics) {
+ StubRoutines::_sha1_implCompress = generate_sha1_implCompress(false, "sha1_implCompress");
+ StubRoutines::_sha1_implCompressMB = generate_sha1_implCompress(true, "sha1_implCompressMB");
+ }
+ if (UseSHA256Intrinsics) {
+ StubRoutines::_sha256_implCompress = generate_sha256_implCompress(false, "sha256_implCompress");
+ StubRoutines::_sha256_implCompressMB = generate_sha256_implCompress(true, "sha256_implCompressMB");
+ }
+ if (UseSHA512Intrinsics) {
+ StubRoutines::_sha512_implCompress = generate_sha512_implCompress(false, "sha512_implCompress");
+ StubRoutines::_sha512_implCompressMB = generate_sha512_implCompress(true, "sha512_implCompressMB");
+ }
}
diff --git a/hotspot/src/cpu/sparc/vm/stubRoutines_sparc.hpp b/hotspot/src/cpu/sparc/vm/stubRoutines_sparc.hpp
index 880a0261996..f3b30e884c3 100644
--- a/hotspot/src/cpu/sparc/vm/stubRoutines_sparc.hpp
+++ b/hotspot/src/cpu/sparc/vm/stubRoutines_sparc.hpp
@@ -41,7 +41,7 @@ static bool returns_to_call_stub(address return_pc) {
enum /* platform_dependent_constants */ {
// %%%%%%%% May be able to shrink this a lot
code_size1 = 20000, // simply increase if too small (assembler will crash if too small)
- code_size2 = 22000 // simply increase if too small (assembler will crash if too small)
+ code_size2 = 23000 // simply increase if too small (assembler will crash if too small)
};
class Sparc {
diff --git a/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp b/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp
index 1943705a558..841068b6072 100644
--- a/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp
+++ b/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp
@@ -234,7 +234,7 @@ void VM_Version::initialize() {
assert((OptoLoopAlignment % relocInfo::addr_unit()) == 0, "alignment is not a multiple of NOP size");
char buf[512];
- jio_snprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
+ jio_snprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
(has_v9() ? ", v9" : (has_v8() ? ", v8" : "")),
(has_hardware_popc() ? ", popc" : ""),
(has_vis1() ? ", vis1" : ""),
@@ -243,6 +243,9 @@ void VM_Version::initialize() {
(has_blk_init() ? ", blk_init" : ""),
(has_cbcond() ? ", cbcond" : ""),
(has_aes() ? ", aes" : ""),
+ (has_sha1() ? ", sha1" : ""),
+ (has_sha256() ? ", sha256" : ""),
+ (has_sha512() ? ", sha512" : ""),
(is_ultra3() ? ", ultra3" : ""),
(is_sun4v() ? ", sun4v" : ""),
(is_niagara_plus() ? ", niagara_plus" : (is_niagara() ? ", niagara" : "")),
@@ -301,6 +304,58 @@ void VM_Version::initialize() {
}
}
+ // SHA1, SHA256, and SHA512 instructions were added to SPARC T-series at different times
+ if (has_sha1() || has_sha256() || has_sha512()) {
+ if (UseVIS > 0) { // SHA intrinsics use VIS1 instructions
+ if (FLAG_IS_DEFAULT(UseSHA)) {
+ FLAG_SET_DEFAULT(UseSHA, true);
+ }
+ } else {
+ if (UseSHA) {
+ warning("SPARC SHA intrinsics require VIS1 instruction support. Intrinsics will be disabled.");
+ FLAG_SET_DEFAULT(UseSHA, false);
+ }
+ }
+ } else if (UseSHA) {
+ warning("SHA instructions are not available on this CPU");
+ FLAG_SET_DEFAULT(UseSHA, false);
+ }
+
+ if (!UseSHA) {
+ FLAG_SET_DEFAULT(UseSHA1Intrinsics, false);
+ FLAG_SET_DEFAULT(UseSHA256Intrinsics, false);
+ FLAG_SET_DEFAULT(UseSHA512Intrinsics, false);
+ } else {
+ if (has_sha1()) {
+ if (FLAG_IS_DEFAULT(UseSHA1Intrinsics)) {
+ FLAG_SET_DEFAULT(UseSHA1Intrinsics, true);
+ }
+ } else if (UseSHA1Intrinsics) {
+ warning("SHA1 instruction is not available on this CPU.");
+ FLAG_SET_DEFAULT(UseSHA1Intrinsics, false);
+ }
+ if (has_sha256()) {
+ if (FLAG_IS_DEFAULT(UseSHA256Intrinsics)) {
+ FLAG_SET_DEFAULT(UseSHA256Intrinsics, true);
+ }
+ } else if (UseSHA256Intrinsics) {
+ warning("SHA256 instruction (for SHA-224 and SHA-256) is not available on this CPU.");
+ FLAG_SET_DEFAULT(UseSHA256Intrinsics, false);
+ }
+
+ if (has_sha512()) {
+ if (FLAG_IS_DEFAULT(UseSHA512Intrinsics)) {
+ FLAG_SET_DEFAULT(UseSHA512Intrinsics, true);
+ }
+ } else if (UseSHA512Intrinsics) {
+ warning("SHA512 instruction (for SHA-384 and SHA-512) is not available on this CPU.");
+ FLAG_SET_DEFAULT(UseSHA512Intrinsics, false);
+ }
+ if (!(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics)) {
+ FLAG_SET_DEFAULT(UseSHA, false);
+ }
+ }
+
if (FLAG_IS_DEFAULT(ContendedPaddingWidth) &&
(cache_line_size > ContendedPaddingWidth))
ContendedPaddingWidth = cache_line_size;
diff --git a/hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp b/hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp
index eafb4856280..b20f8a69992 100644
--- a/hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp
+++ b/hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -50,7 +50,10 @@ protected:
T_family = 16,
T1_model = 17,
sparc5_instructions = 18,
- aes_instructions = 19
+ aes_instructions = 19,
+ sha1_instruction = 20,
+ sha256_instruction = 21,
+ sha512_instruction = 22
};
enum Feature_Flag_Set {
@@ -77,6 +80,9 @@ protected:
T1_model_m = 1 << T1_model,
sparc5_instructions_m = 1 << sparc5_instructions,
aes_instructions_m = 1 << aes_instructions,
+ sha1_instruction_m = 1 << sha1_instruction,
+ sha256_instruction_m = 1 << sha256_instruction,
+ sha512_instruction_m = 1 << sha512_instruction,
generic_v8_m = v8_instructions_m | hardware_mul32_m | hardware_div32_m | hardware_fsmuld_m,
generic_v9_m = generic_v8_m | v9_instructions_m,
@@ -129,6 +135,9 @@ public:
static bool has_cbcond() { return (_features & cbcond_instructions_m) != 0; }
static bool has_sparc5_instr() { return (_features & sparc5_instructions_m) != 0; }
static bool has_aes() { return (_features & aes_instructions_m) != 0; }
+ static bool has_sha1() { return (_features & sha1_instruction_m) != 0; }
+ static bool has_sha256() { return (_features & sha256_instruction_m) != 0; }
+ static bool has_sha512() { return (_features & sha512_instruction_m) != 0; }
static bool supports_compare_and_exchange()
{ return has_v9(); }
diff --git a/hotspot/src/cpu/x86/vm/vm_version_x86.cpp b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp
index e09dba38b0d..4dd8f8cb935 100644
--- a/hotspot/src/cpu/x86/vm/vm_version_x86.cpp
+++ b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp
@@ -590,6 +590,17 @@ void VM_Version::get_processor_features() {
FLAG_SET_DEFAULT(UseAESIntrinsics, false);
}
+ if (UseSHA) {
+ warning("SHA instructions are not available on this CPU");
+ FLAG_SET_DEFAULT(UseSHA, false);
+ }
+ if (UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics) {
+ warning("SHA intrinsics are not available on this CPU");
+ FLAG_SET_DEFAULT(UseSHA1Intrinsics, false);
+ FLAG_SET_DEFAULT(UseSHA256Intrinsics, false);
+ FLAG_SET_DEFAULT(UseSHA512Intrinsics, false);
+ }
+
// Adjust RTM (Restricted Transactional Memory) flags
if (!supports_rtm() && UseRTMLocking) {
// Can't continue because UseRTMLocking affects UseBiasedLocking flag
diff --git a/hotspot/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp b/hotspot/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp
index b6639c90b14..028e33f37d4 100644
--- a/hotspot/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp
+++ b/hotspot/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -137,6 +137,21 @@ int VM_Version::platform_features(int features) {
#endif
if (av & AV_SPARC_AES) features |= aes_instructions_m;
+#ifndef AV_SPARC_SHA1
+#define AV_SPARC_SHA1 0x00400000 /* sha1 instruction supported */
+#endif
+ if (av & AV_SPARC_SHA1) features |= sha1_instruction_m;
+
+#ifndef AV_SPARC_SHA256
+#define AV_SPARC_SHA256 0x00800000 /* sha256 instruction supported */
+#endif
+ if (av & AV_SPARC_SHA256) features |= sha256_instruction_m;
+
+#ifndef AV_SPARC_SHA512
+#define AV_SPARC_SHA512 0x01000000 /* sha512 instruction supported */
+#endif
+ if (av & AV_SPARC_SHA512) features |= sha512_instruction_m;
+
} else {
// getisax(2) failed, use the old legacy code.
#ifndef PRODUCT
diff --git a/hotspot/src/share/vm/classfile/vmSymbols.hpp b/hotspot/src/share/vm/classfile/vmSymbols.hpp
index 4d3ee6f08dd..e16a45d33ba 100644
--- a/hotspot/src/share/vm/classfile/vmSymbols.hpp
+++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp
@@ -790,6 +790,26 @@
do_name( decrypt_name, "decrypt") \
do_signature(byteArray_int_int_byteArray_int_signature, "([BII[BI)I") \
\
+ /* support for sun.security.provider.SHA */ \
+ do_class(sun_security_provider_sha, "sun/security/provider/SHA") \
+ do_intrinsic(_sha_implCompress, sun_security_provider_sha, implCompress_name, implCompress_signature, F_R) \
+ do_name( implCompress_name, "implCompress") \
+ do_signature(implCompress_signature, "([BI)V") \
+ \
+ /* support for sun.security.provider.SHA2 */ \
+ do_class(sun_security_provider_sha2, "sun/security/provider/SHA2") \
+ do_intrinsic(_sha2_implCompress, sun_security_provider_sha2, implCompress_name, implCompress_signature, F_R) \
+ \
+ /* support for sun.security.provider.SHA5 */ \
+ do_class(sun_security_provider_sha5, "sun/security/provider/SHA5") \
+ do_intrinsic(_sha5_implCompress, sun_security_provider_sha5, implCompress_name, implCompress_signature, F_R) \
+ \
+ /* support for sun.security.provider.DigestBase */ \
+ do_class(sun_security_provider_digestbase, "sun/security/provider/DigestBase") \
+ do_intrinsic(_digestBase_implCompressMB, sun_security_provider_digestbase, implCompressMB_name, implCompressMB_signature, F_R) \
+ do_name( implCompressMB_name, "implCompressMultiBlock") \
+ do_signature(implCompressMB_signature, "([BII)I") \
+ \
/* support for java.util.zip */ \
do_class(java_util_zip_CRC32, "java/util/zip/CRC32") \
do_intrinsic(_updateCRC32, java_util_zip_CRC32, update_name, int2_int_signature, F_SN) \
diff --git a/hotspot/src/share/vm/opto/escape.cpp b/hotspot/src/share/vm/opto/escape.cpp
index 883adef7c83..10791a5991d 100644
--- a/hotspot/src/share/vm/opto/escape.cpp
+++ b/hotspot/src/share/vm/opto/escape.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -939,7 +939,13 @@ void ConnectionGraph::process_call_arguments(CallNode *call) {
strcmp(call->as_CallLeaf()->_name, "aescrypt_encryptBlock") == 0 ||
strcmp(call->as_CallLeaf()->_name, "aescrypt_decryptBlock") == 0 ||
strcmp(call->as_CallLeaf()->_name, "cipherBlockChaining_encryptAESCrypt") == 0 ||
- strcmp(call->as_CallLeaf()->_name, "cipherBlockChaining_decryptAESCrypt") == 0)
+ strcmp(call->as_CallLeaf()->_name, "cipherBlockChaining_decryptAESCrypt") == 0 ||
+ strcmp(call->as_CallLeaf()->_name, "sha1_implCompress") == 0 ||
+ strcmp(call->as_CallLeaf()->_name, "sha1_implCompressMB") == 0 ||
+ strcmp(call->as_CallLeaf()->_name, "sha256_implCompress") == 0 ||
+ strcmp(call->as_CallLeaf()->_name, "sha256_implCompressMB") == 0 ||
+ strcmp(call->as_CallLeaf()->_name, "sha512_implCompress") == 0 ||
+ strcmp(call->as_CallLeaf()->_name, "sha512_implCompressMB") == 0)
))) {
call->dump();
fatal(err_msg_res("EA unexpected CallLeaf %s", call->as_CallLeaf()->_name));
diff --git a/hotspot/src/share/vm/opto/library_call.cpp b/hotspot/src/share/vm/opto/library_call.cpp
index fe9034cc46d..e0a09d27ff1 100644
--- a/hotspot/src/share/vm/opto/library_call.cpp
+++ b/hotspot/src/share/vm/opto/library_call.cpp
@@ -316,6 +316,14 @@ class LibraryCallKit : public GraphKit {
Node* inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting);
Node* get_key_start_from_aescrypt_object(Node* aescrypt_object);
Node* get_original_key_start_from_aescrypt_object(Node* aescrypt_object);
+ bool inline_sha_implCompress(vmIntrinsics::ID id);
+ bool inline_digestBase_implCompressMB(int predicate);
+ bool inline_sha_implCompressMB(Node* digestBaseObj, ciInstanceKlass* instklass_SHA,
+ bool long_state, address stubAddr, const char *stubName,
+ Node* src_start, Node* ofs, Node* limit);
+ Node* get_state_from_sha_object(Node *sha_object);
+ Node* get_state_from_sha5_object(Node *sha_object);
+ Node* inline_digestBase_implCompressMB_predicate(int predicate);
bool inline_encodeISOArray();
bool inline_updateCRC32();
bool inline_updateBytesCRC32();
@@ -519,6 +527,23 @@ CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) {
predicates = 1;
break;
+ case vmIntrinsics::_sha_implCompress:
+ if (!UseSHA1Intrinsics) return NULL;
+ break;
+
+ case vmIntrinsics::_sha2_implCompress:
+ if (!UseSHA256Intrinsics) return NULL;
+ break;
+
+ case vmIntrinsics::_sha5_implCompress:
+ if (!UseSHA512Intrinsics) return NULL;
+ break;
+
+ case vmIntrinsics::_digestBase_implCompressMB:
+ if (!(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics)) return NULL;
+ predicates = 3;
+ break;
+
case vmIntrinsics::_updateCRC32:
case vmIntrinsics::_updateBytesCRC32:
case vmIntrinsics::_updateByteBufferCRC32:
@@ -886,6 +911,14 @@ bool LibraryCallKit::try_to_inline(int predicate) {
case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt:
return inline_cipherBlockChaining_AESCrypt(intrinsic_id());
+ case vmIntrinsics::_sha_implCompress:
+ case vmIntrinsics::_sha2_implCompress:
+ case vmIntrinsics::_sha5_implCompress:
+ return inline_sha_implCompress(intrinsic_id());
+
+ case vmIntrinsics::_digestBase_implCompressMB:
+ return inline_digestBase_implCompressMB(predicate);
+
case vmIntrinsics::_encodeISOArray:
return inline_encodeISOArray();
@@ -923,6 +956,8 @@ Node* LibraryCallKit::try_to_predicate(int predicate) {
return inline_cipherBlockChaining_AESCrypt_predicate(false);
case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt:
return inline_cipherBlockChaining_AESCrypt_predicate(true);
+ case vmIntrinsics::_digestBase_implCompressMB:
+ return inline_digestBase_implCompressMB_predicate(predicate);
default:
// If you get here, it may be that someone has added a new intrinsic
@@ -6130,3 +6165,258 @@ Node* LibraryCallKit::inline_cipherBlockChaining_AESCrypt_predicate(bool decrypt
record_for_igvn(region);
return _gvn.transform(region);
}
+
+//------------------------------inline_sha_implCompress-----------------------
+//
+// Calculate SHA (i.e., SHA-1) for single-block byte[] array.
+// void com.sun.security.provider.SHA.implCompress(byte[] buf, int ofs)
+//
+// Calculate SHA2 (i.e., SHA-244 or SHA-256) for single-block byte[] array.
+// void com.sun.security.provider.SHA2.implCompress(byte[] buf, int ofs)
+//
+// Calculate SHA5 (i.e., SHA-384 or SHA-512) for single-block byte[] array.
+// void com.sun.security.provider.SHA5.implCompress(byte[] buf, int ofs)
+//
+bool LibraryCallKit::inline_sha_implCompress(vmIntrinsics::ID id) {
+ assert(callee()->signature()->size() == 2, "sha_implCompress has 2 parameters");
+
+ Node* sha_obj = argument(0);
+ Node* src = argument(1); // type oop
+ Node* ofs = argument(2); // type int
+
+ const Type* src_type = src->Value(&_gvn);
+ const TypeAryPtr* top_src = src_type->isa_aryptr();
+ if (top_src == NULL || top_src->klass() == NULL) {
+ // failed array check
+ return false;
+ }
+ // Figure out the size and type of the elements we will be copying.
+ BasicType src_elem = src_type->isa_aryptr()->klass()->as_array_klass()->element_type()->basic_type();
+ if (src_elem != T_BYTE) {
+ return false;
+ }
+ // 'src_start' points to src array + offset
+ Node* src_start = array_element_address(src, ofs, src_elem);
+ Node* state = NULL;
+ address stubAddr;
+ const char *stubName;
+
+ switch(id) {
+ case vmIntrinsics::_sha_implCompress:
+ assert(UseSHA1Intrinsics, "need SHA1 instruction support");
+ state = get_state_from_sha_object(sha_obj);
+ stubAddr = StubRoutines::sha1_implCompress();
+ stubName = "sha1_implCompress";
+ break;
+ case vmIntrinsics::_sha2_implCompress:
+ assert(UseSHA256Intrinsics, "need SHA256 instruction support");
+ state = get_state_from_sha_object(sha_obj);
+ stubAddr = StubRoutines::sha256_implCompress();
+ stubName = "sha256_implCompress";
+ break;
+ case vmIntrinsics::_sha5_implCompress:
+ assert(UseSHA512Intrinsics, "need SHA512 instruction support");
+ state = get_state_from_sha5_object(sha_obj);
+ stubAddr = StubRoutines::sha512_implCompress();
+ stubName = "sha512_implCompress";
+ break;
+ default:
+ fatal_unexpected_iid(id);
+ return false;
+ }
+ if (state == NULL) return false;
+
+ // Call the stub.
+ Node* call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::sha_implCompress_Type(),
+ stubAddr, stubName, TypePtr::BOTTOM,
+ src_start, state);
+
+ return true;
+}
+
+//------------------------------inline_digestBase_implCompressMB-----------------------
+//
+// Calculate SHA/SHA2/SHA5 for multi-block byte[] array.
+// int com.sun.security.provider.DigestBase.implCompressMultiBlock(byte[] b, int ofs, int limit)
+//
+bool LibraryCallKit::inline_digestBase_implCompressMB(int predicate) {
+ assert(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics,
+ "need SHA1/SHA256/SHA512 instruction support");
+ assert((uint)predicate < 3, "sanity");
+ assert(callee()->signature()->size() == 3, "digestBase_implCompressMB has 3 parameters");
+
+ Node* digestBase_obj = argument(0); // The receiver was checked for NULL already.
+ Node* src = argument(1); // byte[] array
+ Node* ofs = argument(2); // type int
+ Node* limit = argument(3); // type int
+
+ const Type* src_type = src->Value(&_gvn);
+ const TypeAryPtr* top_src = src_type->isa_aryptr();
+ if (top_src == NULL || top_src->klass() == NULL) {
+ // failed array check
+ return false;
+ }
+ // Figure out the size and type of the elements we will be copying.
+ BasicType src_elem = src_type->isa_aryptr()->klass()->as_array_klass()->element_type()->basic_type();
+ if (src_elem != T_BYTE) {
+ return false;
+ }
+ // 'src_start' points to src array + offset
+ Node* src_start = array_element_address(src, ofs, src_elem);
+
+ const char* klass_SHA_name = NULL;
+ const char* stub_name = NULL;
+ address stub_addr = NULL;
+ bool long_state = false;
+
+ switch (predicate) {
+ case 0:
+ if (UseSHA1Intrinsics) {
+ klass_SHA_name = "sun/security/provider/SHA";
+ stub_name = "sha1_implCompressMB";
+ stub_addr = StubRoutines::sha1_implCompressMB();
+ }
+ break;
+ case 1:
+ if (UseSHA256Intrinsics) {
+ klass_SHA_name = "sun/security/provider/SHA2";
+ stub_name = "sha256_implCompressMB";
+ stub_addr = StubRoutines::sha256_implCompressMB();
+ }
+ break;
+ case 2:
+ if (UseSHA512Intrinsics) {
+ klass_SHA_name = "sun/security/provider/SHA5";
+ stub_name = "sha512_implCompressMB";
+ stub_addr = StubRoutines::sha512_implCompressMB();
+ long_state = true;
+ }
+ break;
+ default:
+ fatal(err_msg_res("unknown SHA intrinsic predicate: %d", predicate));
+ }
+ if (klass_SHA_name != NULL) {
+ // get DigestBase klass to lookup for SHA klass
+ const TypeInstPtr* tinst = _gvn.type(digestBase_obj)->isa_instptr();
+ assert(tinst != NULL, "digestBase_obj is not instance???");
+ assert(tinst->klass()->is_loaded(), "DigestBase is not loaded");
+
+ ciKlass* klass_SHA = tinst->klass()->as_instance_klass()->find_klass(ciSymbol::make(klass_SHA_name));
+ assert(klass_SHA->is_loaded(), "predicate checks that this class is loaded");
+ ciInstanceKlass* instklass_SHA = klass_SHA->as_instance_klass();
+ return inline_sha_implCompressMB(digestBase_obj, instklass_SHA, long_state, stub_addr, stub_name, src_start, ofs, limit);
+ }
+ return false;
+}
+//------------------------------inline_sha_implCompressMB-----------------------
+bool LibraryCallKit::inline_sha_implCompressMB(Node* digestBase_obj, ciInstanceKlass* instklass_SHA,
+ bool long_state, address stubAddr, const char *stubName,
+ Node* src_start, Node* ofs, Node* limit) {
+ const TypeKlassPtr* aklass = TypeKlassPtr::make(instklass_SHA);
+ const TypeOopPtr* xtype = aklass->as_instance_type();
+ Node* sha_obj = new CheckCastPPNode(control(), digestBase_obj, xtype);
+ sha_obj = _gvn.transform(sha_obj);
+
+ Node* state;
+ if (long_state) {
+ state = get_state_from_sha5_object(sha_obj);
+ } else {
+ state = get_state_from_sha_object(sha_obj);
+ }
+ if (state == NULL) return false;
+
+ // Call the stub.
+ Node* call = make_runtime_call(RC_LEAF|RC_NO_FP,
+ OptoRuntime::digestBase_implCompressMB_Type(),
+ stubAddr, stubName, TypePtr::BOTTOM,
+ src_start, state, ofs, limit);
+ // return ofs (int)
+ Node* result = _gvn.transform(new ProjNode(call, TypeFunc::Parms));
+ set_result(result);
+
+ return true;
+}
+
+//------------------------------get_state_from_sha_object-----------------------
+Node * LibraryCallKit::get_state_from_sha_object(Node *sha_object) {
+ Node* sha_state = load_field_from_object(sha_object, "state", "[I", /*is_exact*/ false);
+ assert (sha_state != NULL, "wrong version of sun.security.provider.SHA/SHA2");
+ if (sha_state == NULL) return (Node *) NULL;
+
+ // now have the array, need to get the start address of the state array
+ Node* state = array_element_address(sha_state, intcon(0), T_INT);
+ return state;
+}
+
+//------------------------------get_state_from_sha5_object-----------------------
+Node * LibraryCallKit::get_state_from_sha5_object(Node *sha_object) {
+ Node* sha_state = load_field_from_object(sha_object, "state", "[J", /*is_exact*/ false);
+ assert (sha_state != NULL, "wrong version of sun.security.provider.SHA5");
+ if (sha_state == NULL) return (Node *) NULL;
+
+ // now have the array, need to get the start address of the state array
+ Node* state = array_element_address(sha_state, intcon(0), T_LONG);
+ return state;
+}
+
+//----------------------------inline_digestBase_implCompressMB_predicate----------------------------
+// Return node representing slow path of predicate check.
+// the pseudo code we want to emulate with this predicate is:
+// if (digestBaseObj instanceof SHA/SHA2/SHA5) do_intrinsic, else do_javapath
+//
+Node* LibraryCallKit::inline_digestBase_implCompressMB_predicate(int predicate) {
+ assert(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics,
+ "need SHA1/SHA256/SHA512 instruction support");
+ assert((uint)predicate < 3, "sanity");
+
+ // The receiver was checked for NULL already.
+ Node* digestBaseObj = argument(0);
+
+ // get DigestBase klass for instanceOf check
+ const TypeInstPtr* tinst = _gvn.type(digestBaseObj)->isa_instptr();
+ assert(tinst != NULL, "digestBaseObj is null");
+ assert(tinst->klass()->is_loaded(), "DigestBase is not loaded");
+
+ const char* klass_SHA_name = NULL;
+ switch (predicate) {
+ case 0:
+ if (UseSHA1Intrinsics) {
+ // we want to do an instanceof comparison against the SHA class
+ klass_SHA_name = "sun/security/provider/SHA";
+ }
+ break;
+ case 1:
+ if (UseSHA256Intrinsics) {
+ // we want to do an instanceof comparison against the SHA2 class
+ klass_SHA_name = "sun/security/provider/SHA2";
+ }
+ break;
+ case 2:
+ if (UseSHA512Intrinsics) {
+ // we want to do an instanceof comparison against the SHA5 class
+ klass_SHA_name = "sun/security/provider/SHA5";
+ }
+ break;
+ default:
+ fatal(err_msg_res("unknown SHA intrinsic predicate: %d", predicate));
+ }
+
+ ciKlass* klass_SHA = NULL;
+ if (klass_SHA_name != NULL) {
+ klass_SHA = tinst->klass()->as_instance_klass()->find_klass(ciSymbol::make(klass_SHA_name));
+ }
+ if ((klass_SHA == NULL) || !klass_SHA->is_loaded()) {
+ // if none of SHA/SHA2/SHA5 is loaded, we never take the intrinsic fast path
+ Node* ctrl = control();
+ set_control(top()); // no intrinsic path
+ return ctrl;
+ }
+ ciInstanceKlass* instklass_SHA = klass_SHA->as_instance_klass();
+
+ Node* instofSHA = gen_instanceof(digestBaseObj, makecon(TypeKlassPtr::make(instklass_SHA)));
+ Node* cmp_instof = _gvn.transform(new CmpINode(instofSHA, intcon(1)));
+ Node* bool_instof = _gvn.transform(new BoolNode(cmp_instof, BoolTest::ne));
+ Node* instof_false = generate_guard(bool_instof, NULL, PROB_MIN);
+
+ return instof_false; // even if it is NULL
+}
diff --git a/hotspot/src/share/vm/opto/runtime.cpp b/hotspot/src/share/vm/opto/runtime.cpp
index 1beaac7fd38..632a03f2304 100644
--- a/hotspot/src/share/vm/opto/runtime.cpp
+++ b/hotspot/src/share/vm/opto/runtime.cpp
@@ -896,6 +896,50 @@ const TypeFunc* OptoRuntime::cipherBlockChaining_aescrypt_Type() {
return TypeFunc::make(domain, range);
}
+/*
+ * void implCompress(byte[] buf, int ofs)
+ */
+const TypeFunc* OptoRuntime::sha_implCompress_Type() {
+ // create input type (domain)
+ int num_args = 2;
+ int argcnt = num_args;
+ const Type** fields = TypeTuple::fields(argcnt);
+ int argp = TypeFunc::Parms;
+ fields[argp++] = TypePtr::NOTNULL; // buf
+ fields[argp++] = TypePtr::NOTNULL; // state
+ assert(argp == TypeFunc::Parms+argcnt, "correct decoding");
+ const TypeTuple* domain = TypeTuple::make(TypeFunc::Parms+argcnt, fields);
+
+ // no result type needed
+ fields = TypeTuple::fields(1);
+ fields[TypeFunc::Parms+0] = NULL; // void
+ const TypeTuple* range = TypeTuple::make(TypeFunc::Parms, fields);
+ return TypeFunc::make(domain, range);
+}
+
+/*
+ * int implCompressMultiBlock(byte[] b, int ofs, int limit)
+ */
+const TypeFunc* OptoRuntime::digestBase_implCompressMB_Type() {
+ // create input type (domain)
+ int num_args = 4;
+ int argcnt = num_args;
+ const Type** fields = TypeTuple::fields(argcnt);
+ int argp = TypeFunc::Parms;
+ fields[argp++] = TypePtr::NOTNULL; // buf
+ fields[argp++] = TypePtr::NOTNULL; // state
+ fields[argp++] = TypeInt::INT; // ofs
+ fields[argp++] = TypeInt::INT; // limit
+ assert(argp == TypeFunc::Parms+argcnt, "correct decoding");
+ const TypeTuple* domain = TypeTuple::make(TypeFunc::Parms+argcnt, fields);
+
+ // returning ofs (int)
+ fields = TypeTuple::fields(1);
+ fields[TypeFunc::Parms+0] = TypeInt::INT; // ofs
+ const TypeTuple* range = TypeTuple::make(TypeFunc::Parms+1, fields);
+ return TypeFunc::make(domain, range);
+}
+
//------------- Interpreter state access for on stack replacement
const TypeFunc* OptoRuntime::osr_end_Type() {
// create input type (domain)
diff --git a/hotspot/src/share/vm/opto/runtime.hpp b/hotspot/src/share/vm/opto/runtime.hpp
index 9f2a26cecb7..b8ad0105dfc 100644
--- a/hotspot/src/share/vm/opto/runtime.hpp
+++ b/hotspot/src/share/vm/opto/runtime.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -300,6 +300,9 @@ private:
static const TypeFunc* aescrypt_block_Type();
static const TypeFunc* cipherBlockChaining_aescrypt_Type();
+ static const TypeFunc* sha_implCompress_Type();
+ static const TypeFunc* digestBase_implCompressMB_Type();
+
static const TypeFunc* updateBytesCRC32_Type();
// leaf on stack replacement interpreter accessor types
diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp
index ec1c1805cee..acbe377f53b 100644
--- a/hotspot/src/share/vm/runtime/globals.hpp
+++ b/hotspot/src/share/vm/runtime/globals.hpp
@@ -599,6 +599,9 @@ class CommandLineFlags {
product(bool, UseAES, false, \
"Control whether AES instructions can be used on x86/x64") \
\
+ product(bool, UseSHA, false, \
+ "Control whether SHA instructions can be used on SPARC") \
+ \
product(uintx, LargePageSizeInBytes, 0, \
"Large page size (0 to let VM choose the page size)") \
\
@@ -705,6 +708,15 @@ class CommandLineFlags {
product(bool, UseAESIntrinsics, false, \
"Use intrinsics for AES versions of crypto") \
\
+ product(bool, UseSHA1Intrinsics, false, \
+ "Use intrinsics for SHA-1 crypto hash function") \
+ \
+ product(bool, UseSHA256Intrinsics, false, \
+ "Use intrinsics for SHA-224 and SHA-256 crypto hash functions") \
+ \
+ product(bool, UseSHA512Intrinsics, false, \
+ "Use intrinsics for SHA-384 and SHA-512 crypto hash functions") \
+ \
product(bool, UseCRC32Intrinsics, false, \
"use intrinsics for java.util.zip.CRC32") \
\
diff --git a/hotspot/src/share/vm/runtime/stubRoutines.cpp b/hotspot/src/share/vm/runtime/stubRoutines.cpp
index ff12ca65163..6febb5bcee9 100644
--- a/hotspot/src/share/vm/runtime/stubRoutines.cpp
+++ b/hotspot/src/share/vm/runtime/stubRoutines.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -125,6 +125,13 @@ address StubRoutines::_aescrypt_decryptBlock = NULL;
address StubRoutines::_cipherBlockChaining_encryptAESCrypt = NULL;
address StubRoutines::_cipherBlockChaining_decryptAESCrypt = NULL;
+address StubRoutines::_sha1_implCompress = NULL;
+address StubRoutines::_sha1_implCompressMB = NULL;
+address StubRoutines::_sha256_implCompress = NULL;
+address StubRoutines::_sha256_implCompressMB = NULL;
+address StubRoutines::_sha512_implCompress = NULL;
+address StubRoutines::_sha512_implCompressMB = NULL;
+
address StubRoutines::_updateBytesCRC32 = NULL;
address StubRoutines::_crc_table_adr = NULL;
diff --git a/hotspot/src/share/vm/runtime/stubRoutines.hpp b/hotspot/src/share/vm/runtime/stubRoutines.hpp
index 9548ede87f0..78381168fc4 100644
--- a/hotspot/src/share/vm/runtime/stubRoutines.hpp
+++ b/hotspot/src/share/vm/runtime/stubRoutines.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -207,6 +207,13 @@ class StubRoutines: AllStatic {
static address _cipherBlockChaining_encryptAESCrypt;
static address _cipherBlockChaining_decryptAESCrypt;
+ static address _sha1_implCompress;
+ static address _sha1_implCompressMB;
+ static address _sha256_implCompress;
+ static address _sha256_implCompressMB;
+ static address _sha512_implCompress;
+ static address _sha512_implCompressMB;
+
static address _updateBytesCRC32;
static address _crc_table_adr;
@@ -356,6 +363,13 @@ class StubRoutines: AllStatic {
static address cipherBlockChaining_encryptAESCrypt() { return _cipherBlockChaining_encryptAESCrypt; }
static address cipherBlockChaining_decryptAESCrypt() { return _cipherBlockChaining_decryptAESCrypt; }
+ static address sha1_implCompress() { return _sha1_implCompress; }
+ static address sha1_implCompressMB() { return _sha1_implCompressMB; }
+ static address sha256_implCompress() { return _sha256_implCompress; }
+ static address sha256_implCompressMB() { return _sha256_implCompressMB; }
+ static address sha512_implCompress() { return _sha512_implCompress; }
+ static address sha512_implCompressMB() { return _sha512_implCompressMB; }
+
static address updateBytesCRC32() { return _updateBytesCRC32; }
static address crc_table_addr() { return _crc_table_adr; }
diff --git a/hotspot/test/compiler/intrinsics/sha/TestSHA.java b/hotspot/test/compiler/intrinsics/sha/TestSHA.java
new file mode 100644
index 00000000000..08af909ee34
--- /dev/null
+++ b/hotspot/test/compiler/intrinsics/sha/TestSHA.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+/**
+ * @test
+ * @bug 8035968
+ * @summary C2 support for SHA on SPARC
+ *
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-1 TestSHA
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-224 TestSHA
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-256 TestSHA
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-384 TestSHA
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-512 TestSHA
+ *
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-1 -Doffset=1 TestSHA
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-224 -Doffset=1 TestSHA
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-256 -Doffset=1 TestSHA
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-384 -Doffset=1 TestSHA
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-512 -Doffset=1 TestSHA
+ *
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-1 -Dalgorithm2=SHA-256 TestSHA
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-1 -Dalgorithm2=SHA-512 TestSHA
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-256 -Dalgorithm2=SHA-512 TestSHA
+ *
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-1 -Dalgorithm2=MD5 TestSHA
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=MD5 -Dalgorithm2=SHA-1 TestSHA
+ */
+
+import java.security.MessageDigest;
+import java.util.Arrays;
+
+public class TestSHA {
+ private static final int HASH_LEN = 64; /* up to 512-bit */
+ private static final int ALIGN = 8; /* for different data alignments */
+
+ public static void main(String[] args) throws Exception {
+ String provider = System.getProperty("provider", "SUN");
+ String algorithm = System.getProperty("algorithm", "SHA-1");
+ String algorithm2 = System.getProperty("algorithm2", "");
+ int msgSize = Integer.getInteger("msgSize", 1024);
+ int offset = Integer.getInteger("offset", 0) % ALIGN;
+ int iters = (args.length > 0 ? Integer.valueOf(args[0]) : 100000);
+ int warmupIters = (args.length > 1 ? Integer.valueOf(args[1]) : 20000);
+
+ testSHA(provider, algorithm, msgSize, offset, iters, warmupIters);
+
+ if (algorithm2.equals("") == false) {
+ testSHA(provider, algorithm2, msgSize, offset, iters, warmupIters);
+ }
+ }
+
+ static void testSHA(String provider, String algorithm, int msgSize,
+ int offset, int iters, int warmupIters) throws Exception {
+ System.out.println("provider = " + provider);
+ System.out.println("algorithm = " + algorithm);
+ System.out.println("msgSize = " + msgSize + " bytes");
+ System.out.println("offset = " + offset);
+ System.out.println("iters = " + iters);
+
+ byte[] expectedHash = new byte[HASH_LEN];
+ byte[] hash = new byte[HASH_LEN];
+ byte[] data = new byte[msgSize + offset];
+ for (int i = 0; i < (msgSize + offset); i++) {
+ data[i] = (byte)(i & 0xff);
+ }
+
+ try {
+ MessageDigest sha = MessageDigest.getInstance(algorithm, provider);
+
+ /* do once, which doesn't use intrinsics */
+ sha.reset();
+ sha.update(data, offset, msgSize);
+ expectedHash = sha.digest();
+
+ /* warm up */
+ for (int i = 0; i < warmupIters; i++) {
+ sha.reset();
+ sha.update(data, offset, msgSize);
+ hash = sha.digest();
+ }
+
+ /* check result */
+ if (Arrays.equals(hash, expectedHash) == false) {
+ System.out.println("TestSHA Error: ");
+ showArray(expectedHash, "expectedHash");
+ showArray(hash, "computedHash");
+ //System.exit(1);
+ throw new Exception("TestSHA Error");
+ } else {
+ showArray(hash, "hash");
+ }
+
+ /* measure performance */
+ long start = System.nanoTime();
+ for (int i = 0; i < iters; i++) {
+ sha.reset();
+ sha.update(data, offset, msgSize);
+ hash = sha.digest();
+ }
+ long end = System.nanoTime();
+ double total = (double)(end - start)/1e9; /* in seconds */
+ double thruput = (double)msgSize*iters/1e6/total; /* in MB/s */
+ System.out.println("TestSHA runtime = " + total + " seconds");
+ System.out.println("TestSHA throughput = " + thruput + " MB/s");
+ System.out.println();
+ } catch (Exception e) {
+ System.out.println("Exception: " + e);
+ //System.exit(1);
+ throw new Exception(e);
+ }
+ }
+
+ static void showArray(byte b[], String name) {
+ System.out.format("%s [%d]: ", name, b.length);
+ for (int i = 0; i < Math.min(b.length, HASH_LEN); i++) {
+ System.out.format("%02x ", b[i] & 0xff);
+ }
+ System.out.println();
+ }
+}
From 77fa3101ec325a151a661ddb042fecd2ccb9f6a6 Mon Sep 17 00:00:00 2001
From: Andreas Lundblad
Date: Thu, 12 Jun 2014 14:29:09 +0200
Subject: [PATCH 29/76] 8042830: A recently added Xprefer test fails on Windows
Test now accepts both / and \ as file separator.
Reviewed-by: mcimadamore
---
.../tools/javac/options/xprefer/XPreferTest.java | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/langtools/test/tools/javac/options/xprefer/XPreferTest.java b/langtools/test/tools/javac/options/xprefer/XPreferTest.java
index 7d9c6da190e..3a95718fe36 100644
--- a/langtools/test/tools/javac/options/xprefer/XPreferTest.java
+++ b/langtools/test/tools/javac/options/xprefer/XPreferTest.java
@@ -26,7 +26,6 @@
* @summary Tests which path is used to represent an implicit type given
* various xprefer arguments and multiple .class / .java files involved.
* @bug 8028196
- * @ignore 8042839 XPreferTest fails on Windows
*/
import java.io.File;
@@ -42,6 +41,7 @@ import java.util.List;
import java.util.ListIterator;
import java.util.NoSuchElementException;
import java.util.Scanner;
+import java.util.regex.Pattern;
import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
@@ -180,10 +180,16 @@ public class XPreferTest {
Scanner s = new Scanner(compilerOutput);
while (s.hasNextLine()) {
String line = s.nextLine();
- if (line.matches("\\[loading .*\\]"))
- for (Dir dir : Dir.values())
- if (line.contains(dir.file.getName() + "/" + classId))
+ if (line.matches("\\[loading .*\\]")) {
+ for (Dir dir : Dir.values()) {
+ // On Windows all paths are printed with '/' except
+ // paths inside zip-files, which are printed with '\'.
+ // For this reason we accept both '/' and '\' below.
+ String regex = dir.file.getName() + "[\\\\/]" + classId;
+ if (Pattern.compile(regex).matcher(line).find())
return dir;
+ }
+ }
}
return null;
}
From b571b4214a6fc0a0456208823ede05f922177acc Mon Sep 17 00:00:00 2001
From: Vladimir Kozlov
Date: Thu, 12 Jun 2014 10:15:43 -0700
Subject: [PATCH 30/76] 8046516: Segmentation fault in JVM (easily
reproducible)
Place new nodes on the previous loop exit in reorg_offsets().
Reviewed-by: roland
---
hotspot/src/share/vm/opto/loopopts.cpp | 4 +-
.../test/compiler/loopopts/TestLogSum.java | 111 ++++++++++++++++++
2 files changed, 113 insertions(+), 2 deletions(-)
create mode 100644 hotspot/test/compiler/loopopts/TestLogSum.java
diff --git a/hotspot/src/share/vm/opto/loopopts.cpp b/hotspot/src/share/vm/opto/loopopts.cpp
index 93519a7cdb1..e25a6b0762e 100644
--- a/hotspot/src/share/vm/opto/loopopts.cpp
+++ b/hotspot/src/share/vm/opto/loopopts.cpp
@@ -2771,11 +2771,11 @@ void PhaseIdealLoop::reorg_offsets(IdealLoopTree *loop) {
// Hit! Refactor use to use the post-incremented tripcounter.
// Compute a post-increment tripcounter.
Node *opaq = new Opaque2Node( C, cle->incr() );
- register_new_node( opaq, u_ctrl );
+ register_new_node(opaq, exit);
Node *neg_stride = _igvn.intcon(-cle->stride_con());
set_ctrl(neg_stride, C->root());
Node *post = new AddINode( opaq, neg_stride);
- register_new_node( post, u_ctrl );
+ register_new_node(post, exit);
_igvn.rehash_node_delayed(use);
for (uint j = 1; j < use->req(); j++) {
if (use->in(j) == phi)
diff --git a/hotspot/test/compiler/loopopts/TestLogSum.java b/hotspot/test/compiler/loopopts/TestLogSum.java
new file mode 100644
index 00000000000..a32963dfa02
--- /dev/null
+++ b/hotspot/test/compiler/loopopts/TestLogSum.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8046516
+ * @summary Segmentation fault in JVM (easily reproducible)
+ * @run main/othervm -XX:-TieredCompilation -Xbatch TestLogSum
+ * @author jackkamm@gmail.com
+ */
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+public class TestLogSum {
+ public static void main(String[] args) {
+ double sum;
+
+ for (int i = 0; i < 6; i++) {
+ for (int n = 2; n < 30; n++) {
+ for (int j = 1; j <= n; j++) {
+ for (int k = 1; k <= j; k++) {
+ // System.out.println(computeSum(k, j));
+ sum = computeSum(k, j);
+ }
+ }
+ }
+ }
+ }
+
+ private static Map, Double> cache = new HashMap, Double>();
+ public static double computeSum(int x, int y) {
+ List key = Arrays.asList(new Integer[] {x, y});
+
+ if (!cache.containsKey(key)) {
+
+ // explicitly creating/updating a double[] array, instead of using the LogSumArray wrapper object, will prevent the error
+ LogSumArray toReturn = new LogSumArray(x);
+
+ // changing loop indices will prevent the error
+ // in particular, for(z=0; z
Date: Thu, 12 Jun 2014 16:31:07 -0700
Subject: [PATCH 31/76] 8032045: Enable compiler and linker safety switches for
debug builds
Enable GCC linker protections, runtime bounds checks and stack protection.
Reviewed-by: dholmes, kvn, coleenp
---
hotspot/make/bsd/makefiles/fastdebug.make | 31 ++---
hotspot/make/bsd/makefiles/gcc.make | 93 +++++++++----
hotspot/make/linux/makefiles/fastdebug.make | 11 ++
hotspot/make/linux/makefiles/gcc.make | 73 +++++++---
hotspot/make/solaris/makefiles/gcc.make | 147 ++++++++++++++------
5 files changed, 248 insertions(+), 107 deletions(-)
diff --git a/hotspot/make/bsd/makefiles/fastdebug.make b/hotspot/make/bsd/makefiles/fastdebug.make
index 9ff25742f21..d57e545b5b0 100644
--- a/hotspot/make/bsd/makefiles/fastdebug.make
+++ b/hotspot/make/bsd/makefiles/fastdebug.make
@@ -24,37 +24,30 @@
# Sets make macros for making debug version of VM
+# Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make
+# They may also specify FASTDEBUG_CFLAGS, but it defaults to DEBUG_CFLAGS.
+
+FASTDEBUG_CFLAGS$(FASTDEBUG_CFLAGS) = $(DEBUG_CFLAGS)
+
# Compiler specific OPT_CFLAGS are passed in from gcc.make, sparcWorks.make
OPT_CFLAGS/DEFAULT= $(OPT_CFLAGS)
OPT_CFLAGS/BYFILE = $(OPT_CFLAGS/$@)$(OPT_CFLAGS/DEFAULT$(OPT_CFLAGS/$@))
# (OPT_CFLAGS/SLOWER is also available, to alter compilation of buggy files)
-ifeq ($(BUILDARCH), ia64)
- # Bug in GCC, causes hang. -O1 will override the -O3 specified earlier
- OPT_CFLAGS/callGenerator.o += -O1
- OPT_CFLAGS/ciTypeFlow.o += -O1
- OPT_CFLAGS/compile.o += -O1
- OPT_CFLAGS/concurrentMarkSweepGeneration.o += -O1
- OPT_CFLAGS/doCall.o += -O1
- OPT_CFLAGS/generateOopMap.o += -O1
- OPT_CFLAGS/generateOptoStub.o += -O1
- OPT_CFLAGS/graphKit.o += -O1
- OPT_CFLAGS/instanceKlass.o += -O1
- OPT_CFLAGS/interpreterRT_ia64.o += -O1
- OPT_CFLAGS/output.o += -O1
- OPT_CFLAGS/parse1.o += -O1
- OPT_CFLAGS/runtime.o += -O1
- OPT_CFLAGS/synchronizer.o += -O1
-endif
-
-
# If you set HOTSPARC_GENERIC=yes, you disable all OPT_CFLAGS settings
CFLAGS$(HOTSPARC_GENERIC) += $(OPT_CFLAGS/BYFILE)
# Set the environment variable HOTSPARC_GENERIC to "true"
# to inhibit the effect of the previous line on CFLAGS.
+# The following lines are copied from debug.make, except that we
+# consult FASTDEBUG_CFLAGS instead of DEBUG_CFLAGS.
+# Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make
+DEBUG_CFLAGS/DEFAULT= $(FASTDEBUG_CFLAGS)
+DEBUG_CFLAGS/BYFILE = $(DEBUG_CFLAGS/$@)$(DEBUG_CFLAGS/DEFAULT$(DEBUG_CFLAGS/$@))
+CFLAGS += $(DEBUG_CFLAGS/BYFILE)
+
# Linker mapfile
MAPFILE = $(GAMMADIR)/make/bsd/makefiles/mapfile-vers-debug
ifeq ($(OS_VENDOR), Darwin)
diff --git a/hotspot/make/bsd/makefiles/gcc.make b/hotspot/make/bsd/makefiles/gcc.make
index 2a0eab17ef9..c96ff2a78b6 100644
--- a/hotspot/make/bsd/makefiles/gcc.make
+++ b/hotspot/make/bsd/makefiles/gcc.make
@@ -19,7 +19,7 @@
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
-#
+#
#
OS_VENDOR = $(shell uname -s)
@@ -80,7 +80,7 @@ ifeq ($(SPEC),)
HOSTCC = $(CC)
endif
- AS = $(CC) -c
+ AS = $(CC) -c
endif
ifeq ($(OS_VENDOR), Darwin)
@@ -100,7 +100,7 @@ else
endif
ifeq ($(USE_CLANG), true)
- # clang has precompiled headers support by default, but the user can switch
+ # Clang has precompiled headers support by default, but the user can switch
# it off by using 'USE_PRECOMPILED_HEADER=0'.
ifdef LP64
ifeq ($(USE_PRECOMPILED_HEADER),)
@@ -112,29 +112,29 @@ ifeq ($(USE_CLANG), true)
# Clang produces an error if the PCH file was compiled with other options than the actual compilation unit.
USE_PRECOMPILED_HEADER=0
endif
-
+
ifeq ($(USE_PRECOMPILED_HEADER),1)
-
+
ifndef LP64
$(error " Precompiled Headers only supported on 64-bit platforms!")
endif
-
+
PRECOMPILED_HEADER_DIR=.
PRECOMPILED_HEADER_SRC=$(GAMMADIR)/src/share/vm/precompiled/precompiled.hpp
PRECOMPILED_HEADER=$(PRECOMPILED_HEADER_DIR)/precompiled.hpp.pch
-
+
PCH_FLAG = -include precompiled.hpp
PCH_FLAG/DEFAULT = $(PCH_FLAG)
PCH_FLAG/NO_PCH = -DNO_PCH
PCH_FLAG/BY_FILE = $(PCH_FLAG/$@)$(PCH_FLAG/DEFAULT$(PCH_FLAG/$@))
-
+
VM_PCH_FLAG/LIBJVM = $(PCH_FLAG/BY_FILE)
VM_PCH_FLAG/AOUT =
VM_PCH_FLAG = $(VM_PCH_FLAG/$(LINK_INTO))
-
+
# We only use precompiled headers for the JVM build
CFLAGS += $(VM_PCH_FLAG)
-
+
# The following files are compiled at various optimization
# levels due to optimization issues encountered at the
# 'OPT_CFLAGS_DEFAULT' level. The Clang compiler issues a compile
@@ -149,7 +149,7 @@ ifeq ($(USE_CLANG), true)
PCH_FLAG/sharedRuntimeTrig.o = $(PCH_FLAG/NO_PCH)
PCH_FLAG/sharedRuntimeTrans.o = $(PCH_FLAG/NO_PCH)
PCH_FLAG/unsafe.o = $(PCH_FLAG/NO_PCH)
-
+
endif
else # ($(USE_CLANG), true)
# check for precompiled headers support
@@ -272,21 +272,24 @@ endif
CFLAGS_WARN/DEFAULT = $(WARNINGS_ARE_ERRORS) $(WARNING_FLAGS)
# Special cases
-CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@))
+CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@))
# XXXDARWIN: for _dyld_bind_fully_image_containing_address
ifeq ($(OS_VENDOR), Darwin)
CFLAGS_WARN/os_bsd.o = $(CFLAGS_WARN/DEFAULT) -Wno-deprecated-declarations
endif
+# optimization control flags (Used by fastdebug and release variants)
+OPT_CFLAGS/NOOPT=-O0
+ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1"
+ # Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination)
+ OPT_CFLAGS/DEBUG=-Og
+else
+ # Allow no optimizations.
+ OPT_CFLAGS/DEBUG=-O0
+endif
OPT_CFLAGS/SIZE=-Os
OPT_CFLAGS/SPEED=-O3
-# Hotspot uses very unstrict aliasing turn this optimization off
-# This option is added to CFLAGS rather than OPT_CFLAGS
-# so that OPT_CFLAGS overrides get this option too.
-CFLAGS += -fno-strict-aliasing
-
-# The flags to use for an Optimized g++ build
ifeq ($(OS_VENDOR), Darwin)
# use -Os by default, unless -O3 can be proved to be worth the cost, as per policy
#
@@ -295,6 +298,11 @@ else
OPT_CFLAGS_DEFAULT ?= SPEED
endif
+# Hotspot uses very unstrict aliasing turn this optimization off
+# This option is added to CFLAGS rather than OPT_CFLAGS
+# so that OPT_CFLAGS overrides get this option too.
+CFLAGS += -fno-strict-aliasing
+
ifdef OPT_CFLAGS
ifneq ("$(origin OPT_CFLAGS)", "command line")
$(error " Use OPT_EXTRAS instead of OPT_CFLAGS to add extra flags to OPT_CFLAGS.")
@@ -309,8 +317,6 @@ ifeq ($(BUILDARCH), ia64)
OPT_CFLAGS += -fno-expensive-optimizations
endif
-OPT_CFLAGS/NOOPT=-O0
-
# Work around some compiler bugs.
ifeq ($(USE_CLANG), true)
ifeq ($(shell expr $(CC_VER_MAJOR) = 4 \& $(CC_VER_MINOR) = 2), 1)
@@ -338,7 +344,7 @@ CFLAGS += -DDONT_USE_PRECOMPILED_HEADER
endif
ifeq ($(OS_VENDOR), Darwin)
- # Setting these parameters makes it an error to link to macosx APIs that are
+ # Setting these parameters makes it an error to link to macosx APIs that are
# newer than the given OS version and makes the linked binaries compatible even
# if built on a newer version of the OS.
# The expected format is X.Y.Z
@@ -371,10 +377,22 @@ endif
ifeq ($(USE_CLANG),)
# statically link libgcc and/or libgcc_s, libgcc does not exist before gcc-3.x.
- ifneq ("${CC_VER_MAJOR}", "2")
+ ifneq ($(CC_VER_MAJOR), 2)
STATIC_LIBGCC += -static-libgcc
endif
+ ifneq ($(OS_VENDOR), Darwin)
+ ifneq (, findstring(debug,$(BUILD_FLAVOR)))
+ # for relocations read-only
+ LFLAGS += -Xlinker -z -Xlinker relro
+
+ ifeq ($(BUILD_FLAVOR), debug)
+ # disable incremental relocations linking
+ LFLAGS += -Xlinker -z -Xlinker now
+ endif
+ endif
+ endif
+
ifeq ($(BUILDARCH), ia64)
LFLAGS += -Wl,-relax
endif
@@ -425,6 +443,14 @@ ifeq ($(USE_CLANG), true)
CFLAGS += -flimit-debug-info
endif
+ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1"
+ # Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination)
+ DEBUG_CFLAGS=-Og
+else
+ # Allow no optimizations.
+ DEBUG_CFLAGS=-O0
+endif
+
# DEBUG_BINARIES uses full -g debug information for all configs
ifeq ($(DEBUG_BINARIES), true)
CFLAGS += -g
@@ -441,9 +467,14 @@ else
DEBUG_CFLAGS/ppc = -g
DEBUG_CFLAGS += $(DEBUG_CFLAGS/$(BUILDARCH))
ifeq ($(DEBUG_CFLAGS/$(BUILDARCH)),)
- DEBUG_CFLAGS += -gstabs
+ ifeq ($(USE_CLANG), true)
+ # Clang doesn't understand -gstabs
+ DEBUG_CFLAGS += -g
+ else
+ DEBUG_CFLAGS += -gstabs
+ endif
endif
-
+
ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
FASTDEBUG_CFLAGS/ia64 = -g
FASTDEBUG_CFLAGS/amd64 = -g
@@ -458,7 +489,7 @@ else
FASTDEBUG_CFLAGS += -gstabs
endif
endif
-
+
OPT_CFLAGS/ia64 = -g
OPT_CFLAGS/amd64 = -g
OPT_CFLAGS/arm = -g
@@ -475,6 +506,18 @@ else
endif
endif
+ifeq ($(USE_CLANG),)
+ # Enable bounds checking.
+ # _FORTIFY_SOURCE appears in GCC 4.0+
+ ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 3 \) )" "1"
+ # compile time size bounds checks
+ FASTDEBUG_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
+
+ # and runtime size bounds checks and paranoid stack smashing checks.
+ DEBUG_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all --param ssp-buffer-size=1
+ endif
+endif
+
# If we are building HEADLESS, pass on to VM
# so it can set the java.awt.headless property
ifdef HEADLESS
diff --git a/hotspot/make/linux/makefiles/fastdebug.make b/hotspot/make/linux/makefiles/fastdebug.make
index c71e147fe4e..ebadd1986b3 100644
--- a/hotspot/make/linux/makefiles/fastdebug.make
+++ b/hotspot/make/linux/makefiles/fastdebug.make
@@ -24,6 +24,11 @@
# Sets make macros for making debug version of VM
+# Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make
+# They may also specify FASTDEBUG_CFLAGS, but it defaults to DEBUG_CFLAGS.
+
+FASTDEBUG_CFLAGS$(FASTDEBUG_CFLAGS) = $(DEBUG_CFLAGS)
+
# Compiler specific OPT_CFLAGS are passed in from gcc.make, sparcWorks.make
OPT_CFLAGS/DEFAULT= $(OPT_CFLAGS)
OPT_CFLAGS/BYFILE = $(OPT_CFLAGS/$@)$(OPT_CFLAGS/DEFAULT$(OPT_CFLAGS/$@))
@@ -54,6 +59,12 @@ CFLAGS$(HOTSPARC_GENERIC) += $(OPT_CFLAGS/BYFILE)
# Set the environment variable HOTSPARC_GENERIC to "true"
# to inhibit the effect of the previous line on CFLAGS.
+# The following lines are copied from debug.make, except that we
+# consult FASTDEBUG_CFLAGS instead of DEBUG_CFLAGS.
+# Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make
+DEBUG_CFLAGS/DEFAULT= $(FASTDEBUG_CFLAGS)
+DEBUG_CFLAGS/BYFILE = $(DEBUG_CFLAGS/$@)$(DEBUG_CFLAGS/DEFAULT$(DEBUG_CFLAGS/$@))
+CFLAGS += $(DEBUG_CFLAGS/BYFILE)
# Linker mapfile
MAPFILE = $(GAMMADIR)/make/linux/makefiles/mapfile-vers-debug
diff --git a/hotspot/make/linux/makefiles/gcc.make b/hotspot/make/linux/makefiles/gcc.make
index 9d321ea7dc7..df3f8bda26f 100644
--- a/hotspot/make/linux/makefiles/gcc.make
+++ b/hotspot/make/linux/makefiles/gcc.make
@@ -19,7 +19,7 @@
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
-#
+#
#
#------------------------------------------------------------------------
@@ -62,7 +62,6 @@ else
CC_VER_MINOR := $(shell $(CC) -dumpversion | sed 's/egcs-//' | cut -d'.' -f2)
endif
-
ifeq ($(USE_CLANG), true)
# Clang has precompiled headers support by default, but the user can switch
# it off by using 'USE_PRECOMPILED_HEADER=0'.
@@ -104,7 +103,7 @@ ifeq ($(USE_CLANG), true)
# But Clang doesn't support a precompiled header which was compiled with -O3
# to be used in a compilation unit which uses '-O0'. We could also prepare an
# extra '-O0' PCH file for the opt build and use it here, but it's probably
- # not worth the effoert as long as only two files need this special handling.
+ # not worth the effort as long as only two files need this special handling.
PCH_FLAG/loopTransform.o = $(PCH_FLAG/NO_PCH)
PCH_FLAG/sharedRuntimeTrig.o = $(PCH_FLAG/NO_PCH)
PCH_FLAG/sharedRuntimeTrans.o = $(PCH_FLAG/NO_PCH)
@@ -226,19 +225,28 @@ ifeq ($(USE_CLANG),)
endif
CFLAGS_WARN/DEFAULT = $(WARNINGS_ARE_ERRORS) $(WARNING_FLAGS)
-# Special cases
-CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@))
-# The flags to use for an Optimized g++ build
+# Special cases
+CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@))
+
+# optimization control flags (Used by fastdebug and release variants)
+OPT_CFLAGS/NOOPT=-O0
+ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1"
+ # Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination)
+ OPT_CFLAGS/DEBUG=-Og
+else
+ # Allow no optimizations.
+ OPT_CFLAGS/DEBUG=-O0
+endif
OPT_CFLAGS/SIZE=-Os
OPT_CFLAGS/SPEED=-O3
+OPT_CFLAGS_DEFAULT ?= SPEED
+
# Hotspot uses very unstrict aliasing turn this optimization off
# This option is added to CFLAGS rather than OPT_CFLAGS
# so that OPT_CFLAGS overrides get this option too.
-CFLAGS += -fno-strict-aliasing
-
-OPT_CFLAGS_DEFAULT ?= SPEED
+CFLAGS += -fno-strict-aliasing
ifdef OPT_CFLAGS
ifneq ("$(origin OPT_CFLAGS)", "command line")
@@ -248,14 +256,12 @@ endif
OPT_CFLAGS = $(OPT_CFLAGS/$(OPT_CFLAGS_DEFAULT)) $(OPT_EXTRAS)
-# The gcc compiler segv's on ia64 when compiling bytecodeInterpreter.cpp
+# The gcc compiler segv's on ia64 when compiling bytecodeInterpreter.cpp
# if we use expensive-optimizations
ifeq ($(BUILDARCH), ia64)
OPT_CFLAGS += -fno-expensive-optimizations
endif
-OPT_CFLAGS/NOOPT=-O0
-
# Work around some compiler bugs.
ifeq ($(USE_CLANG), true)
ifeq ($(shell expr $(CC_VER_MAJOR) = 4 \& $(CC_VER_MINOR) = 2), 1)
@@ -271,7 +277,7 @@ endif
# Flags for generating make dependency flags.
DEPFLAGS = -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d)
ifeq ($(USE_CLANG),)
- ifneq ("${CC_VER_MAJOR}", "2")
+ ifneq ($(CC_VER_MAJOR), 2)
DEPFLAGS += -fpch-deps
endif
endif
@@ -282,21 +288,26 @@ endif
# statically link libstdc++.so, work with gcc but ignored by g++
STATIC_STDCXX = -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic
+# Enable linker optimization
+LFLAGS += -Xlinker -O1
+
ifeq ($(USE_CLANG),)
- # statically link libgcc and/or libgcc_s, libgcc does not exist before gcc-3.x.
- ifneq ("${CC_VER_MAJOR}", "2")
- STATIC_LIBGCC += -static-libgcc
+ STATIC_LIBGCC += -static-libgcc
+
+ ifneq (, findstring(debug,$(BUILD_FLAVOR)))
+ # for relocations read-only
+ LFLAGS += -Xlinker -z -Xlinker relro
+
+ ifeq ($(BUILD_FLAVOR), debug)
+ # disable incremental relocations linking
+ LFLAGS += -Xlinker -z -Xlinker now
+ endif
endif
ifeq ($(BUILDARCH), ia64)
LFLAGS += -Wl,-relax
endif
-endif
-# Enable linker optimization
-LFLAGS += -Xlinker -O1
-
-ifeq ($(USE_CLANG),)
# If this is a --hash-style=gnu system, use --hash-style=both
# The gnu .hash section won't work on some Linux systems like SuSE 10.
_HAS_HASH_STYLE_GNU:=$(shell $(CC) -dumpspecs | grep -- '--hash-style=gnu')
@@ -333,6 +344,14 @@ ifeq ($(USE_CLANG), true)
CFLAGS += -flimit-debug-info
endif
+ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1"
+ # Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination)
+ DEBUG_CFLAGS=-Og
+else
+ # Allow no optimizations.
+ DEBUG_CFLAGS=-O0
+endif
+
# DEBUG_BINARIES uses full -g debug information for all configs
ifeq ($(DEBUG_BINARIES), true)
CFLAGS += -g
@@ -355,6 +374,18 @@ else
endif
endif
+ifeq ($(USE_CLANG),)
+ # Enable bounds checking.
+ # _FORTIFY_SOURCE appears in GCC 4.0+
+ ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 3 \) )" "1"
+ # compile time size bounds checks
+ FASTDEBUG_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
+
+ # and runtime size bounds checks and paranoid stack smashing checks.
+ DEBUG_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all --param ssp-buffer-size=1
+ endif
+endif
+
# If we are building HEADLESS, pass on to VM
# so it can set the java.awt.headless property
ifdef HEADLESS
diff --git a/hotspot/make/solaris/makefiles/gcc.make b/hotspot/make/solaris/makefiles/gcc.make
index 94778592ece..801bb4ee08e 100644
--- a/hotspot/make/solaris/makefiles/gcc.make
+++ b/hotspot/make/solaris/makefiles/gcc.make
@@ -19,7 +19,7 @@
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
-#
+#
#
#------------------------------------------------------------------------
@@ -40,7 +40,7 @@ Compiler = gcc
CC_VER_MAJOR := $(shell $(CC) -dumpversion | sed 's/egcs-//' | cut -d'.' -f1)
CC_VER_MINOR := $(shell $(CC) -dumpversion | sed 's/egcs-//' | cut -d'.' -f2)
-# Check for the versions of C++ and C compilers ($CXX and $CC) used.
+# Check for the versions of C++ and C compilers ($CXX and $CC) used.
# Get the last thing on the line that looks like x.x+ (x is a digit).
COMPILER_REV := \
@@ -98,7 +98,7 @@ ASFLAGS += $(ARCHFLAG)
ifeq ($(BUILDARCH), amd64)
ASFLAGS += -march=k8 -march=amd64
-LFLAGS += -march=k8
+LFLAGS += -march=k8
endif
@@ -115,21 +115,44 @@ else
endif
-# Compiler warnings are treated as errors
-WARNINGS_ARE_ERRORS = -Werror
+# Compiler warnings are treated as errors
+WARNINGS_ARE_ERRORS = -Werror
+
# Enable these warnings. See 'info gcc' about details on these options
WARNING_FLAGS = -Wpointer-arith -Wconversion -Wsign-compare -Wundef -Wformat=2
CFLAGS_WARN/DEFAULT = $(WARNINGS_ARE_ERRORS) $(WARNING_FLAGS)
-# Special cases
-CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@))
-# The flags to use for an Optimized g++ build
-OPT_CFLAGS += -O3
+# Special cases
+CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@))
+
+# optimization control flags (Used by fastdebug and release variants)
+OPT_CFLAGS/NOOPT=-O0
+ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1"
+ # Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination)
+ OPT_CFLAGS/DEBUG=-Og
++else
+ # Allow no optimizations.
+ OPT_CFLAGS/DEBUG=-O0
+endif
+OPT_CFLAGS/SIZE=-Os
+OPT_CFLAGS/SPEED=-O3
+
+OPT_CFLAGS_DEFAULT ?= SPEED
# Hotspot uses very unstrict aliasing turn this optimization off
-OPT_CFLAGS += -fno-strict-aliasing
+# This option is added to CFLAGS rather than OPT_CFLAGS
+# so that OPT_CFLAGS overrides get this option too.
+CFLAGS += -fno-strict-aliasing
-# The gcc compiler segv's on ia64 when compiling bytecodeInterpreter.cpp
+ifdef OPT_CFLAGS
+ ifneq ("$(origin OPT_CFLAGS)", "command line")
+ $(error " Use OPT_EXTRAS instead of OPT_CFLAGS to add extra flags to OPT_CFLAGS.")
+ endif
+endif
+
+OPT_CFLAGS = $(OPT_CFLAGS/$(OPT_CFLAGS_DEFAULT)) $(OPT_EXTRAS)
+
+# The gcc compiler segv's on ia64 when compiling bytecodeInterpreter.cpp
# if we use expensive-optimizations
# Note: all ia64 setting reflect the ones for linux
# No actial testing was performed: there is no Solaris on ia64 presently
@@ -137,10 +160,20 @@ ifeq ($(BUILDARCH), ia64)
OPT_CFLAGS/bytecodeInterpreter.o += -fno-expensive-optimizations
endif
-OPT_CFLAGS/NOOPT=-O0
+# Work around some compiler bugs.
+ifeq ($(USE_CLANG), true)
+ ifeq ($(shell expr $(CC_VER_MAJOR) = 4 \& $(CC_VER_MINOR) = 2), 1)
+ OPT_CFLAGS/loopTransform.o += $(OPT_CFLAGS/NOOPT)
+ endif
+else
+ # 6835796. Problem in GCC 4.3.0 with mulnode.o optimized compilation.
+ ifeq ($(shell expr $(CC_VER_MAJOR) = 4 \& $(CC_VER_MINOR) = 3), 1)
+ OPT_CFLAGS/mulnode.o += $(OPT_CFLAGS/NOOPT)
+ endif
+endif
# Flags for generating make dependency flags.
-ifneq ("${CC_VER_MAJOR}", "2")
+ifneq ($(CC_VER_MAJOR), 2)
DEPFLAGS = -fpch-deps -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d)
endif
@@ -155,26 +188,37 @@ endif
# statically link libstdc++.so, work with gcc but ignored by g++
STATIC_STDCXX = -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic
-# statically link libgcc and/or libgcc_s, libgcc does not exist before gcc-3.x.
-ifneq ("${CC_VER_MAJOR}", "2")
-STATIC_LIBGCC += -static-libgcc
-endif
-
-ifeq ($(BUILDARCH), ia64)
-# Note: all ia64 setting reflect the ones for linux
-# No actial testing was performed: there is no Solaris on ia64 presently
-LFLAGS += -Wl,-relax
-endif
ifdef USE_GNULD
-# Enable linker optimization
-LFLAGS += -Xlinker -O1
+ # statically link libgcc and/or libgcc_s, libgcc does not exist before gcc-3.x.
+ ifneq ($(CC_VER_MAJOR), 2)
+ STATIC_LIBGCC += -static-libgcc
+ endif
-# Use $(MAPFLAG:FILENAME=real_file_name) to specify a map file.
-MAPFLAG = -Xlinker --version-script=FILENAME
-else
-MAPFLAG = -Xlinker -M -Xlinker FILENAME
-endif
+ # Enable linker optimization
+ LFLAGS += -Xlinker -O1
+
+ ifneq (, findstring(debug,$(BUILD_FLAVOR)))
+ # for relocations read-only
+ LFLAGS += -Xlinker -z -Xlinker relro
+
+ ifeq ($(BUILD_FLAVOR), debug)
+ # disable incremental relocations linking
+ LFLAGS += -Xlinker -z -Xlinker now
+ endif
+ endif
+
+ ifeq ($(BUILDARCH), ia64)
+ # Note: all ia64 setting reflect the ones for linux
+ # No actual testing was performed: there is no Solaris on ia64 presently
+ LFLAGS += -Wl,-relax
+ endif
+
+ # Use $(MAPFLAG:FILENAME=real_file_name) to specify a map file.
+ MAPFLAG = -Xlinker --version-script=FILENAME
+else
+ MAPFLAG = -Xlinker -M -Xlinker FILENAME
+endif
# Use $(SONAMEFLAG:SONAME=soname) to specify the intrinsic name of a shared obj
SONAMEFLAG = -Xlinker -soname=SONAME
@@ -185,15 +229,34 @@ SHARED_FLAG = -shared
#------------------------------------------------------------------------
# Debug flags
-# Use the stabs format for debugging information (this is the default
-# on gcc-2.91). It's good enough, has all the information about line
-# numbers and local variables, and libjvm.so is only about 16M.
-# Change this back to "-g" if you want the most expressive format.
-# (warning: that could easily inflate libjvm.so to 150M!)
-# Note: The Itanium gcc compiler crashes when using -gstabs.
-DEBUG_CFLAGS/ia64 = -g
-DEBUG_CFLAGS/amd64 = -g
-DEBUG_CFLAGS += $(DEBUG_CFLAGS/$(BUILDARCH))
-ifeq ($(DEBUG_CFLAGS/$(BUILDARCH)),)
-DEBUG_CFLAGS += -gstabs
-endif
+ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1"
+ # Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination)
+ DEBUG_CFLAGS=-Og
+else
+ # Allow no optimizations.
+ DEBUG_CFLAGS=-O0
+endif
+
+
+# Use the stabs format for debugging information (this is the default
+# on gcc-2.91). It's good enough, has all the information about line
+# numbers and local variables, and libjvm.so is only about 16M.
+# Change this back to "-g" if you want the most expressive format.
+# (warning: that could easily inflate libjvm.so to 150M!)
+# Note: The Itanium gcc compiler crashes when using -gstabs.
+DEBUG_CFLAGS/ia64 = -g
+DEBUG_CFLAGS/amd64 = -g
+DEBUG_CFLAGS += $(DEBUG_CFLAGS/$(BUILDARCH))
+ifeq ($(DEBUG_CFLAGS/$(BUILDARCH)),)
+ DEBUG_CFLAGS += -gstabs
+endif
+
+# Enable bounds checking.
+# _FORTIFY_SOURCE appears in GCC 4.0+
+ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 3 \) )" "1"
+ # compile time size bounds checks
+ FASTDEBUG_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
+
+ # and runtime size bounds checks and paranoid stack smashing checks.
+ DEBUG_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all --param ssp-buffer-size=1
+endif
From 7b2f1d267c275208acc1e5ef272b7171aea86ffb Mon Sep 17 00:00:00 2001
From: Mike Duigou
Date: Thu, 12 Jun 2014 16:33:32 -0700
Subject: [PATCH 32/76] 8032045: Enable compiler and linker safety switches for
debug builds
Enable GCC linker protections, runtime bounds checks and stack protection.
Reviewed-by: ihse, dholmes
---
common/autoconf/flags.m4 | 315 ++++++++++----
common/autoconf/generated-configure.sh | 575 +++++++++++++++++++++----
common/autoconf/toolchain.m4 | 80 ++--
3 files changed, 760 insertions(+), 210 deletions(-)
diff --git a/common/autoconf/flags.m4 b/common/autoconf/flags.m4
index fc13f71b8aa..95fa6521575 100644
--- a/common/autoconf/flags.m4
+++ b/common/autoconf/flags.m4
@@ -116,15 +116,15 @@ AC_DEFUN_ONCE([FLAGS_SETUP_INIT_FLAGS],
AC_SUBST(RC_FLAGS)
if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
- # FIXME: likely bug, should be CCXXFLAGS_JDK? or one for C or CXX.
- CCXXFLAGS="$CCXXFLAGS -nologo"
+ # silence copyright notice and other headers.
+ COMMON_CCXXFLAGS="$COMMON_CCXXFLAGS -nologo"
fi
if test "x$SYSROOT" != "x"; then
if test "x$TOOLCHAIN_TYPE" = xsolstudio; then
if test "x$OPENJDK_TARGET_OS" = xsolaris; then
# Solaris Studio does not have a concept of sysroot. Instead we must
- # make sure the default include and lib dirs are appended to each
+ # make sure the default include and lib dirs are appended to each
# compile and link command line.
SYSROOT_CFLAGS="-I$SYSROOT/usr/include"
SYSROOT_LDFLAGS="-L$SYSROOT/usr/lib$OPENJDK_TARGET_CPU_ISADIR \
@@ -302,6 +302,7 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_FOR_OPTIMIZATION],
# Debug symbols
if test "x$TOOLCHAIN_TYPE" = xgcc; then
if test "x$OPENJDK_TARGET_CPU_BITS" = "x64" && test "x$DEBUG_LEVEL" = "xfastdebug"; then
+ # reduce from default "-g2" option to save space
CFLAGS_DEBUG_SYMBOLS="-g1"
CXXFLAGS_DEBUG_SYMBOLS="-g1"
else
@@ -313,6 +314,7 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_FOR_OPTIMIZATION],
CXXFLAGS_DEBUG_SYMBOLS="-g"
elif test "x$TOOLCHAIN_TYPE" = xsolstudio; then
CFLAGS_DEBUG_SYMBOLS="-g -xs"
+ # FIXME: likely a bug, this disables debug symbols rather than enables them
CXXFLAGS_DEBUG_SYMBOLS="-g0 -xs"
elif test "x$TOOLCHAIN_TYPE" = xxlc; then
CFLAGS_DEBUG_SYMBOLS="-g"
@@ -321,6 +323,31 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_FOR_OPTIMIZATION],
AC_SUBST(CFLAGS_DEBUG_SYMBOLS)
AC_SUBST(CXXFLAGS_DEBUG_SYMBOLS)
+ # bounds, memory and behavior checking options
+ if test "x$TOOLCHAIN_TYPE" = xgcc; then
+ case $DEBUG_LEVEL in
+ release )
+ # no adjustment
+ ;;
+ fastdebug )
+ # Add compile time bounds checks.
+ CFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1"
+ CXXFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1"
+ ;;
+ slowdebug )
+ # Add runtime bounds checks and symbol info.
+ CFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all --param ssp-buffer-size=1"
+ CXXFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all --param ssp-buffer-size=1"
+ if test "x$HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR" = "xtrue"; then
+ CFLAGS_DEBUG_OPTIONS="$CFLAGS_DEBUG_OPTIONS $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG"
+ CXXFLAGS_DEBUG_OPTIONS="$CXXFLAGS_DEBUG_OPTIONS $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG"
+ fi
+ ;;
+ esac
+ fi
+ AC_SUBST(CFLAGS_DEBUG_OPTIONS)
+ AC_SUBST(CXXFLAGS_DEBUG_OPTIONS)
+
# Optimization levels
if test "x$TOOLCHAIN_TYPE" = xsolstudio; then
CC_HIGHEST="$CC_HIGHEST -fns -fsimple -fsingle -xbuiltin=%all -xdepend -xrestrict -xlibmil"
@@ -330,10 +357,12 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_FOR_OPTIMIZATION],
C_O_FLAG_HIGHEST="-xO4 -Wu,-O4~yz $CC_HIGHEST -xalias_level=basic -xregs=no%frameptr"
C_O_FLAG_HI="-xO4 -Wu,-O4~yz -xregs=no%frameptr"
C_O_FLAG_NORM="-xO2 -Wu,-O2~yz -xregs=no%frameptr"
+ C_O_FLAG_DEBUG="-xregs=no%frameptr"
C_O_FLAG_NONE="-xregs=no%frameptr"
CXX_O_FLAG_HIGHEST="-xO4 -Qoption ube -O4~yz $CC_HIGHEST -xregs=no%frameptr"
CXX_O_FLAG_HI="-xO4 -Qoption ube -O4~yz -xregs=no%frameptr"
CXX_O_FLAG_NORM="-xO2 -Qoption ube -O2~yz -xregs=no%frameptr"
+ CXX_O_FLAG_DEBUG="-xregs=no%frameptr"
CXX_O_FLAG_NONE="-xregs=no%frameptr"
if test "x$OPENJDK_TARGET_CPU_BITS" = "x32"; then
C_O_FLAG_HIGHEST="$C_O_FLAG_HIGHEST -xchip=pentium"
@@ -343,10 +372,12 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_FOR_OPTIMIZATION],
C_O_FLAG_HIGHEST="-xO4 -Wc,-Qrm-s -Wc,-Qiselect-T0 $CC_HIGHEST -xalias_level=basic -xprefetch=auto,explicit -xchip=ultra"
C_O_FLAG_HI="-xO4 -Wc,-Qrm-s -Wc,-Qiselect-T0"
C_O_FLAG_NORM="-xO2 -Wc,-Qrm-s -Wc,-Qiselect-T0"
+ C_O_FLAG_DEBUG=""
C_O_FLAG_NONE=""
CXX_O_FLAG_HIGHEST="-xO4 -Qoption cg -Qrm-s -Qoption cg -Qiselect-T0 $CC_HIGHEST -xprefetch=auto,explicit -xchip=ultra"
CXX_O_FLAG_HI="-xO4 -Qoption cg -Qrm-s -Qoption cg -Qiselect-T0"
CXX_O_FLAG_NORM="-xO2 -Qoption cg -Qrm-s -Qoption cg -Qiselect-T0"
+ C_O_FLAG_DEBUG=""
CXX_O_FLAG_NONE=""
fi
else
@@ -359,13 +390,17 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_FOR_OPTIMIZATION],
C_O_FLAG_HIGHEST="-Os"
C_O_FLAG_HI="-Os"
C_O_FLAG_NORM="-Os"
- C_O_FLAG_NONE=""
else
C_O_FLAG_HIGHEST="-O3"
C_O_FLAG_HI="-O3"
C_O_FLAG_NORM="-O2"
- C_O_FLAG_NONE="-O0"
fi
+ if test "x$HAS_CFLAG_OPTIMIZE_DEBUG" = "xtrue"; then
+ C_O_FLAG_DEBUG="$CFLAG_OPTIMIZE_DEBUG_FLAG"
+ else
+ C_O_FLAG_DEBUG="-O0"
+ fi
+ C_O_FLAG_NONE="-O0"
elif test "x$TOOLCHAIN_TYPE" = xclang; then
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
# On MacOSX we optimize for size, something
@@ -373,37 +408,63 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_FOR_OPTIMIZATION],
C_O_FLAG_HIGHEST="-Os"
C_O_FLAG_HI="-Os"
C_O_FLAG_NORM="-Os"
- C_O_FLAG_NONE=""
else
C_O_FLAG_HIGHEST="-O3"
C_O_FLAG_HI="-O3"
C_O_FLAG_NORM="-O2"
- C_O_FLAG_NONE="-O0"
fi
+ C_O_FLAG_DEBUG="-O0"
+ C_O_FLAG_NONE="-O0"
elif test "x$TOOLCHAIN_TYPE" = xxlc; then
C_O_FLAG_HIGHEST="-O3"
C_O_FLAG_HI="-O3 -qstrict"
C_O_FLAG_NORM="-O2"
- C_O_FLAG_NONE=""
+ C_O_FLAG_DEBUG="-qnoopt"
+ C_O_FLAG_NONE="-qnoop"
elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
C_O_FLAG_HIGHEST="-O2"
C_O_FLAG_HI="-O1"
C_O_FLAG_NORM="-O1"
+ C_O_FLAG_DEBUG="-Od"
C_O_FLAG_NONE="-Od"
fi
CXX_O_FLAG_HIGHEST="$C_O_FLAG_HIGHEST"
CXX_O_FLAG_HI="$C_O_FLAG_HI"
CXX_O_FLAG_NORM="$C_O_FLAG_NORM"
+ CXX_O_FLAG_DEBUG="$C_O_FLAG_DEBUG"
CXX_O_FLAG_NONE="$C_O_FLAG_NONE"
fi
+ # Adjust optimization flags according to debug level.
+ case $DEBUG_LEVEL in
+ release )
+ # no adjustment
+ ;;
+ fastdebug )
+ # Not quite so much optimization
+ C_O_FLAG_HI="$C_O_FLAG_NORM"
+ CXX_O_FLAG_HI="$CXX_O_FLAG_NORM"
+ ;;
+ slowdebug )
+ # Disable optimization
+ C_O_FLAG_HIGHEST="$C_O_FLAG_DEBUG"
+ C_O_FLAG_HI="$C_O_FLAG_DEBUG"
+ C_O_FLAG_NORM="$C_O_FLAG_DEBUG"
+ CXX_O_FLAG_HIGHEST="$CXX_O_FLAG_DEBUG"
+ CXX_O_FLAG_HI="$CXX_O_FLAG_DEBUG"
+ CXX_O_FLAG_NORM="$CXX_O_FLAG_DEBUG"
+ ;;
+ esac
+
AC_SUBST(C_O_FLAG_HIGHEST)
AC_SUBST(C_O_FLAG_HI)
AC_SUBST(C_O_FLAG_NORM)
+ AC_SUBST(C_O_FLAG_DEBUG)
AC_SUBST(C_O_FLAG_NONE)
AC_SUBST(CXX_O_FLAG_HIGHEST)
AC_SUBST(CXX_O_FLAG_HI)
AC_SUBST(CXX_O_FLAG_NORM)
+ AC_SUBST(CXX_O_FLAG_DEBUG)
AC_SUBST(CXX_O_FLAG_NONE)
])
@@ -461,11 +522,12 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_FOR_JDK],
# Later we will also have CFLAGS and LDFLAGS for the hotspot subrepo build.
#
- # Setup compiler/platform specific flags to CFLAGS_JDK,
- # CXXFLAGS_JDK and CCXXFLAGS_JDK (common to C and CXX?)
+ # Setup compiler/platform specific flags into
+ # CFLAGS_JDK - C Compiler flags
+ # CXXFLAGS_JDK - C++ Compiler flags
+ # COMMON_CCXXFLAGS_JDK - common to C and C++
if test "x$TOOLCHAIN_TYPE" = xgcc; then
- # these options are used for both C and C++ compiles
- CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -Wall -Wno-parentheses -Wextra -Wno-unused -Wno-unused-parameter -Wformat=2 \
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS $COMMON_CCXXFLAGS_JDK -Wall -Wno-parentheses -Wextra -Wno-unused -Wno-unused-parameter -Wformat=2 \
-pipe -D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE64_SOURCE"
case $OPENJDK_TARGET_CPU_ARCH in
arm )
@@ -477,31 +539,31 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_FOR_JDK],
CFLAGS_JDK="${CFLAGS_JDK} -fno-strict-aliasing"
;;
* )
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -fno-omit-frame-pointer"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -fno-omit-frame-pointer"
CFLAGS_JDK="${CFLAGS_JDK} -fno-strict-aliasing"
;;
esac
elif test "x$TOOLCHAIN_TYPE" = xsolstudio; then
- CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -DTRACING -DMACRO_MEMSYS_OPS -DBREAKPTS"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS $COMMON_CCXXFLAGS_JDK -DTRACING -DMACRO_MEMSYS_OPS -DBREAKPTS"
if test "x$OPENJDK_TARGET_CPU_ARCH" = xx86; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DcpuIntel -Di586 -D$OPENJDK_TARGET_CPU_LEGACY_LIB"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DcpuIntel -Di586 -D$OPENJDK_TARGET_CPU_LEGACY_LIB"
CFLAGS_JDK="$CFLAGS_JDK -erroff=E_BAD_PRAGMA_PACK_VALUE"
fi
-
+
CFLAGS_JDK="$CFLAGS_JDK -xc99=%none -xCC -errshort=tags -Xa -v -mt -W0,-noglobal"
CXXFLAGS_JDK="$CXXFLAGS_JDK -errtags=yes +w -mt -features=no%except -DCC_NOEX -norunpath -xnolib"
elif test "x$TOOLCHAIN_TYPE" = xxlc; then
CFLAGS_JDK="$CFLAGS_JDK -D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE64_SOURCE -DSTDC"
CXXFLAGS_JDK="$CXXFLAGS_JDK -D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE64_SOURCE -DSTDC"
elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
- CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -Zi -MD -Zc:wchar_t- -W3 -wd4800 \
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS $COMMON_CCXXFLAGS_JDK -Zi -MD -Zc:wchar_t- -W3 -wd4800 \
-D_STATIC_CPPLIB -D_DISABLE_DEPRECATE_STATIC_CPPLIB -DWIN32_LEAN_AND_MEAN \
-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE \
-DWIN32 -DIAL"
if test "x$OPENJDK_TARGET_CPU" = xx86_64; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_AMD64_ -Damd64"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_AMD64_ -Damd64"
else
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_X86_ -Dx86"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_X86_ -Dx86"
fi
fi
@@ -509,28 +571,20 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_FOR_JDK],
# Adjust flags according to debug level.
case $DEBUG_LEVEL in
- fastdebug )
- CFLAGS_JDK="$CFLAGS_JDK $CFLAGS_DEBUG_SYMBOLS"
- CXXFLAGS_JDK="$CXXFLAGS_JDK $CXXFLAGS_DEBUG_SYMBOLS"
- C_O_FLAG_HI="$C_O_FLAG_NORM"
- C_O_FLAG_NORM="$C_O_FLAG_NORM"
- CXX_O_FLAG_HI="$CXX_O_FLAG_NORM"
- CXX_O_FLAG_NORM="$CXX_O_FLAG_NORM"
+ fastdebug | slowdebug )
+ CFLAGS_JDK="$CFLAGS_JDK $CFLAGS_DEBUG_SYMBOLS $CFLAGS_DEBUG_OPTIONS"
+ CXXFLAGS_JDK="$CXXFLAGS_JDK $CXXFLAGS_DEBUG_SYMBOLS $CXXFLAGS_DEBUG_OPTIONS"
JAVAC_FLAGS="$JAVAC_FLAGS -g"
;;
- slowdebug )
- CFLAGS_JDK="$CFLAGS_JDK $CFLAGS_DEBUG_SYMBOLS"
- CXXFLAGS_JDK="$CXXFLAGS_JDK $CXXFLAGS_DEBUG_SYMBOLS"
- C_O_FLAG_HI="$C_O_FLAG_NONE"
- C_O_FLAG_NORM="$C_O_FLAG_NONE"
- CXX_O_FLAG_HI="$CXX_O_FLAG_NONE"
- CXX_O_FLAG_NORM="$CXX_O_FLAG_NONE"
- JAVAC_FLAGS="$JAVAC_FLAGS -g"
+ release )
+ ;;
+ * )
+ AC_MSG_ERROR([Unrecognized \$DEBUG_LEVEL: $DEBUG_LEVEL])
;;
esac
# Setup LP64
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK $ADD_LP64"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK $ADD_LP64"
# Set some common defines. These works for all compilers, but assume
# -D is universally accepted.
@@ -543,49 +597,49 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_FOR_JDK],
# Note: -Dmacro is the same as #define macro 1
# -Dmacro= is the same as #define macro
if test "x$OPENJDK_TARGET_OS" = xsolaris; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_LITTLE_ENDIAN="
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_LITTLE_ENDIAN="
else
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_LITTLE_ENDIAN"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_LITTLE_ENDIAN"
fi
else
# Same goes for _BIG_ENDIAN. Do we really need to set *ENDIAN on Solaris if they
# are defined in the system?
if test "x$OPENJDK_TARGET_OS" = xsolaris; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_BIG_ENDIAN="
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_BIG_ENDIAN="
else
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_BIG_ENDIAN"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_BIG_ENDIAN"
fi
fi
-
+
# Setup target OS define. Use OS target name but in upper case.
OPENJDK_TARGET_OS_UPPERCASE=`$ECHO $OPENJDK_TARGET_OS | $TR 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D$OPENJDK_TARGET_OS_UPPERCASE"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D$OPENJDK_TARGET_OS_UPPERCASE"
# Setup target CPU
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DARCH='\"$OPENJDK_TARGET_CPU_LEGACY\"' -D$OPENJDK_TARGET_CPU_LEGACY"
-
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DARCH='\"$OPENJDK_TARGET_CPU_LEGACY\"' -D$OPENJDK_TARGET_CPU_LEGACY"
+
# Setup debug/release defines
if test "x$DEBUG_LEVEL" = xrelease; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DNDEBUG"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DNDEBUG"
if test "x$OPENJDK_TARGET_OS" = xsolaris; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DTRIMMED"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DTRIMMED"
fi
else
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DDEBUG"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DDEBUG"
fi
# Setup release name
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DRELEASE='\"\$(RELEASE)\"'"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DRELEASE='\"\$(RELEASE)\"'"
# Set some additional per-OS defines.
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_ALLBSD_SOURCE -D_DARWIN_UNLIMITED_SELECT"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_ALLBSD_SOURCE -D_DARWIN_UNLIMITED_SELECT"
elif test "x$OPENJDK_TARGET_OS" = xaix; then
# FIXME: PPC64 should not be here.
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DPPC64"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DPPC64"
elif test "x$OPENJDK_TARGET_OS" = xbsd; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_ALLBSD_SOURCE"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_ALLBSD_SOURCE"
fi
# Additional macosx handling
@@ -595,22 +649,22 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_FOR_JDK],
# FIXME: clean this up, and/or move it elsewhere.
# Setting these parameters makes it an error to link to macosx APIs that are
- # newer than the given OS version and makes the linked binaries compatible
+ # newer than the given OS version and makes the linked binaries compatible
# even if built on a newer version of the OS.
# The expected format is X.Y.Z
MACOSX_VERSION_MIN=10.7.0
AC_SUBST(MACOSX_VERSION_MIN)
-
+
# The macro takes the version with no dots, ex: 1070
# Let the flags variables get resolved in make for easier override on make
# command line.
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DMAC_OS_X_VERSION_MAX_ALLOWED=\$(subst .,,\$(MACOSX_VERSION_MIN)) -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DMAC_OS_X_VERSION_MAX_ALLOWED=\$(subst .,,\$(MACOSX_VERSION_MIN)) -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
LDFLAGS_JDK="$LDFLAGS_JDK -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
fi
fi
# Setup some hard coded includes
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK \
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK \
-I${JDK_OUTPUTDIR}/include \
-I${JDK_OUTPUTDIR}/include/$OPENJDK_TARGET_OS \
-I${JDK_TOPDIR}/src/share/javavm/export \
@@ -619,12 +673,12 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_FOR_JDK],
-I${JDK_TOPDIR}/src/$OPENJDK_TARGET_OS_API_DIR/native/common"
# The shared libraries are compiled using the picflag.
- CFLAGS_JDKLIB="$CCXXFLAGS_JDK $CFLAGS_JDK $PICFLAG $CFLAGS_JDKLIB_EXTRA"
- CXXFLAGS_JDKLIB="$CCXXFLAGS_JDK $CXXFLAGS_JDK $PICFLAG $CXXFLAGS_JDKLIB_EXTRA "
+ CFLAGS_JDKLIB="$COMMON_CCXXFLAGS_JDK $CFLAGS_JDK $PICFLAG $CFLAGS_JDKLIB_EXTRA"
+ CXXFLAGS_JDKLIB="$COMMON_CCXXFLAGS_JDK $CXXFLAGS_JDK $PICFLAG $CXXFLAGS_JDKLIB_EXTRA "
# Executable flags
- CFLAGS_JDKEXE="$CCXXFLAGS_JDK $CFLAGS_JDK"
- CXXFLAGS_JDKEXE="$CCXXFLAGS_JDK $CXXFLAGS_JDK"
+ CFLAGS_JDKEXE="$COMMON_CCXXFLAGS_JDK $CFLAGS_JDK"
+ CXXFLAGS_JDKEXE="$COMMON_CCXXFLAGS_JDK $CXXFLAGS_JDK"
AC_SUBST(CFLAGS_JDKLIB)
AC_SUBST(CFLAGS_JDKEXE)
@@ -633,6 +687,7 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_FOR_JDK],
# Setup LDFLAGS et al.
#
+
# Now this is odd. The JDK native libraries have to link against libjvm.so
# On 32-bit machines there is normally two distinct libjvm.so:s, client and server.
# Which should we link to? Are we lucky enough that the binary api to the libjvm.so library
@@ -648,39 +703,93 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_FOR_JDK],
fi
# TODO: make -debug optional "--disable-full-debug-symbols"
LDFLAGS_JDK="$LDFLAGS_JDK -debug"
- LDFLAGS_JDKLIB="${LDFLAGS_JDK} -dll -libpath:${JDK_OUTPUTDIR}/lib"
- LDFLAGS_JDKLIB_SUFFIX=""
+ elif test "x$TOOLCHAIN_TYPE" = xgcc; then
+ # If this is a --hash-style=gnu system, use --hash-style=both, why?
+ # We have previously set HAS_GNU_HASH if this is the case
+ if test -n "$HAS_GNU_HASH"; then
+ LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both"
+ fi
+ if test "x$OPENJDK_TARGET_OS" = xlinux; then
+ # And since we now know that the linker is gnu, then add -z defs, to forbid
+ # undefined symbols in object files.
+ LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs"
+ case $DEBUG_LEVEL in
+ release )
+ # tell linker to optimize libraries.
+ # Should this be supplied to the OSS linker as well?
+ LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -O1"
+ ;;
+ slowdebug )
+ if test "x$HAS_LINKER_NOW" = "xtrue"; then
+ # do relocations at load
+ LDFLAGS_JDK="$LDFLAGS_JDK $LINKER_NOW_FLAG"
+ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK $LINKER_NOW_FLAG"
+ fi
+ if test "x$HAS_LINKER_RELRO" = "xtrue"; then
+ # mark relocations read only
+ LDFLAGS_JDK="$LDFLAGS_JDK $LINKER_RELRO_FLAG"
+ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK $LINKER_RELRO_FLAG"
+ fi
+ ;;
+ fastdebug )
+ if test "x$HAS_LINKER_RELRO" = "xtrue"; then
+ # mark relocations read only
+ LDFLAGS_JDK="$LDFLAGS_JDK $LINKER_RELRO_FLAG"
+ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK $LINKER_RELRO_FLAG"
+ fi
+ ;;
+ * )
+ AC_MSG_ERROR([Unrecognized \$DEBUG_LEVEL: $DEBUG_LEVEL])
+ ;;
+ esac
+ fi
+ elif test "x$TOOLCHAIN_TYPE" = xsolstudio; then
+ LDFLAGS_JDK="$LDFLAGS_JDK -z defs -xildoff -ztext"
+ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK -norunpath -xnolib"
+ fi
+
+ if test "x$TOOLCHAIN_TYPE" = xgcc || test "x$TOOLCHAIN_TYPE" = xclang; then
+ # If undefined behaviour detection is enabled then we need to tell linker.
+ case $DEBUG_LEVEL in
+ release | fastdebug )
+ ;;
+ slowdebug )
+ AC_MSG_WARN([$HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR])
+ if test "x$HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR" = "xtrue"; then
+ # enable undefined behaviour checking
+ LDFLAGS_JDK="$LDFLAGS_JDK `$ECHO -n $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG | sed -e "s/[ ]*\([^ ]\+\)/ -Xlinker \1/g"`"
+ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK `$ECHO -n $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG | sed -e "s/[ ]*\([^ ]\+\)/ -Xlinker \1/g"`"
+ fi
+ ;;
+ * )
+ AC_MSG_ERROR([Unrecognized \$DEBUG_LEVEL: $DEBUG_LEVEL])
+ ;;
+ esac
+ fi
+
+ # Customize LDFLAGS for executables
+
+ LDFLAGS_JDKEXE="${LDFLAGS_JDK}"
+
+ if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
if test "x$OPENJDK_TARGET_CPU_BITS" = "x64"; then
LDFLAGS_STACK_SIZE=1048576
else
LDFLAGS_STACK_SIZE=327680
fi
- LDFLAGS_JDKEXE="${LDFLAGS_JDK} /STACK:$LDFLAGS_STACK_SIZE"
+ LDFLAGS_JDKEXE="${LDFLAGS_JDKEXE} /STACK:$LDFLAGS_STACK_SIZE"
+ elif test "x$OPENJDK_TARGET_OS" = xlinux; then
+ LDFLAGS_JDKEXE="$LDFLAGS_JDKEXE -Xlinker --allow-shlib-undefined"
+ fi
+
+ # Customize LDFLAGS for libs
+ LDFLAGS_JDKLIB="${LDFLAGS_JDK}"
+
+ if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
+ LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} -dll -libpath:${JDK_OUTPUTDIR}/lib"
+ LDFLAGS_JDKLIB_SUFFIX=""
else
- if test "x$TOOLCHAIN_TYPE" = xgcc; then
- # If this is a --hash-style=gnu system, use --hash-style=both, why?
- # We have previously set HAS_GNU_HASH if this is the case
- if test -n "$HAS_GNU_HASH"; then
- LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both "
- fi
- if test "x$OPENJDK_TARGET_OS" = xlinux; then
- # And since we now know that the linker is gnu, then add -z defs, to forbid
- # undefined symbols in object files.
- LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs"
- if test "x$DEBUG_LEVEL" = "xrelease"; then
- # When building release libraries, tell the linker optimize them.
- # Should this be supplied to the OSS linker as well?
- LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -O1"
- fi
- fi
- fi
-
- if test "x$TOOLCHAIN_TYPE" = xsolstudio; then
- LDFLAGS_JDK="$LDFLAGS_JDK -z defs -xildoff -ztext"
- LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK -norunpath -xnolib"
- fi
-
- LDFLAGS_JDKLIB="${LDFLAGS_JDK} $SHARED_LIBRARY_FLAGS \
+ LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} ${SHARED_LIBRARY_FLAGS} \
-L${JDK_OUTPUTDIR}/lib${OPENJDK_TARGET_CPU_LIBDIR}"
# On some platforms (mac) the linker warns about non existing -L dirs.
@@ -701,12 +810,8 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_FOR_JDK],
if test "x$TOOLCHAIN_TYPE" = xsolstudio; then
LDFLAGS_JDKLIB_SUFFIX="$LDFLAGS_JDKLIB_SUFFIX -lc"
fi
-
- LDFLAGS_JDKEXE="${LDFLAGS_JDK}"
- if test "x$OPENJDK_TARGET_OS" = xlinux; then
- LDFLAGS_JDKEXE="$LDFLAGS_JDKEXE -Xlinker --allow-shlib-undefined"
- fi
fi
+
AC_SUBST(LDFLAGS_JDKLIB)
AC_SUBST(LDFLAGS_JDKEXE)
AC_SUBST(LDFLAGS_JDKLIB_SUFFIX)
@@ -714,7 +819,6 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_FOR_JDK],
AC_SUBST(LDFLAGS_CXX_JDK)
])
-
# FLAGS_COMPILER_CHECK_ARGUMENTS([ARGUMENT], [RUN-IF-TRUE],
# [RUN-IF-FALSE])
# ------------------------------------------------------------
@@ -727,7 +831,7 @@ AC_DEFUN([FLAGS_COMPILER_CHECK_ARGUMENTS],
saved_cflags="$CFLAGS"
CFLAGS="$CFLAGS $1"
AC_LANG_PUSH([C])
- AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int i;]])], [],
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int i;]])], [],
[supports=no])
AC_LANG_POP([C])
CFLAGS="$saved_cflags"
@@ -735,7 +839,7 @@ AC_DEFUN([FLAGS_COMPILER_CHECK_ARGUMENTS],
saved_cxxflags="$CXXFLAGS"
CXXFLAGS="$CXXFLAG $1"
AC_LANG_PUSH([C++])
- AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int i;]])], [],
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int i;]])], [],
[supports=no])
AC_LANG_POP([C++])
CXXFLAGS="$saved_cxxflags"
@@ -748,6 +852,31 @@ AC_DEFUN([FLAGS_COMPILER_CHECK_ARGUMENTS],
fi
])
+# FLAGS_LINKER_CHECK_ARGUMENTS([ARGUMENT], [RUN-IF-TRUE],
+# [RUN-IF-FALSE])
+# ------------------------------------------------------------
+# Check that the linker support an argument
+AC_DEFUN([FLAGS_LINKER_CHECK_ARGUMENTS],
+[
+ AC_MSG_CHECKING([if linker supports "$1"])
+ supports=yes
+
+ saved_ldflags="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $1"
+ AC_LANG_PUSH([C])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],
+ [], [supports=no])
+ AC_LANG_POP([C])
+ LDFLAGS="$saved_ldflags"
+
+ AC_MSG_RESULT([$supports])
+ if test "x$supports" = "xyes" ; then
+ m4_ifval([$2], [$2], [:])
+ else
+ m4_ifval([$3], [$3], [:])
+ fi
+])
+
AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_MISC],
[
# Some Zero and Shark settings.
diff --git a/common/autoconf/generated-configure.sh b/common/autoconf/generated-configure.sh
index 86905690fb7..4d95f64e34d 100644
--- a/common/autoconf/generated-configure.sh
+++ b/common/autoconf/generated-configure.sh
@@ -692,13 +692,17 @@ LEGACY_EXTRA_LDFLAGS
LEGACY_EXTRA_CXXFLAGS
LEGACY_EXTRA_CFLAGS
CXX_O_FLAG_NONE
+CXX_O_FLAG_DEBUG
CXX_O_FLAG_NORM
CXX_O_FLAG_HI
CXX_O_FLAG_HIGHEST
C_O_FLAG_NONE
+C_O_FLAG_DEBUG
C_O_FLAG_NORM
C_O_FLAG_HI
C_O_FLAG_HIGHEST
+CXXFLAGS_DEBUG_OPTIONS
+CFLAGS_DEBUG_OPTIONS
CXXFLAGS_DEBUG_SYMBOLS
CFLAGS_DEBUG_SYMBOLS
CXX_FLAG_DEPS
@@ -2346,6 +2350,52 @@ fi
} # ac_fn_objc_try_compile
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES
# ---------------------------------------------------------
# Tests whether HEADER exists, giving a warning if it cannot be compiled using
@@ -3761,13 +3811,18 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
-
# FLAGS_COMPILER_CHECK_ARGUMENTS([ARGUMENT], [RUN-IF-TRUE],
# [RUN-IF-FALSE])
# ------------------------------------------------------------
# Check that the c and c++ compilers support an argument
+# FLAGS_LINKER_CHECK_ARGUMENTS([ARGUMENT], [RUN-IF-TRUE],
+# [RUN-IF-FALSE])
+# ------------------------------------------------------------
+# Check that the linker support an argument
+
+
#
@@ -4253,7 +4308,7 @@ TOOLCHAIN_DESCRIPTION_xlc="IBM XL C/C++"
#CUSTOM_AUTOCONF_INCLUDE
# Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1399969244
+DATE_WHEN_GENERATED=1402614845
###############################################################################
#
@@ -40264,6 +40319,8 @@ $as_echo "$as_me: Rewriting BUILD_LD to \"$new_complete\"" >&6;}
+
+
# The package path is used only on macosx?
# FIXME: clean this up, and/or move it elsewhere.
PACKAGE_PATH=/opt/local
@@ -40289,6 +40346,242 @@ $as_echo "$as_me: Rewriting BUILD_LD to \"$new_complete\"" >&6;}
# If this is a --hash-style=gnu system, use --hash-style=both, why?
HAS_GNU_HASH=`$CC -dumpspecs 2>/dev/null | $GREP 'hash-style=gnu'`
# This is later checked when setting flags.
+
+ # "-Og" suppported for GCC 4.8 and later
+ CFLAG_OPTIMIZE_DEBUG_FLAG="-Og"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports \"$CFLAG_OPTIMIZE_DEBUG_FLAG\"" >&5
+$as_echo_n "checking if compiler supports \"$CFLAG_OPTIMIZE_DEBUG_FLAG\"... " >&6; }
+ supports=yes
+
+ saved_cflags="$CFLAGS"
+ CFLAGS="$CFLAGS $CFLAG_OPTIMIZE_DEBUG_FLAG"
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ supports=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ CFLAGS="$saved_cflags"
+
+ saved_cxxflags="$CXXFLAGS"
+ CXXFLAGS="$CXXFLAG $CFLAG_OPTIMIZE_DEBUG_FLAG"
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int i;
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+ supports=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ CXXFLAGS="$saved_cxxflags"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supports" >&5
+$as_echo "$supports" >&6; }
+ if test "x$supports" = "xyes" ; then
+ HAS_CFLAG_OPTIMIZE_DEBUG=true
+ else
+ HAS_CFLAG_OPTIMIZE_DEBUG=false
+ fi
+
+
+ # "-fsanitize=undefined" supported for GCC 4.9 and later
+ CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG="-fsanitize=undefined -fsanitize-recover"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports \"$CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG\"" >&5
+$as_echo_n "checking if compiler supports \"$CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG\"... " >&6; }
+ supports=yes
+
+ saved_cflags="$CFLAGS"
+ CFLAGS="$CFLAGS $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG"
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ supports=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ CFLAGS="$saved_cflags"
+
+ saved_cxxflags="$CXXFLAGS"
+ CXXFLAGS="$CXXFLAG $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG"
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int i;
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+ supports=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ CXXFLAGS="$saved_cxxflags"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supports" >&5
+$as_echo "$supports" >&6; }
+ if test "x$supports" = "xyes" ; then
+ HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR=true
+ else
+ HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR=false
+ fi
+
+
+ # "-z relro" supported in GNU binutils 2.17 and later
+ LINKER_RELRO_FLAG="-Xlinker -z -Xlinker relro"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if linker supports \"$LINKER_RELRO_FLAG\"" >&5
+$as_echo_n "checking if linker supports \"$LINKER_RELRO_FLAG\"... " >&6; }
+ supports=yes
+
+ saved_ldflags="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $LINKER_RELRO_FLAG"
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+else
+ supports=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ LDFLAGS="$saved_ldflags"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supports" >&5
+$as_echo "$supports" >&6; }
+ if test "x$supports" = "xyes" ; then
+ HAS_LINKER_RELRO=true
+ else
+ HAS_LINKER_RELRO=false
+ fi
+
+
+ # "-z now" supported in GNU binutils 2.11 and later
+ LINKER_NOW_FLAG="-Xlinker -z -Xlinker now"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if linker supports \"$LINKER_NOW_FLAG\"" >&5
+$as_echo_n "checking if linker supports \"$LINKER_NOW_FLAG\"... " >&6; }
+ supports=yes
+
+ saved_ldflags="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $LINKER_NOW_FLAG"
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+else
+ supports=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ LDFLAGS="$saved_ldflags"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supports" >&5
+$as_echo "$supports" >&6; }
+ if test "x$supports" = "xyes" ; then
+ HAS_LINKER_NOW=true
+ else
+ HAS_LINKER_NOW=false
+ fi
+
fi
# Check for broken SuSE 'ld' for which 'Only anonymous version tag is allowed
@@ -40297,8 +40590,8 @@ $as_echo "$as_me: Rewriting BUILD_LD to \"$new_complete\"" >&6;}
if test "x$OPENJDK_TARGET_OS" = xlinux && test "x$TOOLCHAIN_TYPE" = xgcc; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken SuSE 'ld' which only understands anonymous version tags in executables" >&5
$as_echo_n "checking for broken SuSE 'ld' which only understands anonymous version tags in executables... " >&6; }
- echo "SUNWprivate_1.1 { local: *; };" > version-script.map
- echo "int main() { }" > main.c
+ $ECHO "SUNWprivate_1.1 { local: *; };" > version-script.map
+ $ECHO "int main() { }" > main.c
if $CXX -Xlinker -version-script=version-script.map main.c 2>&5 >&5; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
@@ -40768,8 +41061,8 @@ $as_echo "$tool_specified" >&6; }
if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
- # FIXME: likely bug, should be CCXXFLAGS_JDK? or one for C or CXX.
- CCXXFLAGS="$CCXXFLAGS -nologo"
+ # silence copyright notice and other headers.
+ COMMON_CCXXFLAGS="$COMMON_CCXXFLAGS -nologo"
fi
if test "x$SYSROOT" != "x"; then
@@ -40803,7 +41096,6 @@ $as_echo "$tool_specified" >&6; }
# Now we can test some aspects on the target using configure macros.
-
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
$as_echo_n "checking for ANSI C header files... " >&6; }
if ${ac_cv_header_stdc+:} false; then :
@@ -41488,6 +41780,7 @@ $as_echo "$ac_cv_c_bigendian" >&6; }
# Debug symbols
if test "x$TOOLCHAIN_TYPE" = xgcc; then
if test "x$OPENJDK_TARGET_CPU_BITS" = "x64" && test "x$DEBUG_LEVEL" = "xfastdebug"; then
+ # reduce from default "-g2" option to save space
CFLAGS_DEBUG_SYMBOLS="-g1"
CXXFLAGS_DEBUG_SYMBOLS="-g1"
else
@@ -41499,6 +41792,7 @@ $as_echo "$ac_cv_c_bigendian" >&6; }
CXXFLAGS_DEBUG_SYMBOLS="-g"
elif test "x$TOOLCHAIN_TYPE" = xsolstudio; then
CFLAGS_DEBUG_SYMBOLS="-g -xs"
+ # FIXME: likely a bug, this disables debug symbols rather than enables them
CXXFLAGS_DEBUG_SYMBOLS="-g0 -xs"
elif test "x$TOOLCHAIN_TYPE" = xxlc; then
CFLAGS_DEBUG_SYMBOLS="-g"
@@ -41507,6 +41801,31 @@ $as_echo "$ac_cv_c_bigendian" >&6; }
+ # bounds, memory and behavior checking options
+ if test "x$TOOLCHAIN_TYPE" = xgcc; then
+ case $DEBUG_LEVEL in
+ release )
+ # no adjustment
+ ;;
+ fastdebug )
+ # Add compile time bounds checks.
+ CFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1"
+ CXXFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1"
+ ;;
+ slowdebug )
+ # Add runtime bounds checks and symbol info.
+ CFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all --param ssp-buffer-size=1"
+ CXXFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all --param ssp-buffer-size=1"
+ if test "x$HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR" = "xtrue"; then
+ CFLAGS_DEBUG_OPTIONS="$CFLAGS_DEBUG_OPTIONS $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG"
+ CXXFLAGS_DEBUG_OPTIONS="$CXXFLAGS_DEBUG_OPTIONS $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG"
+ fi
+ ;;
+ esac
+ fi
+
+
+
# Optimization levels
if test "x$TOOLCHAIN_TYPE" = xsolstudio; then
CC_HIGHEST="$CC_HIGHEST -fns -fsimple -fsingle -xbuiltin=%all -xdepend -xrestrict -xlibmil"
@@ -41516,10 +41835,12 @@ $as_echo "$ac_cv_c_bigendian" >&6; }
C_O_FLAG_HIGHEST="-xO4 -Wu,-O4~yz $CC_HIGHEST -xalias_level=basic -xregs=no%frameptr"
C_O_FLAG_HI="-xO4 -Wu,-O4~yz -xregs=no%frameptr"
C_O_FLAG_NORM="-xO2 -Wu,-O2~yz -xregs=no%frameptr"
+ C_O_FLAG_DEBUG="-xregs=no%frameptr"
C_O_FLAG_NONE="-xregs=no%frameptr"
CXX_O_FLAG_HIGHEST="-xO4 -Qoption ube -O4~yz $CC_HIGHEST -xregs=no%frameptr"
CXX_O_FLAG_HI="-xO4 -Qoption ube -O4~yz -xregs=no%frameptr"
CXX_O_FLAG_NORM="-xO2 -Qoption ube -O2~yz -xregs=no%frameptr"
+ CXX_O_FLAG_DEBUG="-xregs=no%frameptr"
CXX_O_FLAG_NONE="-xregs=no%frameptr"
if test "x$OPENJDK_TARGET_CPU_BITS" = "x32"; then
C_O_FLAG_HIGHEST="$C_O_FLAG_HIGHEST -xchip=pentium"
@@ -41529,10 +41850,12 @@ $as_echo "$ac_cv_c_bigendian" >&6; }
C_O_FLAG_HIGHEST="-xO4 -Wc,-Qrm-s -Wc,-Qiselect-T0 $CC_HIGHEST -xalias_level=basic -xprefetch=auto,explicit -xchip=ultra"
C_O_FLAG_HI="-xO4 -Wc,-Qrm-s -Wc,-Qiselect-T0"
C_O_FLAG_NORM="-xO2 -Wc,-Qrm-s -Wc,-Qiselect-T0"
+ C_O_FLAG_DEBUG=""
C_O_FLAG_NONE=""
CXX_O_FLAG_HIGHEST="-xO4 -Qoption cg -Qrm-s -Qoption cg -Qiselect-T0 $CC_HIGHEST -xprefetch=auto,explicit -xchip=ultra"
CXX_O_FLAG_HI="-xO4 -Qoption cg -Qrm-s -Qoption cg -Qiselect-T0"
CXX_O_FLAG_NORM="-xO2 -Qoption cg -Qrm-s -Qoption cg -Qiselect-T0"
+ C_O_FLAG_DEBUG=""
CXX_O_FLAG_NONE=""
fi
else
@@ -41545,13 +41868,17 @@ $as_echo "$ac_cv_c_bigendian" >&6; }
C_O_FLAG_HIGHEST="-Os"
C_O_FLAG_HI="-Os"
C_O_FLAG_NORM="-Os"
- C_O_FLAG_NONE=""
else
C_O_FLAG_HIGHEST="-O3"
C_O_FLAG_HI="-O3"
C_O_FLAG_NORM="-O2"
- C_O_FLAG_NONE="-O0"
fi
+ if test "x$HAS_CFLAG_OPTIMIZE_DEBUG" = "xtrue"; then
+ C_O_FLAG_DEBUG="$CFLAG_OPTIMIZE_DEBUG_FLAG"
+ else
+ C_O_FLAG_DEBUG="-O0"
+ fi
+ C_O_FLAG_NONE="-O0"
elif test "x$TOOLCHAIN_TYPE" = xclang; then
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
# On MacOSX we optimize for size, something
@@ -41559,30 +41886,56 @@ $as_echo "$ac_cv_c_bigendian" >&6; }
C_O_FLAG_HIGHEST="-Os"
C_O_FLAG_HI="-Os"
C_O_FLAG_NORM="-Os"
- C_O_FLAG_NONE=""
else
C_O_FLAG_HIGHEST="-O3"
C_O_FLAG_HI="-O3"
C_O_FLAG_NORM="-O2"
- C_O_FLAG_NONE="-O0"
fi
+ C_O_FLAG_DEBUG="-O0"
+ C_O_FLAG_NONE="-O0"
elif test "x$TOOLCHAIN_TYPE" = xxlc; then
C_O_FLAG_HIGHEST="-O3"
C_O_FLAG_HI="-O3 -qstrict"
C_O_FLAG_NORM="-O2"
- C_O_FLAG_NONE=""
+ C_O_FLAG_DEBUG="-qnoopt"
+ C_O_FLAG_NONE="-qnoop"
elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
C_O_FLAG_HIGHEST="-O2"
C_O_FLAG_HI="-O1"
C_O_FLAG_NORM="-O1"
+ C_O_FLAG_DEBUG="-Od"
C_O_FLAG_NONE="-Od"
fi
CXX_O_FLAG_HIGHEST="$C_O_FLAG_HIGHEST"
CXX_O_FLAG_HI="$C_O_FLAG_HI"
CXX_O_FLAG_NORM="$C_O_FLAG_NORM"
+ CXX_O_FLAG_DEBUG="$C_O_FLAG_DEBUG"
CXX_O_FLAG_NONE="$C_O_FLAG_NONE"
fi
+ # Adjust optimization flags according to debug level.
+ case $DEBUG_LEVEL in
+ release )
+ # no adjustment
+ ;;
+ fastdebug )
+ # Not quite so much optimization
+ C_O_FLAG_HI="$C_O_FLAG_NORM"
+ CXX_O_FLAG_HI="$CXX_O_FLAG_NORM"
+ ;;
+ slowdebug )
+ # Disable optimization
+ C_O_FLAG_HIGHEST="$C_O_FLAG_DEBUG"
+ C_O_FLAG_HI="$C_O_FLAG_DEBUG"
+ C_O_FLAG_NORM="$C_O_FLAG_DEBUG"
+ CXX_O_FLAG_HIGHEST="$CXX_O_FLAG_DEBUG"
+ CXX_O_FLAG_HI="$CXX_O_FLAG_DEBUG"
+ CXX_O_FLAG_NORM="$CXX_O_FLAG_DEBUG"
+ ;;
+ esac
+
+
+
@@ -41660,11 +42013,12 @@ fi
# Later we will also have CFLAGS and LDFLAGS for the hotspot subrepo build.
#
- # Setup compiler/platform specific flags to CFLAGS_JDK,
- # CXXFLAGS_JDK and CCXXFLAGS_JDK (common to C and CXX?)
+ # Setup compiler/platform specific flags into
+ # CFLAGS_JDK - C Compiler flags
+ # CXXFLAGS_JDK - C++ Compiler flags
+ # COMMON_CCXXFLAGS_JDK - common to C and C++
if test "x$TOOLCHAIN_TYPE" = xgcc; then
- # these options are used for both C and C++ compiles
- CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -Wall -Wno-parentheses -Wextra -Wno-unused -Wno-unused-parameter -Wformat=2 \
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS $COMMON_CCXXFLAGS_JDK -Wall -Wno-parentheses -Wextra -Wno-unused -Wno-unused-parameter -Wformat=2 \
-pipe -D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE64_SOURCE"
case $OPENJDK_TARGET_CPU_ARCH in
arm )
@@ -41676,14 +42030,14 @@ fi
CFLAGS_JDK="${CFLAGS_JDK} -fno-strict-aliasing"
;;
* )
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -fno-omit-frame-pointer"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -fno-omit-frame-pointer"
CFLAGS_JDK="${CFLAGS_JDK} -fno-strict-aliasing"
;;
esac
elif test "x$TOOLCHAIN_TYPE" = xsolstudio; then
- CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -DTRACING -DMACRO_MEMSYS_OPS -DBREAKPTS"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS $COMMON_CCXXFLAGS_JDK -DTRACING -DMACRO_MEMSYS_OPS -DBREAKPTS"
if test "x$OPENJDK_TARGET_CPU_ARCH" = xx86; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DcpuIntel -Di586 -D$OPENJDK_TARGET_CPU_LEGACY_LIB"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DcpuIntel -Di586 -D$OPENJDK_TARGET_CPU_LEGACY_LIB"
CFLAGS_JDK="$CFLAGS_JDK -erroff=E_BAD_PRAGMA_PACK_VALUE"
fi
@@ -41693,14 +42047,14 @@ fi
CFLAGS_JDK="$CFLAGS_JDK -D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE64_SOURCE -DSTDC"
CXXFLAGS_JDK="$CXXFLAGS_JDK -D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE64_SOURCE -DSTDC"
elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
- CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -Zi -MD -Zc:wchar_t- -W3 -wd4800 \
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS $COMMON_CCXXFLAGS_JDK -Zi -MD -Zc:wchar_t- -W3 -wd4800 \
-D_STATIC_CPPLIB -D_DISABLE_DEPRECATE_STATIC_CPPLIB -DWIN32_LEAN_AND_MEAN \
-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE \
-DWIN32 -DIAL"
if test "x$OPENJDK_TARGET_CPU" = xx86_64; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_AMD64_ -Damd64"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_AMD64_ -Damd64"
else
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_X86_ -Dx86"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_X86_ -Dx86"
fi
fi
@@ -41708,28 +42062,20 @@ fi
# Adjust flags according to debug level.
case $DEBUG_LEVEL in
- fastdebug )
- CFLAGS_JDK="$CFLAGS_JDK $CFLAGS_DEBUG_SYMBOLS"
- CXXFLAGS_JDK="$CXXFLAGS_JDK $CXXFLAGS_DEBUG_SYMBOLS"
- C_O_FLAG_HI="$C_O_FLAG_NORM"
- C_O_FLAG_NORM="$C_O_FLAG_NORM"
- CXX_O_FLAG_HI="$CXX_O_FLAG_NORM"
- CXX_O_FLAG_NORM="$CXX_O_FLAG_NORM"
+ fastdebug | slowdebug )
+ CFLAGS_JDK="$CFLAGS_JDK $CFLAGS_DEBUG_SYMBOLS $CFLAGS_DEBUG_OPTIONS"
+ CXXFLAGS_JDK="$CXXFLAGS_JDK $CXXFLAGS_DEBUG_SYMBOLS $CXXFLAGS_DEBUG_OPTIONS"
JAVAC_FLAGS="$JAVAC_FLAGS -g"
;;
- slowdebug )
- CFLAGS_JDK="$CFLAGS_JDK $CFLAGS_DEBUG_SYMBOLS"
- CXXFLAGS_JDK="$CXXFLAGS_JDK $CXXFLAGS_DEBUG_SYMBOLS"
- C_O_FLAG_HI="$C_O_FLAG_NONE"
- C_O_FLAG_NORM="$C_O_FLAG_NONE"
- CXX_O_FLAG_HI="$CXX_O_FLAG_NONE"
- CXX_O_FLAG_NORM="$CXX_O_FLAG_NONE"
- JAVAC_FLAGS="$JAVAC_FLAGS -g"
+ release )
+ ;;
+ * )
+ as_fn_error $? "Unrecognized \$DEBUG_LEVEL: $DEBUG_LEVEL" "$LINENO" 5
;;
esac
# Setup LP64
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK $ADD_LP64"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK $ADD_LP64"
# Set some common defines. These works for all compilers, but assume
# -D is universally accepted.
@@ -41742,49 +42088,49 @@ fi
# Note: -Dmacro is the same as #define macro 1
# -Dmacro= is the same as #define macro
if test "x$OPENJDK_TARGET_OS" = xsolaris; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_LITTLE_ENDIAN="
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_LITTLE_ENDIAN="
else
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_LITTLE_ENDIAN"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_LITTLE_ENDIAN"
fi
else
# Same goes for _BIG_ENDIAN. Do we really need to set *ENDIAN on Solaris if they
# are defined in the system?
if test "x$OPENJDK_TARGET_OS" = xsolaris; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_BIG_ENDIAN="
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_BIG_ENDIAN="
else
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_BIG_ENDIAN"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_BIG_ENDIAN"
fi
fi
# Setup target OS define. Use OS target name but in upper case.
OPENJDK_TARGET_OS_UPPERCASE=`$ECHO $OPENJDK_TARGET_OS | $TR 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D$OPENJDK_TARGET_OS_UPPERCASE"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D$OPENJDK_TARGET_OS_UPPERCASE"
# Setup target CPU
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DARCH='\"$OPENJDK_TARGET_CPU_LEGACY\"' -D$OPENJDK_TARGET_CPU_LEGACY"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DARCH='\"$OPENJDK_TARGET_CPU_LEGACY\"' -D$OPENJDK_TARGET_CPU_LEGACY"
# Setup debug/release defines
if test "x$DEBUG_LEVEL" = xrelease; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DNDEBUG"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DNDEBUG"
if test "x$OPENJDK_TARGET_OS" = xsolaris; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DTRIMMED"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DTRIMMED"
fi
else
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DDEBUG"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DDEBUG"
fi
# Setup release name
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DRELEASE='\"\$(RELEASE)\"'"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DRELEASE='\"\$(RELEASE)\"'"
# Set some additional per-OS defines.
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_ALLBSD_SOURCE -D_DARWIN_UNLIMITED_SELECT"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_ALLBSD_SOURCE -D_DARWIN_UNLIMITED_SELECT"
elif test "x$OPENJDK_TARGET_OS" = xaix; then
# FIXME: PPC64 should not be here.
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DPPC64"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DPPC64"
elif test "x$OPENJDK_TARGET_OS" = xbsd; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_ALLBSD_SOURCE"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_ALLBSD_SOURCE"
fi
# Additional macosx handling
@@ -41803,13 +42149,13 @@ fi
# The macro takes the version with no dots, ex: 1070
# Let the flags variables get resolved in make for easier override on make
# command line.
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DMAC_OS_X_VERSION_MAX_ALLOWED=\$(subst .,,\$(MACOSX_VERSION_MIN)) -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DMAC_OS_X_VERSION_MAX_ALLOWED=\$(subst .,,\$(MACOSX_VERSION_MIN)) -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
LDFLAGS_JDK="$LDFLAGS_JDK -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
fi
fi
# Setup some hard coded includes
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK \
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK \
-I${JDK_OUTPUTDIR}/include \
-I${JDK_OUTPUTDIR}/include/$OPENJDK_TARGET_OS \
-I${JDK_TOPDIR}/src/share/javavm/export \
@@ -41818,12 +42164,12 @@ fi
-I${JDK_TOPDIR}/src/$OPENJDK_TARGET_OS_API_DIR/native/common"
# The shared libraries are compiled using the picflag.
- CFLAGS_JDKLIB="$CCXXFLAGS_JDK $CFLAGS_JDK $PICFLAG $CFLAGS_JDKLIB_EXTRA"
- CXXFLAGS_JDKLIB="$CCXXFLAGS_JDK $CXXFLAGS_JDK $PICFLAG $CXXFLAGS_JDKLIB_EXTRA "
+ CFLAGS_JDKLIB="$COMMON_CCXXFLAGS_JDK $CFLAGS_JDK $PICFLAG $CFLAGS_JDKLIB_EXTRA"
+ CXXFLAGS_JDKLIB="$COMMON_CCXXFLAGS_JDK $CXXFLAGS_JDK $PICFLAG $CXXFLAGS_JDKLIB_EXTRA "
# Executable flags
- CFLAGS_JDKEXE="$CCXXFLAGS_JDK $CFLAGS_JDK"
- CXXFLAGS_JDKEXE="$CCXXFLAGS_JDK $CXXFLAGS_JDK"
+ CFLAGS_JDKEXE="$COMMON_CCXXFLAGS_JDK $CFLAGS_JDK"
+ CXXFLAGS_JDKEXE="$COMMON_CCXXFLAGS_JDK $CXXFLAGS_JDK"
@@ -41832,6 +42178,7 @@ fi
# Setup LDFLAGS et al.
#
+
# Now this is odd. The JDK native libraries have to link against libjvm.so
# On 32-bit machines there is normally two distinct libjvm.so:s, client and server.
# Which should we link to? Are we lucky enough that the binary api to the libjvm.so library
@@ -41847,39 +42194,94 @@ fi
fi
# TODO: make -debug optional "--disable-full-debug-symbols"
LDFLAGS_JDK="$LDFLAGS_JDK -debug"
- LDFLAGS_JDKLIB="${LDFLAGS_JDK} -dll -libpath:${JDK_OUTPUTDIR}/lib"
- LDFLAGS_JDKLIB_SUFFIX=""
+ elif test "x$TOOLCHAIN_TYPE" = xgcc; then
+ # If this is a --hash-style=gnu system, use --hash-style=both, why?
+ # We have previously set HAS_GNU_HASH if this is the case
+ if test -n "$HAS_GNU_HASH"; then
+ LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both"
+ fi
+ if test "x$OPENJDK_TARGET_OS" = xlinux; then
+ # And since we now know that the linker is gnu, then add -z defs, to forbid
+ # undefined symbols in object files.
+ LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs"
+ case $DEBUG_LEVEL in
+ release )
+ # tell linker to optimize libraries.
+ # Should this be supplied to the OSS linker as well?
+ LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -O1"
+ ;;
+ slowdebug )
+ if test "x$HAS_LINKER_NOW" = "xtrue"; then
+ # do relocations at load
+ LDFLAGS_JDK="$LDFLAGS_JDK $LINKER_NOW_FLAG"
+ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK $LINKER_NOW_FLAG"
+ fi
+ if test "x$HAS_LINKER_RELRO" = "xtrue"; then
+ # mark relocations read only
+ LDFLAGS_JDK="$LDFLAGS_JDK $LINKER_RELRO_FLAG"
+ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK $LINKER_RELRO_FLAG"
+ fi
+ ;;
+ fastdebug )
+ if test "x$HAS_LINKER_RELRO" = "xtrue"; then
+ # mark relocations read only
+ LDFLAGS_JDK="$LDFLAGS_JDK $LINKER_RELRO_FLAG"
+ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK $LINKER_RELRO_FLAG"
+ fi
+ ;;
+ * )
+ as_fn_error $? "Unrecognized \$DEBUG_LEVEL: $DEBUG_LEVEL" "$LINENO" 5
+ ;;
+ esac
+ fi
+ elif test "x$TOOLCHAIN_TYPE" = xsolstudio; then
+ LDFLAGS_JDK="$LDFLAGS_JDK -z defs -xildoff -ztext"
+ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK -norunpath -xnolib"
+ fi
+
+ if test "x$TOOLCHAIN_TYPE" = xgcc || test "x$TOOLCHAIN_TYPE" = xclang; then
+ # If undefined behaviour detection is enabled then we need to tell linker.
+ case $DEBUG_LEVEL in
+ release | fastdebug )
+ ;;
+ slowdebug )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR" >&5
+$as_echo "$as_me: WARNING: $HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR" >&2;}
+ if test "x$HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR" = "xtrue"; then
+ # enable undefined behaviour checking
+ LDFLAGS_JDK="$LDFLAGS_JDK `$ECHO -n $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG | sed -e "s/ *\(^ \+\)/ -Xlinker \1/g"`"
+ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK `$ECHO -n $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG | sed -e "s/ *\(^ \+\)/ -Xlinker \1/g"`"
+ fi
+ ;;
+ * )
+ as_fn_error $? "Unrecognized \$DEBUG_LEVEL: $DEBUG_LEVEL" "$LINENO" 5
+ ;;
+ esac
+ fi
+
+ # Customize LDFLAGS for executables
+
+ LDFLAGS_JDKEXE="${LDFLAGS_JDK}"
+
+ if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
if test "x$OPENJDK_TARGET_CPU_BITS" = "x64"; then
LDFLAGS_STACK_SIZE=1048576
else
LDFLAGS_STACK_SIZE=327680
fi
- LDFLAGS_JDKEXE="${LDFLAGS_JDK} /STACK:$LDFLAGS_STACK_SIZE"
+ LDFLAGS_JDKEXE="${LDFLAGS_JDKEXE} /STACK:$LDFLAGS_STACK_SIZE"
+ elif test "x$OPENJDK_TARGET_OS" = xlinux; then
+ LDFLAGS_JDKEXE="$LDFLAGS_JDKEXE -Xlinker --allow-shlib-undefined"
+ fi
+
+ # Customize LDFLAGS for libs
+ LDFLAGS_JDKLIB="${LDFLAGS_JDK}"
+
+ if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
+ LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} -dll -libpath:${JDK_OUTPUTDIR}/lib"
+ LDFLAGS_JDKLIB_SUFFIX=""
else
- if test "x$TOOLCHAIN_TYPE" = xgcc; then
- # If this is a --hash-style=gnu system, use --hash-style=both, why?
- # We have previously set HAS_GNU_HASH if this is the case
- if test -n "$HAS_GNU_HASH"; then
- LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both "
- fi
- if test "x$OPENJDK_TARGET_OS" = xlinux; then
- # And since we now know that the linker is gnu, then add -z defs, to forbid
- # undefined symbols in object files.
- LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs"
- if test "x$DEBUG_LEVEL" = "xrelease"; then
- # When building release libraries, tell the linker optimize them.
- # Should this be supplied to the OSS linker as well?
- LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -O1"
- fi
- fi
- fi
-
- if test "x$TOOLCHAIN_TYPE" = xsolstudio; then
- LDFLAGS_JDK="$LDFLAGS_JDK -z defs -xildoff -ztext"
- LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK -norunpath -xnolib"
- fi
-
- LDFLAGS_JDKLIB="${LDFLAGS_JDK} $SHARED_LIBRARY_FLAGS \
+ LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} ${SHARED_LIBRARY_FLAGS} \
-L${JDK_OUTPUTDIR}/lib${OPENJDK_TARGET_CPU_LIBDIR}"
# On some platforms (mac) the linker warns about non existing -L dirs.
@@ -41900,11 +42302,6 @@ fi
if test "x$TOOLCHAIN_TYPE" = xsolstudio; then
LDFLAGS_JDKLIB_SUFFIX="$LDFLAGS_JDKLIB_SUFFIX -lc"
fi
-
- LDFLAGS_JDKEXE="${LDFLAGS_JDK}"
- if test "x$OPENJDK_TARGET_OS" = xlinux; then
- LDFLAGS_JDKEXE="$LDFLAGS_JDKEXE -Xlinker --allow-shlib-undefined"
- fi
fi
diff --git a/common/autoconf/toolchain.m4 b/common/autoconf/toolchain.m4
index b7c00d4f495..4686517151b 100644
--- a/common/autoconf/toolchain.m4
+++ b/common/autoconf/toolchain.m4
@@ -24,11 +24,11 @@
#
########################################################################
-# This file is responsible for detecting, verifying and setting up the
-# toolchain, i.e. the compiler, linker and related utilities. It will setup
+# This file is responsible for detecting, verifying and setting up the
+# toolchain, i.e. the compiler, linker and related utilities. It will setup
# proper paths to the binaries, but it will not setup any flags.
#
-# The binaries used is determined by the toolchain type, which is the family of
+# The binaries used is determined by the toolchain type, which is the family of
# compilers and related tools that are used.
########################################################################
@@ -83,7 +83,7 @@ AC_DEFUN([TOOLCHAIN_SETUP_FILENAME_PATTERNS],
AC_SUBST(SHARED_LIBRARY)
AC_SUBST(STATIC_LIBRARY)
AC_SUBST(OBJ_SUFFIX)
- AC_SUBST(EXE_SUFFIX)
+ AC_SUBST(EXE_SUFFIX)
])
# Determine which toolchain type to use, and make sure it is valid for this
@@ -117,7 +117,7 @@ AC_DEFUN_ONCE([TOOLCHAIN_DETERMINE_TOOLCHAIN_TYPE],
# First toolchain type in the list is the default
DEFAULT_TOOLCHAIN=${VALID_TOOLCHAINS%% *}
fi
-
+
if test "x$with_toolchain_type" = xlist; then
# List all toolchains
AC_MSG_NOTICE([The following toolchains are valid on this platform:])
@@ -126,7 +126,7 @@ AC_DEFUN_ONCE([TOOLCHAIN_DETERMINE_TOOLCHAIN_TYPE],
TOOLCHAIN_DESCRIPTION=${!toolchain_var_name}
$PRINTF " %-10s %s\n" $toolchain "$TOOLCHAIN_DESCRIPTION"
done
-
+
exit 0
elif test "x$with_toolchain_type" != x; then
# User override; check that it is valid
@@ -168,10 +168,10 @@ AC_DEFUN_ONCE([TOOLCHAIN_DETERMINE_TOOLCHAIN_TYPE],
AC_MSG_NOTICE([Using default toolchain $TOOLCHAIN_TYPE ($TOOLCHAIN_DESCRIPTION)])
else
AC_MSG_NOTICE([Using user selected toolchain $TOOLCHAIN_TYPE ($TOOLCHAIN_DESCRIPTION). Default toolchain is $DEFAULT_TOOLCHAIN.])
- fi
+ fi
])
-# Before we start detecting the toolchain executables, we might need some
+# Before we start detecting the toolchain executables, we might need some
# special setup, e.g. additional paths etc.
AC_DEFUN_ONCE([TOOLCHAIN_PRE_DETECTION],
[
@@ -184,7 +184,7 @@ AC_DEFUN_ONCE([TOOLCHAIN_PRE_DETECTION],
ORG_OBJCFLAGS="$OBJCFLAGS"
# On Windows, we need to detect the visual studio installation first.
- # This will change the PATH, but we need to keep that new PATH even
+ # This will change the PATH, but we need to keep that new PATH even
# after toolchain detection is done, since the compiler (on x86) uses
# it for DLL resolution in runtime.
if test "x$OPENJDK_BUILD_OS" = "xwindows" && test "x$TOOLCHAIN_TYPE" = "xmicrosoft"; then
@@ -208,7 +208,7 @@ AC_DEFUN_ONCE([TOOLCHAIN_PRE_DETECTION],
PATH="/usr/ccs/bin:$PATH"
fi
- # Finally add TOOLCHAIN_PATH at the beginning, to allow --with-tools-dir to
+ # Finally add TOOLCHAIN_PATH at the beginning, to allow --with-tools-dir to
# override all other locations.
if test "x$TOOLCHAIN_PATH" != x; then
PATH=$TOOLCHAIN_PATH:$PATH
@@ -254,7 +254,7 @@ AC_DEFUN([TOOLCHAIN_CHECK_COMPILER_VERSION],
AC_MSG_NOTICE([The result from running with --version was: "$ALT_VERSION_OUTPUT"])
AC_MSG_ERROR([A $TOOLCHAIN_TYPE compiler is required. Try setting --with-tools-dir.])
fi
- # Remove usage instructions (if present), and
+ # Remove usage instructions (if present), and
# collapse compiler output into a single line
COMPILER_VERSION_STRING=`$ECHO $COMPILER_VERSION_OUTPUT | \
$SED -e 's/ *@<:@Uu@:>@sage:.*//'`
@@ -282,7 +282,7 @@ AC_DEFUN([TOOLCHAIN_CHECK_COMPILER_VERSION],
# There is no specific version flag, but all output starts with a version string.
# First line typically looks something like:
# Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86
- COMPILER_VERSION_OUTPUT=`$COMPILER 2>&1 | $HEAD -n 1 | $TR -d '\r'`
+ COMPILER_VERSION_OUTPUT=`$COMPILER 2>&1 | $HEAD -n 1 | $TR -d '\r'`
# Check that this is likely to be Microsoft CL.EXE.
$ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "Microsoft.*Compiler" > /dev/null
if test $? -ne 0; then
@@ -360,7 +360,7 @@ AC_DEFUN([TOOLCHAIN_FIND_COMPILER],
AC_MSG_NOTICE([Will use user supplied compiler $1=[$]$1])
if test "x`basename [$]$1`" = "x[$]$1"; then
# A command without a complete path is provided, search $PATH.
-
+
AC_PATH_PROGS(POTENTIAL_$1, [$]$1)
if test "x$POTENTIAL_$1" != x; then
$1=$POTENTIAL_$1
@@ -375,12 +375,12 @@ AC_DEFUN([TOOLCHAIN_FIND_COMPILER],
fi
else
# No user supplied value. Locate compiler ourselves.
-
+
# If we are cross compiling, assume cross compilation tools follows the
# cross compilation standard where they are prefixed with the autoconf
- # standard name for the target. For example the binary
+ # standard name for the target. For example the binary
# i686-sun-solaris2.10-gcc will cross compile for i686-sun-solaris2.10.
- # If we are not cross compiling, then the default compiler name will be
+ # If we are not cross compiling, then the default compiler name will be
# used.
$1=
@@ -450,9 +450,9 @@ AC_DEFUN([TOOLCHAIN_FIND_COMPILER],
TOOLCHAIN_CHECK_COMPILER_VERSION([$1], [$COMPILER_NAME])
])
-# Detect the core components of the toolchain, i.e. the compilers (CC and CXX),
-# preprocessor (CPP and CXXCPP), the linker (LD), the assembler (AS) and the
-# archiver (AR). Verify that the compilers are correct according to the
+# Detect the core components of the toolchain, i.e. the compilers (CC and CXX),
+# preprocessor (CPP and CXXCPP), the linker (LD), the assembler (AS) and the
+# archiver (AR). Verify that the compilers are correct according to the
# toolchain type.
AC_DEFUN_ONCE([TOOLCHAIN_DETECT_TOOLCHAIN_CORE],
[
@@ -529,7 +529,7 @@ AC_DEFUN_ONCE([TOOLCHAIN_DETECT_TOOLCHAIN_CORE],
])
# Setup additional tools that is considered a part of the toolchain, but not the
-# core part. Many of these are highly platform-specific and do not exist,
+# core part. Many of these are highly platform-specific and do not exist,
# and/or are not needed on all platforms.
AC_DEFUN_ONCE([TOOLCHAIN_DETECT_TOOLCHAIN_EXTRA],
[
@@ -551,7 +551,7 @@ AC_DEFUN_ONCE([TOOLCHAIN_DETECT_TOOLCHAIN_EXTRA],
AC_CHECK_PROG([DUMPBIN], [dumpbin], [dumpbin],,,)
BASIC_FIXUP_EXECUTABLE(DUMPBIN)
fi
-
+
if test "x$OPENJDK_TARGET_OS" = xsolaris; then
BASIC_PATH_PROGS(STRIP, strip)
BASIC_FIXUP_EXECUTABLE(STRIP)
@@ -559,7 +559,7 @@ AC_DEFUN_ONCE([TOOLCHAIN_DETECT_TOOLCHAIN_EXTRA],
BASIC_FIXUP_EXECUTABLE(NM)
BASIC_PATH_PROGS(GNM, gnm)
BASIC_FIXUP_EXECUTABLE(GNM)
-
+
BASIC_PATH_PROGS(MCS, mcs)
BASIC_FIXUP_EXECUTABLE(MCS)
elif test "x$OPENJDK_TARGET_OS" != xwindows; then
@@ -592,17 +592,17 @@ AC_DEFUN_ONCE([TOOLCHAIN_DETECT_TOOLCHAIN_EXTRA],
# Setup the build tools (i.e, the compiler and linker used to build programs
# that should be run on the build platform, not the target platform, as a build
-# helper). Since the non-cross-compile case uses the normal, target compilers
+# helper). Since the non-cross-compile case uses the normal, target compilers
# for this, we can only do this after these have been setup.
AC_DEFUN_ONCE([TOOLCHAIN_SETUP_BUILD_COMPILERS],
-[
+[
if test "x$COMPILE_TYPE" = "xcross"; then
# Now we need to find a C/C++ compiler that can build executables for the
# build platform. We can't use the AC_PROG_CC macro, since it can only be
# used once. Also, we need to do this without adding a tools dir to the
# path, otherwise we might pick up cross-compilers which don't use standard
# naming.
-
+
# FIXME: we should list the discovered compilers as an exclude pattern!
# If we do that, we can do this detection before POST_DETECTION, and still
# find the build compilers in the tools dir, if needed.
@@ -690,15 +690,39 @@ AC_DEFUN_ONCE([TOOLCHAIN_MISC_CHECKS],
# If this is a --hash-style=gnu system, use --hash-style=both, why?
HAS_GNU_HASH=`$CC -dumpspecs 2>/dev/null | $GREP 'hash-style=gnu'`
# This is later checked when setting flags.
+
+ # "-Og" suppported for GCC 4.8 and later
+ CFLAG_OPTIMIZE_DEBUG_FLAG="-Og"
+ FLAGS_COMPILER_CHECK_ARGUMENTS([$CFLAG_OPTIMIZE_DEBUG_FLAG],
+ [HAS_CFLAG_OPTIMIZE_DEBUG=true],
+ [HAS_CFLAG_OPTIMIZE_DEBUG=false])
+
+ # "-fsanitize=undefined" supported for GCC 4.9 and later
+ CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG="-fsanitize=undefined -fsanitize-recover"
+ FLAGS_COMPILER_CHECK_ARGUMENTS([$CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG],
+ [HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR=true],
+ [HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR=false])
+
+ # "-z relro" supported in GNU binutils 2.17 and later
+ LINKER_RELRO_FLAG="-Xlinker -z -Xlinker relro"
+ FLAGS_LINKER_CHECK_ARGUMENTS([$LINKER_RELRO_FLAG],
+ [HAS_LINKER_RELRO=true],
+ [HAS_LINKER_RELRO=false])
+
+ # "-z now" supported in GNU binutils 2.11 and later
+ LINKER_NOW_FLAG="-Xlinker -z -Xlinker now"
+ FLAGS_LINKER_CHECK_ARGUMENTS([$LINKER_NOW_FLAG],
+ [HAS_LINKER_NOW=true],
+ [HAS_LINKER_NOW=false])
fi
- # Check for broken SuSE 'ld' for which 'Only anonymous version tag is allowed
+ # Check for broken SuSE 'ld' for which 'Only anonymous version tag is allowed
# in executable.'
USING_BROKEN_SUSE_LD=no
if test "x$OPENJDK_TARGET_OS" = xlinux && test "x$TOOLCHAIN_TYPE" = xgcc; then
AC_MSG_CHECKING([for broken SuSE 'ld' which only understands anonymous version tags in executables])
- echo "SUNWprivate_1.1 { local: *; };" > version-script.map
- echo "int main() { }" > main.c
+ $ECHO "SUNWprivate_1.1 { local: *; };" > version-script.map
+ $ECHO "int main() { }" > main.c
if $CXX -Xlinker -version-script=version-script.map main.c 2>&AS_MESSAGE_LOG_FD >&AS_MESSAGE_LOG_FD; then
AC_MSG_RESULT(no)
USING_BROKEN_SUSE_LD=no
From 2613fffb871b87b1a9dce70332fba5cda452dd48 Mon Sep 17 00:00:00 2001
From: Jonathan Gibbons
Date: Mon, 16 Jun 2014 11:30:31 -0700
Subject: [PATCH 33/76] 8046369: sjavac should not use javac internal API for
starting javac
Reviewed-by: jfranck, alundblad, ohrstrom
---
.../com/sun/tools/javac/api/JavacTool.java | 4 +--
.../com/sun/tools/javac/main/Main.java | 2 +-
.../sun/tools/sjavac/comp/Dependencies.java | 6 +---
.../tools/sjavac/server/CompilerThread.java | 30 ++++++-------------
langtools/test/tools/sjavac/SJavac.java | 15 ++++++----
5 files changed, 22 insertions(+), 35 deletions(-)
diff --git a/langtools/src/share/classes/com/sun/tools/javac/api/JavacTool.java b/langtools/src/share/classes/com/sun/tools/javac/api/JavacTool.java
index 19881065604..1b9521c05ec 100644
--- a/langtools/src/share/classes/com/sun/tools/javac/api/JavacTool.java
+++ b/langtools/src/share/classes/com/sun/tools/javac/api/JavacTool.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -161,7 +161,7 @@ public final class JavacTool implements JavaCompiler {
}
}
- public static void processOptions(Context context,
+ private void processOptions(Context context,
JavaFileManager fileManager,
Iterable options)
{
diff --git a/langtools/src/share/classes/com/sun/tools/javac/main/Main.java b/langtools/src/share/classes/com/sun/tools/javac/main/Main.java
index 3cb2662f3a3..ec95d298964 100644
--- a/langtools/src/share/classes/com/sun/tools/javac/main/Main.java
+++ b/langtools/src/share/classes/com/sun/tools/javac/main/Main.java
@@ -384,7 +384,7 @@ public class Main {
/** Programmatic interface for main function.
* @param args The command line parameters.
*/
- public Result compile(String[] args,
+ protected Result compile(String[] args,
Context context,
List fileObjects,
Iterable extends Processor> processors)
diff --git a/langtools/src/share/classes/com/sun/tools/sjavac/comp/Dependencies.java b/langtools/src/share/classes/com/sun/tools/sjavac/comp/Dependencies.java
index a0eaa5268a3..2c7c5eb8eea 100644
--- a/langtools/src/share/classes/com/sun/tools/sjavac/comp/Dependencies.java
+++ b/langtools/src/share/classes/com/sun/tools/sjavac/comp/Dependencies.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -72,10 +72,6 @@ public class Dependencies {
private Dependencies(Context context) {
context.put(dependenciesKey, this);
log = Log.instance(context);
- }
-
- public void reset()
- {
deps = new HashMap<>();
explicitPackages = new HashSet<>();
publicApiPerClass = new HashMap<>();
diff --git a/langtools/src/share/classes/com/sun/tools/sjavac/server/CompilerThread.java b/langtools/src/share/classes/com/sun/tools/sjavac/server/CompilerThread.java
index 3998e51b47e..c3873c3409e 100644
--- a/langtools/src/share/classes/com/sun/tools/sjavac/server/CompilerThread.java
+++ b/langtools/src/share/classes/com/sun/tools/sjavac/server/CompilerThread.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -39,23 +39,26 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
-import java.util.Set;
import java.util.Map;
+import java.util.Set;
import java.util.concurrent.Future;
+
+import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileManager;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
+import com.sun.tools.javac.api.JavacTaskImpl;
+import com.sun.tools.javac.util.BaseFileManager;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.ListBuffer;
import com.sun.tools.javac.util.Log;
-import com.sun.tools.javac.util.BaseFileManager;
import com.sun.tools.javac.util.StringUtils;
import com.sun.tools.sjavac.comp.AttrWithDeps;
import com.sun.tools.sjavac.comp.Dependencies;
import com.sun.tools.sjavac.comp.JavaCompilerWithDeps;
-import com.sun.tools.sjavac.comp.SmartFileManager;
import com.sun.tools.sjavac.comp.ResolveWithDeps;
+import com.sun.tools.sjavac.comp.SmartFileManager;
/**
* The compiler thread maintains a JavaCompiler instance and
@@ -78,7 +81,6 @@ public class CompilerThread implements Runnable {
// The necessary classes to do a compilation.
private com.sun.tools.javac.api.JavacTool compiler;
private StandardJavaFileManager fileManager;
- private BaseFileManager fileManagerBase;
private SmartFileManager smartFileManager;
private Context context;
@@ -127,10 +129,8 @@ public class CompilerThread implements Runnable {
inUse = true;
compiler = com.sun.tools.javac.api.JavacTool.create();
fileManager = compiler.getStandardFileManager(null, null, null);
- fileManagerBase = (BaseFileManager)fileManager;
smartFileManager = new SmartFileManager(fileManager);
context = new Context();
- context.put(JavaFileManager.class, smartFileManager);
ResolveWithDeps.preRegister(context);
AttrWithDeps.preRegister(context);
JavaCompilerWithDeps.preRegister(context, this);
@@ -145,7 +145,6 @@ public class CompilerThread implements Runnable {
inUse = false;
compiler = null;
fileManager = null;
- fileManagerBase = null;
smartFileManager = null;
context = null;
subTasks = null;
@@ -315,24 +314,13 @@ public class CompilerThread implements Runnable {
com.sun.tools.javac.main.Main.Result rc = com.sun.tools.javac.main.Main.Result.OK;
try {
if (compilationUnits.size() > 0) {
- // Bind the new logger to the existing context.
- context.put(Log.outKey, stderr);
- Log.instance(context).setWriter(Log.WriterKind.NOTICE, stdout);
- Log.instance(context).setWriter(Log.WriterKind.WARNING, stderr);
- Log.instance(context).setWriter(Log.WriterKind.ERROR, stderr);
- // Process the options.
- com.sun.tools.javac.api.JavacTool.processOptions(context, smartFileManager, the_options);
- fileManagerBase.setContext(context);
smartFileManager.setVisibleSources(visibleSources);
smartFileManager.cleanArtifacts();
smartFileManager.setLog(stdout);
- Dependencies.instance(context).reset();
-
- com.sun.tools.javac.main.Main ccompiler = new com.sun.tools.javac.main.Main("javacTask", stderr);
- String[] aa = the_options.toArray(new String[0]);
// Do the compilation!
- rc = ccompiler.compile(aa, context, compilationUnits.toList(), null);
+ CompilationTask task = compiler.getTask(stderr, smartFileManager, null, the_options, null, compilationUnits, context);
+ rc = ((JavacTaskImpl) task).doCall();
while (numActiveSubTasks()>0) {
try { Thread.sleep(1000); } catch (InterruptedException e) { }
diff --git a/langtools/test/tools/sjavac/SJavac.java b/langtools/test/tools/sjavac/SJavac.java
index 5fa47ee7d51..867643e7f98 100644
--- a/langtools/test/tools/sjavac/SJavac.java
+++ b/langtools/test/tools/sjavac/SJavac.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -34,8 +34,12 @@ public
class SJavac {
public static void main(String... args) throws Exception {
- SJavac s = new SJavac();
- s.test();
+ try {
+ SJavac s = new SJavac();
+ s.test();
+ } finally {
+ System.out.println("\ntest complete\n");
+ }
}
FileSystem defaultfs = FileSystems.getDefault();
@@ -412,7 +416,7 @@ class SJavac {
}
void incrementalCompileTestFullyQualifiedRef() throws Exception {
- System.out.println("Verify that \"alfa.omega.A a;\" does create a proper dependency.");
+ System.out.println("\nVerify that \"alfa.omega.A a;\" does create a proper dependency.");
System.out.println("----------------------------------------------------------------");
populate(gensrc,
@@ -517,8 +521,7 @@ class SJavac {
if (rc == 0) throw new Exception("Expected error during compile! Did not fail!");
}
- Map collectState(Path dir) throws IOException
- {
+ Map collectState(Path dir) throws IOException {
final Map files = new HashMap<>();
Files.walkFileTree(dir, new SimpleFileVisitor() {
@Override
From ede81f43f73c844fb06a163be812e748876885af Mon Sep 17 00:00:00 2001
From: Marcus Lagergren
Date: Tue, 17 Jun 2014 11:37:03 +0200
Subject: [PATCH 34/76] 8046898: Make sure that lazy compilation is the
default, remove redundant "enable lazy compilation" flags, added warning
message if compile logging is enabled and lazy is switched off. Verified
existing test suite code coverage equivalence between lazy and eager
Reviewed-by: attila, hannesw
---
.../internal/tools/nasgen/MemberInfo.java | 6 ++-
nashorn/make/project.properties | 4 +-
.../nashorn/internal/codegen/Compiler.java | 11 ++++-
.../jdk/nashorn/internal/ir/BinaryNode.java | 2 +-
.../jdk/nashorn/internal/ir/FunctionNode.java | 7 +--
.../internal/objects/NativeObject.java | 3 ++
.../jdk/nashorn/internal/runtime/Context.java | 13 +++++
.../runtime/FinalScriptFunctionData.java | 2 +
.../nashorn/internal/runtime/PropertyMap.java | 1 +
.../RecompilableScriptFunctionData.java | 10 ++--
.../internal/runtime/ScriptObject.java | 2 +-
.../jdk/nashorn/internal/runtime/Source.java | 48 +++++++++++++------
.../internal/runtime/arrays/ArrayFilter.java | 15 ------
.../internal/runtime/logging/DebugLogger.java | 2 +-
.../test/src/UnnamedPackageTestCallback.java | 8 ++++
15 files changed, 90 insertions(+), 44 deletions(-)
diff --git a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MemberInfo.java b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MemberInfo.java
index 1132db98541..c8a929dc609 100644
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MemberInfo.java
+++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MemberInfo.java
@@ -412,6 +412,10 @@ public final class MemberInfo implements Cloneable {
}
}
}
+ break;
+
+ default:
+ break;
}
}
@@ -450,7 +454,7 @@ public final class MemberInfo implements Cloneable {
if (type.getSort() == Type.OBJECT) {
try {
- final Class clazz = Class.forName(type.getClassName(), false, myLoader);
+ final Class> clazz = Class.forName(type.getClassName(), false, myLoader);
return ScriptObject.class.isAssignableFrom(clazz);
} catch (final ClassNotFoundException cnfe) {
return false;
diff --git a/nashorn/make/project.properties b/nashorn/make/project.properties
index dd43dda4f2b..eb708a41320 100644
--- a/nashorn/make/project.properties
+++ b/nashorn/make/project.properties
@@ -283,7 +283,7 @@ run.test.jvmargs.common=\
-XX:+HeapDumpOnOutOfMemoryError
# turn on assertions for tests
-run.test.jvmargs.main=${run.test.jvmargs.common} -ea -Dnashorn.lazy
+run.test.jvmargs.main=${run.test.jvmargs.common} -ea
# extra jvmargs that might be useful for debugging
#
@@ -305,7 +305,7 @@ run.test.jvmargs.main=${run.test.jvmargs.common} -ea -Dnashorn.lazy
# -XX:+PrintNMethods
# Use best known performance options for octane
-run.test.jvmargs.octane.main=${run.test.jvmargs.common} -Dnashorn.lazy -XX:+UnlockDiagnosticVMOptions -XX:+UseNewCode -XX:TypeProfileLevel=222
+run.test.jvmargs.octane.main=${run.test.jvmargs.common} -XX:+UnlockDiagnosticVMOptions -XX:+UseNewCode -XX:TypeProfileLevel=222
# Security manager args - make sure that we run with the nashorn.policy that the build creates
run.test.jvmsecurityargs=-Xverify:all -Djava.security.manager -Djava.security.policy=${basedir}/build/nashorn.policy
diff --git a/nashorn/src/jdk/nashorn/internal/codegen/Compiler.java b/nashorn/src/jdk/nashorn/internal/codegen/Compiler.java
index 9214e7fad74..5c7757a1fa7 100644
--- a/nashorn/src/jdk/nashorn/internal/codegen/Compiler.java
+++ b/nashorn/src/jdk/nashorn/internal/codegen/Compiler.java
@@ -47,7 +47,9 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Consumer;
import java.util.logging.Level;
+
import jdk.internal.dynalink.support.NameCodec;
import jdk.nashorn.internal.codegen.ClassEmitter.Flag;
import jdk.nashorn.internal.codegen.types.Type;
@@ -421,7 +423,14 @@ public final class Compiler implements Loggable {
@Override
public DebugLogger initLogger(final Context ctxt) {
- return ctxt.getLogger(this.getClass());
+ return ctxt.getLogger(this.getClass(), new Consumer() {
+ @Override
+ public void accept(final DebugLogger newLogger) {
+ if (!Compiler.this.getScriptEnvironment()._lazy_compilation) {
+ newLogger.warning("WARNING: Running with lazy compilation switched off. This is not a default setting.");
+ }
+ }
+ });
}
ScriptEnvironment getScriptEnvironment() {
diff --git a/nashorn/src/jdk/nashorn/internal/ir/BinaryNode.java b/nashorn/src/jdk/nashorn/internal/ir/BinaryNode.java
index face386c48f..8411e263bfa 100644
--- a/nashorn/src/jdk/nashorn/internal/ir/BinaryNode.java
+++ b/nashorn/src/jdk/nashorn/internal/ir/BinaryNode.java
@@ -45,7 +45,7 @@ import jdk.nashorn.internal.parser.TokenType;
public final class BinaryNode extends Expression implements Assignment, Optimistic {
// Placeholder for "undecided optimistic ADD type". Unfortunately, we can't decide the type of ADD during optimistic
// type calculation as it can have local variables as its operands that will decide its ultimate type.
- private static final Type OPTIMISTIC_UNDECIDED_TYPE = Type.typeFor(new Object(){}.getClass());
+ private static final Type OPTIMISTIC_UNDECIDED_TYPE = Type.typeFor(new Object(){/*empty*/}.getClass());
/** Left hand side argument. */
private final Expression lhs;
diff --git a/nashorn/src/jdk/nashorn/internal/ir/FunctionNode.java b/nashorn/src/jdk/nashorn/internal/ir/FunctionNode.java
index c9c6688c26a..282c19ed0c7 100644
--- a/nashorn/src/jdk/nashorn/internal/ir/FunctionNode.java
+++ b/nashorn/src/jdk/nashorn/internal/ir/FunctionNode.java
@@ -99,7 +99,7 @@ public final class FunctionNode extends LexicalContextExpression implements Flag
BYTECODE_GENERATED,
/** method has been installed */
BYTECODE_INSTALLED
- };
+ }
/** Source of entity. */
private final Source source;
@@ -388,10 +388,11 @@ public final class FunctionNode extends LexicalContextExpression implements Flag
}
/**
- * static source name getter
+ * Static source name getter
+ *
* @param source
* @param sourceURL
- * @return
+ * @return source name
*/
public static String getSourceName(final Source source, final String sourceURL) {
return sourceURL != null ? sourceURL : source.getName();
diff --git a/nashorn/src/jdk/nashorn/internal/objects/NativeObject.java b/nashorn/src/jdk/nashorn/internal/objects/NativeObject.java
index 0d1d6861ccf..30ffbabff9e 100644
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeObject.java
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeObject.java
@@ -75,7 +75,10 @@ import jdk.nashorn.internal.runtime.linker.NashornBeansLinker;
*/
@ScriptClass("Object")
public final class NativeObject {
+ /** Methodhandle to proto getter */
public static final MethodHandle GET__PROTO__ = findOwnMH("get__proto__", ScriptObject.class, Object.class);
+
+ /** Methodhandle to proto setter */
public static final MethodHandle SET__PROTO__ = findOwnMH("set__proto__", Object.class, Object.class, Object.class);
private static final Object TO_STRING = new Object();
diff --git a/nashorn/src/jdk/nashorn/internal/runtime/Context.java b/nashorn/src/jdk/nashorn/internal/runtime/Context.java
index 369c4e6ebf2..d521598986a 100644
--- a/nashorn/src/jdk/nashorn/internal/runtime/Context.java
+++ b/nashorn/src/jdk/nashorn/internal/runtime/Context.java
@@ -1236,6 +1236,16 @@ public final class Context {
* @return debuglogger associated with that class
*/
public DebugLogger getLogger(final Class extends Loggable> clazz) {
+ return getLogger(clazz, null);
+ }
+
+ /**
+ * Get a logger, given a loggable class
+ * @param clazz a Loggable class
+ * @param initHook an init hook - if this is the first time the logger is created in the context, run the init hook
+ * @return debuglogger associated with that class
+ */
+ public DebugLogger getLogger(final Class extends Loggable> clazz, final Consumer initHook) {
final String name = getLoggerName(clazz);
DebugLogger logger = loggers.get(name);
if (logger == null) {
@@ -1244,6 +1254,9 @@ public final class Context {
}
final LoggerInfo info = env._loggers.get(name);
logger = new DebugLogger(name, info.getLevel(), info.isQuiet());
+ if (initHook != null) {
+ initHook.accept(logger);
+ }
loggers.put(name, logger);
}
return logger;
diff --git a/nashorn/src/jdk/nashorn/internal/runtime/FinalScriptFunctionData.java b/nashorn/src/jdk/nashorn/internal/runtime/FinalScriptFunctionData.java
index b4c0e01d80d..a9c915527b2 100644
--- a/nashorn/src/jdk/nashorn/internal/runtime/FinalScriptFunctionData.java
+++ b/nashorn/src/jdk/nashorn/internal/runtime/FinalScriptFunctionData.java
@@ -34,6 +34,8 @@ import java.lang.invoke.MethodType;
*/
final class FinalScriptFunctionData extends ScriptFunctionData {
+ private static final long serialVersionUID = -930632846167768864L;
+
/**
* Constructor - used for bind
*
diff --git a/nashorn/src/jdk/nashorn/internal/runtime/PropertyMap.java b/nashorn/src/jdk/nashorn/internal/runtime/PropertyMap.java
index de9f87c88d1..9641f522272 100644
--- a/nashorn/src/jdk/nashorn/internal/runtime/PropertyMap.java
+++ b/nashorn/src/jdk/nashorn/internal/runtime/PropertyMap.java
@@ -185,6 +185,7 @@ public final class PropertyMap implements Iterable, Serializable {
* properties with keys that are valid array indices.
*
* @param properties Collection of initial properties.
+ * @param className class name
* @param fieldCount Number of fields in use.
* @param fieldMaximum Number of fields available.
* @param spillLength Number of used spill slots.
diff --git a/nashorn/src/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java b/nashorn/src/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java
index c210a69078d..57a8ffa08bd 100644
--- a/nashorn/src/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java
+++ b/nashorn/src/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java
@@ -54,7 +54,6 @@ import jdk.nashorn.internal.parser.TokenType;
import jdk.nashorn.internal.runtime.logging.DebugLogger;
import jdk.nashorn.internal.runtime.logging.Loggable;
import jdk.nashorn.internal.runtime.logging.Logger;
-import jdk.nashorn.internal.runtime.options.Options;
import jdk.nashorn.internal.scripts.JS;
/**
@@ -65,9 +64,6 @@ import jdk.nashorn.internal.scripts.JS;
*/
@Logger(name="recompile")
public final class RecompilableScriptFunctionData extends ScriptFunctionData implements Loggable {
- /** Is lazy compilation enabled? TODO: this should be the default */
- public static final boolean LAZY_COMPILATION = Options.getBooleanProperty("nashorn.lazy");
-
/** Prefix used for all recompiled script classes */
public static final String RECOMPILATION_PREFIX = "Recompilation$";
@@ -240,6 +236,12 @@ public final class RecompilableScriptFunctionData extends ScriptFunctionData imp
return "function " + (name == null ? "" : name) + "() { [native code] }";
}
+ /**
+ * Setter for code and source
+ *
+ * @param code map of code, class name to class
+ * @param source source
+ */
public void setCodeAndSource(final Map> code, final Source source) {
this.source = source;
if (methodLocator != null) {
diff --git a/nashorn/src/jdk/nashorn/internal/runtime/ScriptObject.java b/nashorn/src/jdk/nashorn/internal/runtime/ScriptObject.java
index 1c71da43837..1e095d45905 100644
--- a/nashorn/src/jdk/nashorn/internal/runtime/ScriptObject.java
+++ b/nashorn/src/jdk/nashorn/internal/runtime/ScriptObject.java
@@ -2267,7 +2267,7 @@ public abstract class ScriptObject implements PropertyAccess {
if (mh != null) {
assert func != null;
- if (scopeAccess && func != null && func.isStrict()) {
+ if (scopeAccess && func.isStrict()) {
mh = bindTo(mh, UNDEFINED);
}
return new GuardedInvocation(
diff --git a/nashorn/src/jdk/nashorn/internal/runtime/Source.java b/nashorn/src/jdk/nashorn/internal/runtime/Source.java
index deec95ce0e5..b9f6fd0dba4 100644
--- a/nashorn/src/jdk/nashorn/internal/runtime/Source.java
+++ b/nashorn/src/jdk/nashorn/internal/runtime/Source.java
@@ -99,12 +99,13 @@ public final class Source implements Loggable {
// Force any access errors
data.checkPermissionAndClose();
return existingSource;
- } else {
- // All sources in cache must be fully loaded
- data.load();
- CACHE.put(newSource, newSource);
- return newSource;
}
+
+ // All sources in cache must be fully loaded
+ data.load();
+ CACHE.put(newSource, newSource);
+
+ return newSource;
} catch (final RuntimeException e) {
final Throwable cause = e.getCause();
if (cause instanceof IOException) {
@@ -291,7 +292,9 @@ public final class Source implements Loggable {
}
protected void checkPermissionAndClose() throws IOException {
- try (InputStream in = url.openStream()) {}
+ try (InputStream in = url.openStream()) {
+ // empty
+ }
debug("permission checked for ", url);
}
@@ -366,20 +369,24 @@ public final class Source implements Loggable {
}
/**
- * Returns an instance
+ * Returns a Source instance
*
* @param name source name
* @param content contents as char array
+ *
+ * @return source instance
*/
public static Source sourceFor(final String name, final char[] content) {
return new Source(name, baseName(name), new RawData(content));
}
/**
- * Returns an instance
+ * Returns a Source instance
*
* @param name source name
* @param content contents as string
+ *
+ * @return source instance
*/
public static Source sourceFor(final String name, final String content) {
return new Source(name, baseName(name), new RawData(content));
@@ -391,6 +398,8 @@ public final class Source implements Loggable {
* @param name source name
* @param url url from which source can be loaded
*
+ * @return source instance
+ *
* @throws IOException if source cannot be loaded
*/
public static Source sourceFor(final String name, final URL url) throws IOException {
@@ -404,6 +413,8 @@ public final class Source implements Loggable {
* @param url url from which source can be loaded
* @param cs Charset used to convert bytes to chars
*
+ * @return source instance
+ *
* @throws IOException if source cannot be loaded
*/
public static Source sourceFor(final String name, final URL url, final Charset cs) throws IOException {
@@ -416,6 +427,8 @@ public final class Source implements Loggable {
* @param name source name
* @param file file from which source can be loaded
*
+ * @return source instance
+ *
* @throws IOException if source cannot be loaded
*/
public static Source sourceFor(final String name, final File file) throws IOException {
@@ -429,6 +442,8 @@ public final class Source implements Loggable {
* @param file file from which source can be loaded
* @param cs Charset used to convert bytes to chars
*
+ * @return source instance
+ *
* @throws IOException if source cannot be loaded
*/
public static Source sourceFor(final String name, final File file, final Charset cs) throws IOException {
@@ -441,6 +456,9 @@ public final class Source implements Loggable {
*
* @param name source name
* @param reader reader from which source can be loaded
+ *
+ * @return source instance
+ *
* @throws IOException if source cannot be loaded
*/
public static Source sourceFor(final String name, final Reader reader) throws IOException {
@@ -542,9 +560,9 @@ public final class Source implements Loggable {
* @return Index of first character of line.
*/
private int findBOLN(final int position) {
- final char[] data = data();
+ final char[] d = data();
for (int i = position - 1; i > 0; i--) {
- final char ch = data[i];
+ final char ch = d[i];
if (ch == '\n' || ch == '\r') {
return i + 1;
@@ -560,10 +578,10 @@ public final class Source implements Loggable {
* @return Index of last character of line.
*/
private int findEOLN(final int position) {
- final char[] data = data();
- final int length = data.length;
+ final char[] d = data();
+ final int length = d.length;
for (int i = position; i < length; i++) {
- final char ch = data[i];
+ final char ch = d[i];
if (ch == '\n' || ch == '\r') {
return i - 1;
@@ -583,12 +601,12 @@ public final class Source implements Loggable {
* @return Line number.
*/
public int getLine(final int position) {
- final char[] data = data();
+ final char[] d = data();
// Line count starts at 1.
int line = 1;
for (int i = 0; i < position; i++) {
- final char ch = data[i];
+ final char ch = d[i];
// Works for both \n and \r\n.
if (ch == '\n') {
line++;
diff --git a/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayFilter.java b/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayFilter.java
index c09291ac0a6..be41673b2af 100644
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayFilter.java
+++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayFilter.java
@@ -141,21 +141,6 @@ abstract class ArrayFilter extends ArrayData {
return this;
}
- private static void printTrace(final Throwable t, final String msg) {
- final java.io.StringWriter sw = new java.io.StringWriter();
- final java.io.PrintWriter pw = new java.io.PrintWriter(sw, false);
- pw.println(msg);
- final StackTraceElement[] trace = t.getStackTrace();
- for(final StackTraceElement e: trace) {
- pw.println(" at " + e);
- if(e.getClassName().startsWith("jdk.nashorn.")) {
- break;
- }
- }
- pw.flush();
- System.out.println(sw.toString());
- }
-
@Override
public Type getOptimisticType() {
return underlying.getOptimisticType();
diff --git a/nashorn/src/jdk/nashorn/internal/runtime/logging/DebugLogger.java b/nashorn/src/jdk/nashorn/internal/runtime/logging/DebugLogger.java
index b52a0b02d4f..084f7658d28 100644
--- a/nashorn/src/jdk/nashorn/internal/runtime/logging/DebugLogger.java
+++ b/nashorn/src/jdk/nashorn/internal/runtime/logging/DebugLogger.java
@@ -540,7 +540,7 @@ public final class DebugLogger {
/**
* Shorthand for outputting a log string as log level
- * {@link java.util.logging.Level#FINE} on this logger
+ * {@link java.util.logging.Level#SEVERE} on this logger
* @param objs object array to log - use this to perform lazy concatenation to avoid unconditional toString overhead
*/
public void severe(final Object... objs) {
diff --git a/nashorn/test/src/UnnamedPackageTestCallback.java b/nashorn/test/src/UnnamedPackageTestCallback.java
index 67ab36fc45f..3b6cdf5a2bc 100644
--- a/nashorn/test/src/UnnamedPackageTestCallback.java
+++ b/nashorn/test/src/UnnamedPackageTestCallback.java
@@ -23,6 +23,14 @@
* questions.
*/
+/**
+ * Interface for callbacks used by the test suite.
+ */
public interface UnnamedPackageTestCallback {
+ /**
+ * Call function
+ * @param s string argument
+ * @return string
+ */
String call(String s);
}
From ff164ddca56ed8716bc3502b5b90f7134ba5ca2f Mon Sep 17 00:00:00 2001
From: Athijegannathan Sundararajan
Date: Tue, 17 Jun 2014 15:55:39 +0530
Subject: [PATCH 35/76] 8047035: (function() "hello")() crashes in Lexer with
jdk9
Reviewed-by: lagergren, hannesw, attila
---
.../jdk/nashorn/internal/parser/Parser.java | 16 +-------
.../jdk/nashorn/internal/parser/Token.java | 22 +++++++++++
.../RecompilableScriptFunctionData.java | 2 +-
nashorn/test/script/basic/JDK-8047035.js | 37 +++++++++++++++++++
.../test/script/basic/JDK-8047035.js.EXPECTED | 4 ++
5 files changed, 65 insertions(+), 16 deletions(-)
create mode 100644 nashorn/test/script/basic/JDK-8047035.js
create mode 100644 nashorn/test/script/basic/JDK-8047035.js.EXPECTED
diff --git a/nashorn/src/jdk/nashorn/internal/parser/Parser.java b/nashorn/src/jdk/nashorn/internal/parser/Parser.java
index b4541de5a1a..20efafbe163 100644
--- a/nashorn/src/jdk/nashorn/internal/parser/Parser.java
+++ b/nashorn/src/jdk/nashorn/internal/parser/Parser.java
@@ -680,7 +680,7 @@ loop:
*/
private FunctionNode program(final String scriptName, final boolean allowPropertyFunction) {
// Make a pseudo-token for the script holding its start and length.
- final long functionToken = Token.toDesc(FUNCTION, getProgramStartPosition(token), source.getLength());
+ final long functionToken = Token.toDesc(FUNCTION, Token.descPosition(Token.withDelimiter(token)), source.getLength());
final int functionLine = line;
// Set up the script to append elements.
@@ -710,20 +710,6 @@ loop:
return script;
}
- /**
- * Returns the start position of the program based on its first token. Normally returns the position of the token
- * itself, except in case of string tokens which report their position past their opening delimiter and thus need
- * to have one subtracted from their position.
- * @param firstToken the first token of the program
- * @return the start position of the program
- */
- private static int getProgramStartPosition(final long firstToken) {
- final int start = Token.descPosition(firstToken);
- switch(Token.descType(firstToken)) {
- case STRING: case ESCSTRING: case EXECSTRING: return start - 1;
- default: return start;
- }
- }
/**
* Directive value or null if statement is not a directive.
*
diff --git a/nashorn/src/jdk/nashorn/internal/parser/Token.java b/nashorn/src/jdk/nashorn/internal/parser/Token.java
index 0012daa6b7e..43df83b0ebe 100644
--- a/nashorn/src/jdk/nashorn/internal/parser/Token.java
+++ b/nashorn/src/jdk/nashorn/internal/parser/Token.java
@@ -60,6 +60,28 @@ public class Token {
return (int)(token >>> 32);
}
+ /**
+ * Normally returns the token itself, except in case of string tokens
+ * which report their position past their opening delimiter and thus
+ * need to have position and length adjusted.
+ *
+ * @param token Token descriptor.
+ * @return same or adjusted token.
+ */
+ public static long withDelimiter(final long token) {
+ final TokenType tokenType = Token.descType(token);
+ switch(tokenType) {
+ case STRING: case ESCSTRING: case EXECSTRING: {
+ final int start = Token.descPosition(token) - 1;
+ final int len = Token.descLength(token) + 2;
+ return toDesc(tokenType, start, len);
+ }
+ default: {
+ return token;
+ }
+ }
+ }
+
/**
* Extract token length from a token descriptor.
* @param token Token descriptor.
diff --git a/nashorn/src/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java b/nashorn/src/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java
index 57a8ffa08bd..78ee06e58ce 100644
--- a/nashorn/src/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java
+++ b/nashorn/src/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java
@@ -294,7 +294,7 @@ public final class RecompilableScriptFunctionData extends ScriptFunctionData imp
private static long tokenFor(final FunctionNode fn) {
final int position = Token.descPosition(fn.getFirstToken());
- final long lastToken = fn.getLastToken();
+ final long lastToken = Token.withDelimiter(fn.getLastToken());
// EOL uses length field to store the line number
final int length = Token.descPosition(lastToken) - position + (Token.descType(lastToken) == TokenType.EOL ? 0 : Token.descLength(lastToken));
diff --git a/nashorn/test/script/basic/JDK-8047035.js b/nashorn/test/script/basic/JDK-8047035.js
new file mode 100644
index 00000000000..dc44921ff72
--- /dev/null
+++ b/nashorn/test/script/basic/JDK-8047035.js
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8047035: (function() "hello")() crashes in Lexer with jdk9
+ *
+ * @test
+ * @run
+ */
+
+// should not print ")" at the end
+print(function() "hello");
+print(function() '');
+
+// The following should not crash inside lexer
+print((function() '')());
+print((function() "hello")());
diff --git a/nashorn/test/script/basic/JDK-8047035.js.EXPECTED b/nashorn/test/script/basic/JDK-8047035.js.EXPECTED
new file mode 100644
index 00000000000..0c4ab07b787
--- /dev/null
+++ b/nashorn/test/script/basic/JDK-8047035.js.EXPECTED
@@ -0,0 +1,4 @@
+function() "hello"
+function() ''
+
+hello
From 186990579d4ecbf094a1be6fc64280ffa8bcca37 Mon Sep 17 00:00:00 2001
From: Athijegannathan Sundararajan
Date: Tue, 17 Jun 2014 18:23:35 +0530
Subject: [PATCH 36/76] 8047057: Add a regression test for the passing test
cases from JDK-8042304
Reviewed-by: lagergren, attila
---
nashorn/test/script/basic/JDK-8047057.js | 75 ++++++++++++++++++++++++
1 file changed, 75 insertions(+)
create mode 100644 nashorn/test/script/basic/JDK-8047057.js
diff --git a/nashorn/test/script/basic/JDK-8047057.js b/nashorn/test/script/basic/JDK-8047057.js
new file mode 100644
index 00000000000..cf1263a1243
--- /dev/null
+++ b/nashorn/test/script/basic/JDK-8047057.js
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8047057: Add a regression test for the passing test cases from JDK-8042304
+ *
+ * @test
+ * @run
+ */
+
+// commented out makeFuncAndCall calls are still result in crash
+// Tests commented with //** fail only within test framework.
+// Pass fine with standalone "jjs" mode.
+
+function makeFuncAndCall(code) {
+ Function(code)();
+}
+
+function makeFuncExpectError(code, ErrorType) {
+ try {
+ makeFuncAndCall(code);
+ } catch (e) {
+ if (! (e instanceof ErrorType)) {
+ fail(ErrorType.name + " expected, got " + e);
+ }
+ }
+}
+
+// makeFuncAndCall("switch(0) { default: {break;} return }");
+// makeFuncAndCall("L: { { break L; } return; }");
+makeFuncAndCall("L: { while(0) break L; return; }");
+makeFuncExpectError("L: {while(0) break L; return [](); }", TypeError);
+// makeFuncAndCall("do with({}) break ; while(0);");
+makeFuncAndCall("while(0) with({}) continue ;");
+//** makeFuncAndCall("eval([]);");
+//** makeFuncAndCall("try{} finally{[]}");
+makeFuncAndCall("try { } catch(x if 1) { try { } catch(x2) { } }");
+makeFuncAndCall("try { } catch(x if 1) { try { return; } catch(x2) { { } } }");
+makeFuncAndCall("Error() * (false)[-0]--");
+makeFuncAndCall("try { var x = 1, x = null; } finally { }");
+makeFuncAndCall("try { var x = {}, x = []; } catch(x3) { }");
+//** makeFuncAndCall("[delete this]");
+// makeFuncAndCall("if(eval('', eval('', function() {}))) { }");
+// makeFuncAndCall("if(eval('', eval('', function() {}))) { }");
+// makeFuncAndCall("eval(\"[,,];\", [11,12,13,14].some)");
+// makeFuncAndCall("eval(\"1.2e3\", ({})[ /x/ ])");
+// makeFuncAndCall("eval(\"x4\", x3);");
+makeFuncAndCall("with({5.0000000000000000000000: String()}){(false); }");
+makeFuncAndCall("try { var x = undefined, x = 5.0000000000000000000000; } catch(x) { x = undefined; }");
+makeFuncAndCall("(function (x){ x %= this}(false))");
+// makeFuncAndCall("eval.apply.apply(function(){ eval('') })");
+makeFuncAndCall("(false % !this) && 0");
+makeFuncAndCall("with({8: 'fafafa'.replace()}){ }");
+makeFuncAndCall("(function (x) '' )(true)");
+makeFuncExpectError("new eval(function(){})", TypeError);
From f2e2245e7be9cafeaacac46168521baf5c34b2df Mon Sep 17 00:00:00 2001
From: Paul Govereau
Date: Tue, 17 Jun 2014 11:11:59 -0400
Subject: [PATCH 37/76] 8038975: Access control in enhanced for
Reviewed-by: vromero, jlahoda
---
.../com/sun/tools/javac/code/Flags.java | 8 ++-
.../com/sun/tools/javac/comp/Attr.java | 10 +--
.../sun/tools/javac/comp/DeferredAttr.java | 4 +-
.../com/sun/tools/javac/comp/Enter.java | 7 +--
.../com/sun/tools/javac/comp/Lower.java | 9 +++
.../com/sun/tools/javac/comp/MemberEnter.java | 4 +-
.../com/sun/tools/javac/comp/TransTypes.java | 5 +-
.../com/sun/tools/javac/comp/TypeEnvs.java | 63 +++++++++++++++++++
.../test/tools/javac/T8038975/AccessTest.java | 39 ++++++++++++
langtools/test/tools/javac/T8038975/a/A.java | 25 ++++++++
langtools/test/tools/javac/T8038975/a/B.java | 27 ++++++++
11 files changed, 187 insertions(+), 14 deletions(-)
create mode 100644 langtools/src/share/classes/com/sun/tools/javac/comp/TypeEnvs.java
create mode 100644 langtools/test/tools/javac/T8038975/AccessTest.java
create mode 100644 langtools/test/tools/javac/T8038975/a/A.java
create mode 100644 langtools/test/tools/javac/T8038975/a/B.java
diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java b/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java
index 88f421c9a76..656b4f14ac2 100644
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java
@@ -277,6 +277,11 @@ public class Flags {
*/
public static final long LAMBDA_METHOD = 1L<<49;
+ /**
+ * Flag to control recursion in TransTypes
+ */
+ public static final long TYPE_TRANSLATED = 1L<<50;
+
/** Modifier masks.
*/
public static final int
@@ -386,7 +391,8 @@ public class Flags {
BAD_OVERRIDE(Flags.BAD_OVERRIDE),
SIGNATURE_POLYMORPHIC(Flags.SIGNATURE_POLYMORPHIC),
THROWS(Flags.THROWS),
- LAMBDA_METHOD(Flags.LAMBDA_METHOD);
+ LAMBDA_METHOD(Flags.LAMBDA_METHOD),
+ TYPE_TRANSLATED(Flags.TYPE_TRANSLATED);
Flag(long flag) {
this.value = flag;
diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java
index 8762d125115..97f123f2b45 100644
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java
@@ -92,6 +92,7 @@ public class Attr extends JCTree.Visitor {
final JCDiagnostic.Factory diags;
final Annotate annotate;
final DeferredLintHandler deferredLintHandler;
+ final TypeEnvs typeEnvs;
public static Attr instance(Context context) {
Attr instance = context.get(attrKey);
@@ -120,6 +121,7 @@ public class Attr extends JCTree.Visitor {
diags = JCDiagnostic.Factory.instance(context);
annotate = Annotate.instance(context);
deferredLintHandler = DeferredLintHandler.instance(context);
+ typeEnvs = TypeEnvs.instance(context);
Options options = Options.instance(context);
@@ -429,7 +431,7 @@ public class Attr extends JCTree.Visitor {
}
public Type attribType(JCTree node, TypeSymbol sym) {
- Env env = enter.typeEnvs.get(sym);
+ Env env = typeEnvs.get(sym);
Env localEnv = env.dup(node, env.info.dup());
return attribTree(node, localEnv, unknownTypeInfo);
}
@@ -4252,7 +4254,7 @@ public class Attr extends JCTree.Visitor {
// ... and attribute the bound class
c.flags_field |= UNATTRIBUTED;
Env cenv = enter.classEnv(cd, env);
- enter.typeEnvs.put(c, cenv);
+ typeEnvs.put(c, cenv);
attribClass(c);
return owntype;
}
@@ -4398,9 +4400,9 @@ public class Attr extends JCTree.Visitor {
c.flags_field &= ~UNATTRIBUTED;
// Get environment current at the point of class definition.
- Env env = enter.typeEnvs.get(c);
+ Env env = typeEnvs.get(c);
- // The info.lint field in the envs stored in enter.typeEnvs is deliberately uninitialized,
+ // The info.lint field in the envs stored in typeEnvs is deliberately uninitialized,
// because the annotations were not available at the time the env was created. Therefore,
// we look up the environment chain for the first enclosing environment for which the
// lint value is set. Typically, this is the parent env, but might be further if there
diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java b/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java
index 3f2157cdc35..ef37f097493 100644
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java
@@ -78,6 +78,7 @@ public class DeferredAttr extends JCTree.Visitor {
final Flow flow;
final Names names;
final Annotate annotate;
+ final TypeEnvs typeEnvs;
public static DeferredAttr instance(Context context) {
DeferredAttr instance = context.get(deferredAttrKey);
@@ -102,6 +103,7 @@ public class DeferredAttr extends JCTree.Visitor {
names = Names.instance(context);
stuckTree = make.Ident(names.empty).setType(Type.stuckType);
annotate = Annotate.instance(context);
+ typeEnvs = TypeEnvs.instance(context);
emptyDeferredAttrContext =
new DeferredAttrContext(AttrMode.CHECK, null, MethodResolutionPhase.BOX, infer.emptyContext, null, null) {
@Override
@@ -420,7 +422,7 @@ public class DeferredAttr extends JCTree.Visitor {
//it is possible that nested expressions inside argument expression
//are left unchecked - in such cases there's nothing to clean up.
if (csym == null) return;
- enter.typeEnvs.remove(csym);
+ typeEnvs.remove(csym);
chk.compiled.remove(csym.flatname);
syms.classes.remove(csym.flatname);
super.visitClassDef(tree);
diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java
index 65df77a2cc5..03448a80a9b 100644
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java
@@ -103,6 +103,7 @@ public class Enter extends JCTree.Visitor {
Names names;
JavaFileManager fileManager;
PkgInfo pkginfoOpt;
+ TypeEnvs typeEnvs;
private final Todo todo;
@@ -139,13 +140,9 @@ public class Enter extends JCTree.Visitor {
Options options = Options.instance(context);
pkginfoOpt = PkgInfo.get(options);
+ typeEnvs = TypeEnvs.instance(context);
}
- /** A hashtable mapping classes and packages to the environments current
- * at the points of their definitions.
- */
- Map> typeEnvs = new HashMap<>();
-
/** Accessor for typeEnvs
*/
public Env getEnv(TypeSymbol sym) {
diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java
index 5bffdebdca7..933c790e82a 100644
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java
@@ -79,6 +79,7 @@ public class Lower extends TreeTranslator {
private final ConstFold cfolder;
private final Target target;
private final Source source;
+ private final TypeEnvs typeEnvs;
private final boolean allowEnums;
private final Name dollarAssertionsDisabled;
private final Name classDollar;
@@ -99,6 +100,7 @@ public class Lower extends TreeTranslator {
cfolder = ConstFold.instance(context);
target = Target.instance(context);
source = Source.instance(context);
+ typeEnvs = TypeEnvs.instance(context);
allowEnums = source.allowEnums();
dollarAssertionsDisabled = names.
fromString(target.syntheticNameChar() + "assertionsDisabled");
@@ -2450,10 +2452,16 @@ public class Lower extends TreeTranslator {
}
public void visitClassDef(JCClassDecl tree) {
+ Env prevEnv = attrEnv;
ClassSymbol currentClassPrev = currentClass;
MethodSymbol currentMethodSymPrev = currentMethodSym;
+
currentClass = tree.sym;
currentMethodSym = null;
+ attrEnv = typeEnvs.remove(currentClass);
+ if (attrEnv == null)
+ attrEnv = prevEnv;
+
classdefs.put(currentClass, tree);
proxies = proxies.dup(currentClass);
@@ -2525,6 +2533,7 @@ public class Lower extends TreeTranslator {
// Append translated tree to `translated' queue.
translated.append(tree);
+ attrEnv = prevEnv;
currentClass = currentClassPrev;
currentMethodSym = currentMethodSymPrev;
diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java b/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java
index a1b51f6edc5..dfdcaee0acc 100644
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java
@@ -82,6 +82,7 @@ public class MemberEnter extends JCTree.Visitor implements Completer {
private final Target target;
private final DeferredLintHandler deferredLintHandler;
private final Lint lint;
+ private final TypeEnvs typeEnvs;
public static MemberEnter instance(Context context) {
MemberEnter instance = context.get(memberEnterKey);
@@ -107,6 +108,7 @@ public class MemberEnter extends JCTree.Visitor implements Completer {
target = Target.instance(context);
deferredLintHandler = DeferredLintHandler.instance(context);
lint = Lint.instance(context);
+ typeEnvs = TypeEnvs.instance(context);
allowTypeAnnos = source.allowTypeAnnotations();
}
@@ -1000,7 +1002,7 @@ public class MemberEnter extends JCTree.Visitor implements Completer {
ClassSymbol c = (ClassSymbol)sym;
ClassType ct = (ClassType)c.type;
- Env env = enter.typeEnvs.get(c);
+ Env env = typeEnvs.get(c);
JCClassDecl tree = (JCClassDecl)env.tree;
boolean wasFirst = isFirst;
isFirst = false;
diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java b/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java
index 29f0215137c..03ab51fec48 100644
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java
@@ -966,10 +966,11 @@ public class TransTypes extends TreeTranslator {
translateClass((ClassSymbol)st.tsym);
}
- Env myEnv = enter.typeEnvs.remove(c);
- if (myEnv == null) {
+ Env myEnv = enter.getEnv(c);
+ if (myEnv == null || (c.flags_field & TYPE_TRANSLATED) != 0) {
return;
}
+ c.flags_field |= TYPE_TRANSLATED;
/* The two assertions below are set for early detection of any attempt
* to translate a class that:
diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/TypeEnvs.java b/langtools/src/share/classes/com/sun/tools/javac/comp/TypeEnvs.java
new file mode 100644
index 00000000000..01672d4ab6d
--- /dev/null
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/TypeEnvs.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.javac.comp;
+
+import java.util.Collection;
+import java.util.HashMap;
+import com.sun.tools.javac.code.Symbol.TypeSymbol;
+import com.sun.tools.javac.util.Context;
+
+/** This class contains the type environments used by Enter, MemberEnter,
+ * Attr, DeferredAttr, and Lower.
+ *
+ * This is NOT part of any supported API.
+ * If you write code that depends on this, you do so at your own risk.
+ * This code and its internal interfaces are subject to change or
+ * deletion without notice.
+ */
+class TypeEnvs {
+ private static final long serialVersionUID = 571524752489954631L;
+
+ protected static final Context.Key typeEnvsKey = new Context.Key<>();
+ public static TypeEnvs instance(Context context) {
+ TypeEnvs instance = context.get(typeEnvsKey);
+ if (instance == null)
+ instance = new TypeEnvs(context);
+ return instance;
+ }
+
+ private HashMap> map;
+ protected TypeEnvs(Context context) {
+ map = new HashMap<>();
+ context.put(typeEnvsKey, this);
+ }
+
+ Env get(TypeSymbol sym) { return map.get(sym); }
+ Env put(TypeSymbol sym, Env env) { return map.put(sym, env); }
+ Env remove(TypeSymbol sym) { return map.remove(sym); }
+ Collection> values() { return map.values(); }
+ void clear() { map.clear(); }
+}
diff --git a/langtools/test/tools/javac/T8038975/AccessTest.java b/langtools/test/tools/javac/T8038975/AccessTest.java
new file mode 100644
index 00000000000..b79a9db89ae
--- /dev/null
+++ b/langtools/test/tools/javac/T8038975/AccessTest.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8038975
+ * @summary Access control in enhanced for
+ * @compile AccessTest.java
+ */
+
+import a.*;
+public class AccessTest {
+ private static class Impl extends B {
+ public void method(Inner inner) {
+ for (A a : inner)
+ System.out.println(a);
+ }
+ }
+}
diff --git a/langtools/test/tools/javac/T8038975/a/A.java b/langtools/test/tools/javac/T8038975/a/A.java
new file mode 100644
index 00000000000..c6573f2871c
--- /dev/null
+++ b/langtools/test/tools/javac/T8038975/a/A.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package a;
+public class A { }
diff --git a/langtools/test/tools/javac/T8038975/a/B.java b/langtools/test/tools/javac/T8038975/a/B.java
new file mode 100644
index 00000000000..a7728e0ddb0
--- /dev/null
+++ b/langtools/test/tools/javac/T8038975/a/B.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package a;
+public class B {
+ protected abstract class Inner implements Iterable { }
+}
From e4773094de194686bf4920a4ad673e6570a12a6b Mon Sep 17 00:00:00 2001
From: Vicente Romero
Date: Tue, 17 Jun 2014 17:33:01 +0100
Subject: [PATCH 38/76] 8036953: Fix timing of varargs access check, per
JDK-8016205
Reviewed-by: mcimadamore, dlsmith
---
.../com/sun/tools/javac/code/Source.java | 3 ++
.../com/sun/tools/javac/comp/Resolve.java | 8 +++-
.../tools/javac/varargs/6313164/T6313164.java | 24 +++++++----
.../tools/javac/varargs/6313164/T6313164.out | 6 ---
.../javac/varargs/6313164/T6313164Source7.out | 6 +++
.../6313164/T6313164Source8AndHigher.out | 6 +++
.../tools/javac/varargs/6313164/T7175433.java | 41 ++-----------------
.../tools/javac/varargs/6313164/T7175433.out | 2 +
.../tools/javac/varargs/6313164/p1/B.java | 5 +--
9 files changed, 46 insertions(+), 55 deletions(-)
delete mode 100644 langtools/test/tools/javac/varargs/6313164/T6313164.out
create mode 100644 langtools/test/tools/javac/varargs/6313164/T6313164Source7.out
create mode 100644 langtools/test/tools/javac/varargs/6313164/T6313164Source8AndHigher.out
create mode 100644 langtools/test/tools/javac/varargs/6313164/T7175433.out
diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Source.java b/langtools/src/share/classes/com/sun/tools/javac/code/Source.java
index 35a6ea9b84a..a4d09cd8699 100644
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Source.java
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Source.java
@@ -237,6 +237,9 @@ public enum Source {
public boolean allowFunctionalInterfaceMostSpecific() {
return compareTo(JDK1_8) >= 0;
}
+ public boolean allowPostApplicabilityVarargsAccessCheck() {
+ return compareTo(JDK1_8) >= 0;
+ }
public static SourceVersion toSourceVersion(Source source) {
switch(source) {
case JDK1_2:
diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java
index fffe05c55a0..f8ab3109450 100644
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java
@@ -95,6 +95,7 @@ public class Resolve {
public final boolean varargsEnabled;
public final boolean allowMethodHandles;
public final boolean allowFunctionalInterfaceMostSpecific;
+ public final boolean checkVarargsAccessDuringResolution;
private final boolean debugResolve;
private final boolean compactMethodDiags;
final EnumSet verboseResolutionMode;
@@ -136,6 +137,8 @@ public class Resolve {
Target target = Target.instance(context);
allowMethodHandles = target.hasMethodHandles();
allowFunctionalInterfaceMostSpecific = source.allowFunctionalInterfaceMostSpecific();
+ checkVarargsAccessDuringResolution =
+ source.allowPostApplicabilityVarargsAccessCheck();
polymorphicSignatureScope = new Scope(syms.noSymbol);
inapplicableMethodException = new InapplicableMethodException(diags);
@@ -833,7 +836,10 @@ public class Resolve {
Warner warn) {
super.argumentsAcceptable(env, deferredAttrContext, argtypes, formals, warn);
//should we expand formals?
- if (deferredAttrContext.phase.isVarargsRequired()) {
+ if ((!checkVarargsAccessDuringResolution ||
+ (checkVarargsAccessDuringResolution &&
+ deferredAttrContext.mode == AttrMode.CHECK)) &&
+ deferredAttrContext.phase.isVarargsRequired()) {
//check varargs element type accessibility
varargsAccessible(env, types.elemtype(formals.last()),
deferredAttrContext.inferenceContext);
diff --git a/langtools/test/tools/javac/varargs/6313164/T6313164.java b/langtools/test/tools/javac/varargs/6313164/T6313164.java
index 3e8284531d9..7df40d0f8bb 100644
--- a/langtools/test/tools/javac/varargs/6313164/T6313164.java
+++ b/langtools/test/tools/javac/varargs/6313164/T6313164.java
@@ -1,18 +1,26 @@
/*
* @test /nodynamiccopyright/
- * @bug 6313164
+ * @bug 6313164 8036953
* @author mcimadamore
* @summary javac generates code that fails byte code verification for the varargs feature
- * @compile/fail/ref=T6313164.out -XDrawDiagnostics T6313164.java
+ * @compile/fail/ref=T6313164Source7.out -source 7 -XDrawDiagnostics T6313164.java
+ * @compile/fail/ref=T6313164Source8AndHigher.out -XDrawDiagnostics T6313164.java
*/
import p1.*;
class T6313164 {
- { B b = new B();
- b.foo1(new B(), new B()); //error - A not accesible
- b.foo2(new B(), new B()); //ok - A not accessible, but foo2(Object...) applicable
- b.foo3(null, null); //error - A (inferred) not accesible
- b.foo4(null, null); //error - A (inferred in 15.12.2.8 - no resolution backtrack) not accesible
- b.foo4(new B(), new C()); //ok - A (inferred in 15.12.2.7) not accessible, but foo4(Object...) applicable
+ {
+ B b = new B();
+ b.foo1(new B(), new B()); //error - A not accessible
+ /* 7 : ok - A not accessible, but foo2(Object...) applicable
+ * 8+ : error - A not accessible
+ */
+ b.foo2(new B(), new B());
+ b.foo3(null, null); //error - A (inferred) not accessible
+ b.foo4(null, null); //error - A not accesible
+ /* 7 : ok - A not accessible, but foo4(Object...) applicable
+ * 8+ : error - A not accessible
+ */
+ b.foo4(new B(), new C());
}
}
diff --git a/langtools/test/tools/javac/varargs/6313164/T6313164.out b/langtools/test/tools/javac/varargs/6313164/T6313164.out
deleted file mode 100644
index 7b2de27216b..00000000000
--- a/langtools/test/tools/javac/varargs/6313164/T6313164.out
+++ /dev/null
@@ -1,6 +0,0 @@
-T6313164.java:12:8: compiler.err.cant.apply.symbol: kindname.method, foo1, p1.A[], p1.B,p1.B, kindname.class, p1.B, (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164)
-T6313164.java:14:13: compiler.err.prob.found.req: (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164)
-T6313164.java:15:13: compiler.err.prob.found.req: (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164)
-- compiler.note.unchecked.filename: B.java
-- compiler.note.unchecked.recompile
-3 errors
diff --git a/langtools/test/tools/javac/varargs/6313164/T6313164Source7.out b/langtools/test/tools/javac/varargs/6313164/T6313164Source7.out
new file mode 100644
index 00000000000..8c12e727aa7
--- /dev/null
+++ b/langtools/test/tools/javac/varargs/6313164/T6313164Source7.out
@@ -0,0 +1,6 @@
+- compiler.warn.source.no.bootclasspath: 1.7
+T6313164.java:14:10: compiler.err.cant.apply.symbol: kindname.method, foo1, p1.A[], p1.B,p1.B, kindname.class, p1.B, (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164)
+T6313164.java:19:15: compiler.err.prob.found.req: (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164)
+T6313164.java:20:15: compiler.err.prob.found.req: (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164)
+3 errors
+1 warning
diff --git a/langtools/test/tools/javac/varargs/6313164/T6313164Source8AndHigher.out b/langtools/test/tools/javac/varargs/6313164/T6313164Source8AndHigher.out
new file mode 100644
index 00000000000..0257a5d5ecb
--- /dev/null
+++ b/langtools/test/tools/javac/varargs/6313164/T6313164Source8AndHigher.out
@@ -0,0 +1,6 @@
+T6313164.java:14:15: compiler.err.cant.apply.symbol: kindname.method, foo1, p1.A[], p1.B,p1.B, kindname.class, p1.B, (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164)
+T6313164.java:18:15: compiler.err.cant.apply.symbol: kindname.method, foo2, p1.A[], p1.B,p1.B, kindname.class, p1.B, (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164)
+T6313164.java:19:15: compiler.err.prob.found.req: (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164)
+T6313164.java:20:15: compiler.err.prob.found.req: (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164)
+T6313164.java:24:15: compiler.err.prob.found.req: (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164)
+5 errors
diff --git a/langtools/test/tools/javac/varargs/6313164/T7175433.java b/langtools/test/tools/javac/varargs/6313164/T7175433.java
index b4627eb7ab8..4384cf5d9b9 100644
--- a/langtools/test/tools/javac/varargs/6313164/T7175433.java
+++ b/langtools/test/tools/javac/varargs/6313164/T7175433.java
@@ -1,31 +1,8 @@
/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * @test
+ * @test /nodynamiccopyright/
* @bug 7175433 6313164
* @summary Inference cleanup: add helper class to handle inference variables
- *
+ * @compile/fail/ref=T7175433.out -XDrawDiagnostics T7175433.java
*/
import java.util.List;
@@ -34,26 +11,16 @@ class Bar {
private class Foo { }
- List m(Object... o) { T7175433.assertTrue(true); return null; }
- List m(Foo... o) { T7175433.assertTrue(false); return null; }
+ List m(Object... o) { return null; }
+ List m(Foo... o) { return null; }
Foo getFoo() { return null; }
}
public class T7175433 {
- static int assertionCount;
-
- static void assertTrue(boolean b) {
- assertionCount++;
- if (!b) {
- throw new AssertionError();
- }
- }
-
public static void main(String[] args) {
Bar b = new Bar();
b.m(b.getFoo());
- assertTrue(assertionCount == 1);
}
}
diff --git a/langtools/test/tools/javac/varargs/6313164/T7175433.out b/langtools/test/tools/javac/varargs/6313164/T7175433.out
new file mode 100644
index 00000000000..598f3bb58df
--- /dev/null
+++ b/langtools/test/tools/javac/varargs/6313164/T7175433.out
@@ -0,0 +1,2 @@
+T7175433.java:24:12: compiler.err.prob.found.req: (compiler.misc.inaccessible.varargs.type: Bar.Foo, kindname.class, T7175433)
+1 error
diff --git a/langtools/test/tools/javac/varargs/6313164/p1/B.java b/langtools/test/tools/javac/varargs/6313164/p1/B.java
index 38ec371c5b2..ebe7ba99c20 100644
--- a/langtools/test/tools/javac/varargs/6313164/p1/B.java
+++ b/langtools/test/tools/javac/varargs/6313164/p1/B.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,13 +23,12 @@
package p1;
+@SuppressWarnings("unchecked")
public class B extends A {
- public B() {}
public void foo1(A... args) { }
public void foo2(A... args) { }
public void foo2(Object... args) { }
public void foo3(X... args) { }
public void foo4(X... args) { }
public void foo4(Object... args) { }
-
}
From e6b9e34ebe3a86450fde338e794f7da4b4c540ce Mon Sep 17 00:00:00 2001
From: Jan Lahoda
Date: Wed, 18 Jun 2014 10:44:16 +0200
Subject: [PATCH 39/76] 8046916: Type parameter annotations don't work with
multiple type parameters
When reading type variable's annotations out of the owner's type annotations, use the type variable's index in owner to exclude annotations belonging to other type variables.
Reviewed-by: jfranck, emc
---
.../com/sun/tools/javac/code/Symbol.java | 33 ++--
.../element/TestTypeParameterAnnotations.java | 185 +++++++++++-------
2 files changed, 129 insertions(+), 89 deletions(-)
diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java b/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java
index f76d7282c79..c6565f27b16 100644
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java
@@ -770,42 +770,41 @@ public abstract class Symbol extends AnnoConstruct implements Element {
@Override
public List getAnnotationMirrors() {
- return onlyTypeVariableAnnotations(owner.getRawTypeAttributes());
- }
-
- private List onlyTypeVariableAnnotations(
- List candidates) {
- // Declaration annotations on TypeParameters are stored in type attributes
+ // Declaration annotations on type variables are stored in type attributes
+ // on the owner of the TypeVariableSymbol
+ List candidates = owner.getRawTypeAttributes();
+ int index = owner.getTypeParameters().indexOf(this);
List res = List.nil();
for (Attribute.TypeCompound a : candidates) {
- if (a.position.type == TargetType.CLASS_TYPE_PARAMETER ||
- a.position.type == TargetType.METHOD_TYPE_PARAMETER)
+ if (isCurrentSymbolsAnnotation(a, index))
res = res.prepend(a);
}
- return res = res.reverse();
+ return res.reverse();
}
-
-
// Helper to getAnnotation[s]
@Override
public Attribute.Compound getAttribute(Class annoType) {
-
String name = annoType.getName();
// Declaration annotations on type variables are stored in type attributes
// on the owner of the TypeVariableSymbol
List candidates = owner.getRawTypeAttributes();
+ int index = owner.getTypeParameters().indexOf(this);
for (Attribute.TypeCompound anno : candidates)
- if (anno.position.type == TargetType.CLASS_TYPE_PARAMETER ||
- anno.position.type == TargetType.METHOD_TYPE_PARAMETER)
- if (name.contentEquals(anno.type.tsym.flatName()))
- return anno;
+ if (isCurrentSymbolsAnnotation(anno, index) &&
+ name.contentEquals(anno.type.tsym.flatName()))
+ return anno;
return null;
}
-
+ //where:
+ boolean isCurrentSymbolsAnnotation(Attribute.TypeCompound anno, int index) {
+ return (anno.position.type == TargetType.CLASS_TYPE_PARAMETER ||
+ anno.position.type == TargetType.METHOD_TYPE_PARAMETER) &&
+ anno.position.parameter_index == index;
+ }
@Override
diff --git a/langtools/test/tools/javac/processing/model/element/TestTypeParameterAnnotations.java b/langtools/test/tools/javac/processing/model/element/TestTypeParameterAnnotations.java
index d0b5cc8ef7f..1b6e26f4308 100644
--- a/langtools/test/tools/javac/processing/model/element/TestTypeParameterAnnotations.java
+++ b/langtools/test/tools/javac/processing/model/element/TestTypeParameterAnnotations.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8011027
+ * @bug 8011027 8046916
* @library /tools/javac/lib
* @build JavacTestingAbstractProcessor TestTypeParameterAnnotations
* @compile -processor TestTypeParameterAnnotations -proc:only TestTypeParameterAnnotations.java
@@ -33,10 +33,16 @@ import java.util.*;
import java.lang.annotation.*;
import javax.annotation.processing.*;
import javax.lang.model.element.*;
-import javax.lang.model.util.*;
import javax.tools.*;
-public class TestTypeParameterAnnotations<@Foo @Bar @Baz T> extends JavacTestingAbstractProcessor {
+@ExpectedTypeParameterAnnotations(typeParameterName="T1",
+ annotations={"Foo1", "Bar1", "Baz1"})
+@ExpectedTypeParameterAnnotations(typeParameterName="T2", annotations={})
+@ExpectedTypeParameterAnnotations(typeParameterName="T3",
+ annotations={"Foo2", "Bar2", "Baz2"})
+@ExpectedTypeParameterAnnotations(typeParameterName="T4", annotations={})
+public class TestTypeParameterAnnotations<@Foo1 @Bar1 @Baz1 T1, T2, @Foo2 @Bar2 @Baz2 T3, T4> extends
+ JavacTestingAbstractProcessor {
int round = 0;
public boolean process(Set extends TypeElement> annotations, RoundEnvironment roundEnv) {
@@ -74,82 +80,69 @@ public class TestTypeParameterAnnotations<@Foo @Bar @Baz T> extends JavacTesting
int check(Element e, List extends TypeParameterElement> typarams) {
if (typarams.isEmpty())
return 0;
- if (typarams.size() != 1)
- return 0;
- for (TypeParameterElement tpe: typarams) {
- boolean b1 = checkAnnotationMirrors(tpe, tpe.getAnnotationMirrors());
- boolean b2 = checkAnnotationMirrors(tpe, elements.getAllAnnotationMirrors(tpe));
- boolean b3 = checkGetAnnotation(tpe);
- boolean b4 = checkGetAnnotations(tpe);
- return b1 && b2 && b3 && b4 ? 1 : 0;
+ for (TypeParameterElement tpe : typarams) {
+ ExpectedTypeParameterAnnotations expected = null;
+ for (ExpectedTypeParameterAnnotations a : e.getAnnotationsByType(ExpectedTypeParameterAnnotations.class)) {
+ if (tpe.getSimpleName().contentEquals(a.typeParameterName())) {
+ expected = a;
+ break;
+ }
+ }
+ if (expected == null) {
+ throw new IllegalStateException("Does not have expected values annotation.");
+ }
+ checkAnnotationMirrors(tpe, tpe.getAnnotationMirrors(), expected);
+ checkAnnotationMirrors(tpe, elements.getAllAnnotationMirrors(tpe), expected);
+ checkGetAnnotation(tpe, expected);
+ checkGetAnnotations(tpe, expected);
}
- return 0;
+
+ return typarams.size();
}
- boolean checkAnnotationMirrors(TypeParameterElement tpe, List extends AnnotationMirror> l) {
- if (l.size() != 3) {
- error("To few annotations, got " + l.size() +
- ", should be 3", tpe);
- return false;
+ void checkAnnotationMirrors(TypeParameterElement tpe, List extends AnnotationMirror> l, ExpectedTypeParameterAnnotations expected) {
+ String[] expectedAnnotations = expected.annotations();
+
+ if (l.size() != expectedAnnotations.length) {
+ error("Incorrect number of annotations, got " + l.size() +
+ ", should be " + expectedAnnotations.length, tpe);
+ return ;
}
- AnnotationMirror m = l.get(0);
- if (!m.getAnnotationType().asElement().equals(elements.getTypeElement("Foo"))) {
- error("Wrong type of annotation, was expecting @Foo", m.getAnnotationType().asElement());
- return false;
+ for (int i = 0; i < expectedAnnotations.length; i++) {
+ AnnotationMirror m = l.get(i);
+ if (!m.getAnnotationType().asElement().equals(elements.getTypeElement(expectedAnnotations[i]))) {
+ error("Wrong type of annotation, was expecting @Foo", m.getAnnotationType().asElement());
+ return ;
+ }
}
- m = l.get(1);
- if (!m.getAnnotationType().asElement().equals(elements.getTypeElement("Bar"))) {
- error("Wrong type of annotation, was expecting @Bar", m.getAnnotationType().asElement());
- return false;
- }
- m = l.get(2);
- if (!m.getAnnotationType().asElement().equals(elements.getTypeElement("Baz"))) {
- error("Wrong type of annotation, was expecting @Baz", m.getAnnotationType().asElement());
- return false;
- }
- return true;
}
- boolean checkGetAnnotation(TypeParameterElement tpe) {
- Foo f = tpe.getAnnotation(Foo.class);
- if (f == null)
- error("Expecting @Foo to be present in getAnnotation()", tpe);
+ void checkGetAnnotation(TypeParameterElement tpe, ExpectedTypeParameterAnnotations expected) {
+ List expectedAnnotations = Arrays.asList(expected.annotations());
- Bar b = tpe.getAnnotation(Bar.class);
- if (b == null)
- error("Expecting @Bar to be present in getAnnotation()", tpe);
+ for (Class extends Annotation> c : ALL_ANNOTATIONS) {
+ Object a = tpe.getAnnotation(c);
- Baz z = tpe.getAnnotation(Baz.class);
- if (z == null)
- error("Expecting @Baz to be present in getAnnotation()", tpe);
-
- return f != null &&
- b != null &&
- z != null;
+ if (a != null ^ expectedAnnotations.indexOf(c.getName()) != (-1)) {
+ error("Unexpected behavior for " + c.getName(), tpe);
+ return ;
+ }
+ }
}
- boolean checkGetAnnotations(TypeParameterElement tpe) {
- Foo[] f = tpe.getAnnotationsByType(Foo.class);
- if (f.length != 1) {
- error("Expecting 1 @Foo to be present in getAnnotationsByType()", tpe);
- return false;
- }
+ void checkGetAnnotations(TypeParameterElement tpe, ExpectedTypeParameterAnnotations expected) {
+ List expectedAnnotations = Arrays.asList(expected.annotations());
- Bar[] b = tpe.getAnnotationsByType(Bar.class);
- if (b.length != 1) {
- error("Expecting 1 @Bar to be present in getAnnotationsByType()", tpe);
- return false;
- }
+ for (Class extends Annotation> c : ALL_ANNOTATIONS) {
+ Object[] a = tpe.getAnnotationsByType(c);
- Baz[] z = tpe.getAnnotationsByType(Baz.class);
- if (z.length != 1) {
- error("Expecting 1 @Baz to be present in getAnnotationsByType()", tpe);
- return false;
+ if (a.length > 0 ^ expectedAnnotations.indexOf(c.getName()) != (-1)) {
+ error("Unexpected behavior for " + c.getName(), tpe);
+ return ;
+ }
}
-
- return true;
}
void note(String msg) {
@@ -168,23 +161,71 @@ public class TestTypeParameterAnnotations<@Foo @Bar @Baz T> extends JavacTesting
messager.printMessage(Diagnostic.Kind.ERROR, msg);
}
+ Class extends Annotation>[] ALL_ANNOTATIONS = new Class[] {
+ Foo1.class, Bar1.class, Baz1.class,
+ Foo2.class, Bar2.class, Baz2.class,
+ };
+
// additional generic elements to test
- <@Foo @Bar @Baz X> X m(X x) { return x; }
+ @ExpectedTypeParameterAnnotations(typeParameterName="W",
+ annotations={"Foo1", "Bar1", "Baz1"})
+ @ExpectedTypeParameterAnnotations(typeParameterName="X", annotations={})
+ @ExpectedTypeParameterAnnotations(typeParameterName="Y",
+ annotations={"Foo2", "Bar2", "Baz2"})
+ @ExpectedTypeParameterAnnotations(typeParameterName="Z", annotations={})
+ <@Foo1 @Bar1 @Baz1 W, X, @Foo2 @Bar2 @Baz2 Y, Z> X m(X x) { return x; }
- interface Intf<@Foo @Bar @Baz X> { X m() ; }
+ @ExpectedTypeParameterAnnotations(typeParameterName="W",
+ annotations={"Foo1", "Bar1", "Baz1"})
+ @ExpectedTypeParameterAnnotations(typeParameterName="X", annotations={})
+ @ExpectedTypeParameterAnnotations(typeParameterName="Y",
+ annotations={"Foo2", "Bar2", "Baz2"})
+ @ExpectedTypeParameterAnnotations(typeParameterName="Z", annotations={})
+ interface Intf<@Foo1 @Bar1 @Baz1 W, X, @Foo2 @Bar2 @Baz2 Y, Z> { X m() ; }
- class Class<@Foo @Bar @Baz X> {
- <@Foo @Bar @Baz Y> Class() { }
+ @ExpectedTypeParameterAnnotations(typeParameterName="W",
+ annotations={"Foo1", "Bar1", "Baz1"})
+ @ExpectedTypeParameterAnnotations(typeParameterName="X", annotations={})
+ @ExpectedTypeParameterAnnotations(typeParameterName="Y",
+ annotations={"Foo2", "Bar2", "Baz2"})
+ @ExpectedTypeParameterAnnotations(typeParameterName="Z", annotations={})
+ class Clazz<@Foo1 @Bar1 @Baz1 W, X, @Foo2 @Bar2 @Baz2 Y, Z> {
+ @ExpectedTypeParameterAnnotations(typeParameterName="W",
+ annotations={"Foo1", "Bar1", "Baz1"})
+ @ExpectedTypeParameterAnnotations(typeParameterName="X", annotations={})
+ @ExpectedTypeParameterAnnotations(typeParameterName="Y",
+ annotations={"Foo2", "Bar2", "Baz2"})
+ @ExpectedTypeParameterAnnotations(typeParameterName="Z", annotations={})
+ <@Foo1 @Bar1 @Baz1 W, X, @Foo2 @Bar2 @Baz2 Y, Z> Clazz() { }
}
- final int expect = 5; // top level class, plus preceding examples
+ final int expect = 5 * 4; // top level class, plus preceding examples, 4 type variables each
}
@Target(ElementType.TYPE_PARAMETER)
-@interface Foo {}
+@interface Foo1 {}
@Target(ElementType.TYPE_PARAMETER)
-@interface Bar {}
+@interface Bar1 {}
@Target(ElementType.TYPE_PARAMETER)
-@interface Baz {}
+@interface Baz1 {}
+
+@Target(ElementType.TYPE_PARAMETER)
+@interface Foo2 {}
+
+@Target(ElementType.TYPE_PARAMETER)
+@interface Bar2 {}
+
+@Target(ElementType.TYPE_PARAMETER)
+@interface Baz2 {}
+
+@Repeatable(ExpectedTypeParameterAnnotationsCollection.class)
+@interface ExpectedTypeParameterAnnotations {
+ public String typeParameterName();
+ public String[] annotations();
+}
+
+@interface ExpectedTypeParameterAnnotationsCollection {
+ public ExpectedTypeParameterAnnotations[] value();
+}
From f8e80ec392abde08b24c491191535829e17edcc8 Mon Sep 17 00:00:00 2001
From: Maurizio Cimadamore
Date: Wed, 18 Jun 2014 13:51:50 +0100
Subject: [PATCH 40/76] 8043253: Slow javac compile times in JDK 8
Enable on-demand diagnostic source position completion
Reviewed-by: jjg, vromero
---
.../sun/tools/javac/util/JCDiagnostic.java | 50 ++++++++++++++-----
1 file changed, 38 insertions(+), 12 deletions(-)
diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java b/langtools/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java
index 7fc43f8eec9..1e9bdeb6776 100644
--- a/langtools/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java
@@ -354,13 +354,41 @@ public class JCDiagnostic implements Diagnostic {
private final DiagnosticType type;
private final DiagnosticSource source;
private final DiagnosticPosition position;
- private final int line;
- private final int column;
private final String key;
protected final Object[] args;
private final Set flags;
private final LintCategory lintCategory;
+ /** source line position (set lazily) */
+ private SourcePosition sourcePosition;
+
+ /**
+ * This class is used to defer the line/column position fetch logic after diagnostic construction.
+ */
+ class SourcePosition {
+
+ private final int line;
+ private final int column;
+
+ SourcePosition() {
+ int n = (position == null ? Position.NOPOS : position.getPreferredPosition());
+ if (n == Position.NOPOS || source == null)
+ line = column = -1;
+ else {
+ line = source.getLineNumber(n);
+ column = source.getColumnNumber(n, true);
+ }
+ }
+
+ public int getLineNumber() {
+ return line;
+ }
+
+ public int getColumnNumber() {
+ return column;
+ }
+ }
+
/**
* Create a diagnostic object.
* @param formatter the formatter to use for the diagnostic
@@ -390,14 +418,6 @@ public class JCDiagnostic implements Diagnostic {
this.position = pos;
this.key = key;
this.args = args;
-
- int n = (pos == null ? Position.NOPOS : pos.getPreferredPosition());
- if (n == Position.NOPOS || source == null)
- line = column = -1;
- else {
- line = source.getLineNumber(n);
- column = source.getColumnNumber(n, true);
- }
}
/**
@@ -494,7 +514,10 @@ public class JCDiagnostic implements Diagnostic {
* @return the line number within the source referred to by this diagnostic
*/
public long getLineNumber() {
- return line;
+ if (sourcePosition == null) {
+ sourcePosition = new SourcePosition();
+ }
+ return sourcePosition.getLineNumber();
}
/**
@@ -502,7 +525,10 @@ public class JCDiagnostic implements Diagnostic {
* @return the column number within the line of source referred to by this diagnostic
*/
public long getColumnNumber() {
- return column;
+ if (sourcePosition == null) {
+ sourcePosition = new SourcePosition();
+ }
+ return sourcePosition.getColumnNumber();
}
/**
From 74b1138a2e865364e427a852c56cd293abbac22f Mon Sep 17 00:00:00 2001
From: David Katleman
Date: Thu, 19 Jun 2014 11:22:16 -0700
Subject: [PATCH 41/76] Added tag jdk9-b19 for changeset db769f12fe54
---
.hgtags-top-repo | 1 +
1 file changed, 1 insertion(+)
diff --git a/.hgtags-top-repo b/.hgtags-top-repo
index 931d3b8d4c6..96db77ecda3 100644
--- a/.hgtags-top-repo
+++ b/.hgtags-top-repo
@@ -261,3 +261,4 @@ b114474fb25af4e73cb7219f7c04bd8994da03a5 jdk9-b15
cf22a728521f91a4692b433d39d730a0a1b23155 jdk9-b16
24152ee0ee1abef54a8bab04c099261dba7bcca5 jdk9-b17
65abab59f783fcf02ff8e133431c252f9e5f07d5 jdk9-b18
+75a08df650eb3126bab0c4d15241f5886162393c jdk9-b19
From 4a8a4cf86f5d9138853d7b9dda74af428ab9c6ad Mon Sep 17 00:00:00 2001
From: David Katleman
Date: Thu, 19 Jun 2014 11:22:18 -0700
Subject: [PATCH 42/76] Added tag jdk9-b19 for changeset 7056eab40723
---
corba/.hgtags | 1 +
1 file changed, 1 insertion(+)
diff --git a/corba/.hgtags b/corba/.hgtags
index 66b823f5f9f..8d8e8a4c1cb 100644
--- a/corba/.hgtags
+++ b/corba/.hgtags
@@ -261,3 +261,4 @@ e54022d0dd92106fff7f7fe670010cd7e6517ee3 jdk9-b15
422ef9d29d84f571453f015c4cb8713c3af70ee4 jdk9-b16
4c75c2ca7cf3e0618315879acf17f42c8fcd0c09 jdk9-b17
77565aaaa2bb814e94817e92d680168052a25395 jdk9-b18
+eecc1b6adc7e193d00a0641eb0963add5a4c06e8 jdk9-b19
From 25c674c4205b78329f57723bf6d7dd23b3b415d9 Mon Sep 17 00:00:00 2001
From: David Katleman
Date: Thu, 19 Jun 2014 11:22:25 -0700
Subject: [PATCH 43/76] Added tag jdk9-b19 for changeset 718694e51e25
---
hotspot/.hgtags | 1 +
1 file changed, 1 insertion(+)
diff --git a/hotspot/.hgtags b/hotspot/.hgtags
index 77d8c723248..6f27a7b126f 100644
--- a/hotspot/.hgtags
+++ b/hotspot/.hgtags
@@ -421,3 +421,4 @@ bd333491bb6c012d7b606939406d0fa9a5ac7ffd jdk9-b14
b14e7c0b7d3ec04127f565cda1d84122e205680c jdk9-b16
14b656df31c2cb09c505921061e79977823de71a jdk9-b17
871fd128548480095e0dc3fc34c422666baeec75 jdk9-b18
+d4cffb3ae6213c66c7522ebffe0349360a45f0ef jdk9-b19
From 73744c4b12c08f1c6170ea0875f164b6f503dddd Mon Sep 17 00:00:00 2001
From: David Katleman
Date: Thu, 19 Jun 2014 11:22:33 -0700
Subject: [PATCH 44/76] Added tag jdk9-b19 for changeset 12e7286572ef
---
jaxp/.hgtags | 1 +
1 file changed, 1 insertion(+)
diff --git a/jaxp/.hgtags b/jaxp/.hgtags
index 0bc9cacf9a9..4b109feb5a8 100644
--- a/jaxp/.hgtags
+++ b/jaxp/.hgtags
@@ -261,3 +261,4 @@ e88cecf5a21b760ff7d7761c2db6bb8c82bc9f0c jdk9-b12
a1461221b05d4620e4d7d1907e2a0282aaedf31c jdk9-b16
6f923fcbe5129eceb9617a9a18dbdd743980e785 jdk9-b17
5afa90c28742d175431be75f9098745510bd2b30 jdk9-b18
+f9c82769a6bc2b219a8f01c24afe5c91039267d7 jdk9-b19
From 0d540362928dfe8261ce7e3550782987ef671681 Mon Sep 17 00:00:00 2001
From: David Katleman
Date: Thu, 19 Jun 2014 11:22:36 -0700
Subject: [PATCH 45/76] Added tag jdk9-b19 for changeset 9ed534348756
---
jaxws/.hgtags | 1 +
1 file changed, 1 insertion(+)
diff --git a/jaxws/.hgtags b/jaxws/.hgtags
index a2cf881e532..f17a048b809 100644
--- a/jaxws/.hgtags
+++ b/jaxws/.hgtags
@@ -264,3 +264,4 @@ e9780330017a6b464a385356d77e5136f9de8d09 jdk9-b15
1e1a3b2215b7551d88e89d1ca8c1e1ebe3d3c0ab jdk9-b16
6b159e727dac283f424b7d19f5be3ddd9f85acf5 jdk9-b17
275f2385aed80c84297840638d58656366350c58 jdk9-b18
+7f922a73e8a2c6ce42634238090fce7c6d599541 jdk9-b19
From 81cb0dbeb4c0c6583e25a886f2c38142f774ca1f Mon Sep 17 00:00:00 2001
From: David Katleman
Date: Thu, 19 Jun 2014 11:22:38 -0700
Subject: [PATCH 46/76] Added tag jdk9-b19 for changeset 40b2b32fa541
---
jdk/.hgtags | 1 +
1 file changed, 1 insertion(+)
diff --git a/jdk/.hgtags b/jdk/.hgtags
index 6f8633b7e61..5a2f74362fc 100644
--- a/jdk/.hgtags
+++ b/jdk/.hgtags
@@ -261,3 +261,4 @@ c7c8002d02721e02131d104549ebeb8b379fb8d2 jdk9-b13
ab7d2c565b0de5bee1361d282d4029371327fc9e jdk9-b16
fd8e675f141b9bdb2f46d1ae8251f4ee3a895d64 jdk9-b17
6ad17b31f0d30593392b1e8695b9709dbbd7fb70 jdk9-b18
+27561aede285c25a3e9ed8bf8918234ad3bb81e3 jdk9-b19
From c8e4d3e53a147bc3d7a470920deb7da161e6c4c5 Mon Sep 17 00:00:00 2001
From: David Katleman
Date: Thu, 19 Jun 2014 11:22:49 -0700
Subject: [PATCH 47/76] Added tag jdk9-b19 for changeset 26e23230009a
---
langtools/.hgtags | 1 +
1 file changed, 1 insertion(+)
diff --git a/langtools/.hgtags b/langtools/.hgtags
index e701f6f47df..57ed74c4fc4 100644
--- a/langtools/.hgtags
+++ b/langtools/.hgtags
@@ -261,3 +261,4 @@ f04fccfbd880c819affc3ef33e0083aab9556409 jdk9-b11
7d67ebd3e35c3c36ad2caee482a84f8310d2f838 jdk9-b16
b64f8d5b97faa29e4d629bf4e56ebe0e26c40ecc jdk9-b17
fd8da51c5df4546995c360fc49f0b985cbf8fbd3 jdk9-b18
+a9accd7c44159f191ad09740d54493e563c39f95 jdk9-b19
From 2a9e69a4b6fc02948570bca413e8a911b573cc8f Mon Sep 17 00:00:00 2001
From: David Katleman
Date: Thu, 19 Jun 2014 11:22:50 -0700
Subject: [PATCH 48/76] Added tag jdk9-b19 for changeset a7c5ef3bb9d4
---
nashorn/.hgtags | 1 +
1 file changed, 1 insertion(+)
diff --git a/nashorn/.hgtags b/nashorn/.hgtags
index a702f565523..7aaa209e13b 100644
--- a/nashorn/.hgtags
+++ b/nashorn/.hgtags
@@ -252,3 +252,4 @@ be4580ae56e2ef0ce521d3f840753eaa83cacf33 jdk9-b13
fed8c83dfba4dce94d2ae1cb82f026634ff2a3e4 jdk9-b16
4a47b7cfecdf2a865811ab08a7ef49c942801d7c jdk9-b17
893c337bc95fef3885baa3e4ffc30d68f62a829f jdk9-b18
+46e36a92e37c06dea50f8c829549d9d0bfed4e3c jdk9-b19
From 519c760b0b054621c709c0367ae9f5bae6c0cccc Mon Sep 17 00:00:00 2001
From: David Katleman
Date: Thu, 26 Jun 2014 12:51:14 -0700
Subject: [PATCH 49/76] Added tag jdk9-b20 for changeset 3abb2de3cdb3
---
.hgtags-top-repo | 1 +
1 file changed, 1 insertion(+)
diff --git a/.hgtags-top-repo b/.hgtags-top-repo
index 96db77ecda3..a6aef895743 100644
--- a/.hgtags-top-repo
+++ b/.hgtags-top-repo
@@ -262,3 +262,4 @@ cf22a728521f91a4692b433d39d730a0a1b23155 jdk9-b16
24152ee0ee1abef54a8bab04c099261dba7bcca5 jdk9-b17
65abab59f783fcf02ff8e133431c252f9e5f07d5 jdk9-b18
75a08df650eb3126bab0c4d15241f5886162393c jdk9-b19
+ee4fd72b2ec3d92497f37163352f294aa695c6fb jdk9-b20
From e36d1d8a145ee1fbf407d9f6d1bf9302fdd6be9b Mon Sep 17 00:00:00 2001
From: David Katleman
Date: Thu, 26 Jun 2014 12:51:17 -0700
Subject: [PATCH 50/76] Added tag jdk9-b20 for changeset c9ca62c6a329
---
corba/.hgtags | 1 +
1 file changed, 1 insertion(+)
diff --git a/corba/.hgtags b/corba/.hgtags
index 8d8e8a4c1cb..f9ed22e0c47 100644
--- a/corba/.hgtags
+++ b/corba/.hgtags
@@ -262,3 +262,4 @@ e54022d0dd92106fff7f7fe670010cd7e6517ee3 jdk9-b15
4c75c2ca7cf3e0618315879acf17f42c8fcd0c09 jdk9-b17
77565aaaa2bb814e94817e92d680168052a25395 jdk9-b18
eecc1b6adc7e193d00a0641eb0963add5a4c06e8 jdk9-b19
+87f36eecb1665012d01c5cf102494e591c943ea6 jdk9-b20
From 4199772c9947b2f70ffc01c07fc8c9aa97f65209 Mon Sep 17 00:00:00 2001
From: David Katleman
Date: Thu, 26 Jun 2014 12:51:26 -0700
Subject: [PATCH 51/76] Added tag jdk9-b20 for changeset e9f01656f118
---
hotspot/.hgtags | 1 +
1 file changed, 1 insertion(+)
diff --git a/hotspot/.hgtags b/hotspot/.hgtags
index 6f27a7b126f..b4c3b90e4c2 100644
--- a/hotspot/.hgtags
+++ b/hotspot/.hgtags
@@ -422,3 +422,4 @@ b14e7c0b7d3ec04127f565cda1d84122e205680c jdk9-b16
14b656df31c2cb09c505921061e79977823de71a jdk9-b17
871fd128548480095e0dc3fc34c422666baeec75 jdk9-b18
d4cffb3ae6213c66c7522ebffe0349360a45f0ef jdk9-b19
+c1af79d122ec9f715fa29312b5e91763f3a4dfc4 jdk9-b20
From 52da8719abd1521964d8a56aa0fe0aa9e90509e3 Mon Sep 17 00:00:00 2001
From: David Katleman
Date: Thu, 26 Jun 2014 12:51:35 -0700
Subject: [PATCH 52/76] Added tag jdk9-b20 for changeset 6dbc3c71c0e2
---
jaxp/.hgtags | 1 +
1 file changed, 1 insertion(+)
diff --git a/jaxp/.hgtags b/jaxp/.hgtags
index 4b109feb5a8..52f9145880b 100644
--- a/jaxp/.hgtags
+++ b/jaxp/.hgtags
@@ -262,3 +262,4 @@ a1461221b05d4620e4d7d1907e2a0282aaedf31c jdk9-b16
6f923fcbe5129eceb9617a9a18dbdd743980e785 jdk9-b17
5afa90c28742d175431be75f9098745510bd2b30 jdk9-b18
f9c82769a6bc2b219a8f01c24afe5c91039267d7 jdk9-b19
+94fd4d9d3a75819644b21e18c8a567fd0e973eaf jdk9-b20
From 8f396a3720f8b6102c0dd183d3b4923be0b99342 Mon Sep 17 00:00:00 2001
From: David Katleman
Date: Thu, 26 Jun 2014 12:51:36 -0700
Subject: [PATCH 53/76] Added tag jdk9-b20 for changeset 02490297734b
---
jaxws/.hgtags | 1 +
1 file changed, 1 insertion(+)
diff --git a/jaxws/.hgtags b/jaxws/.hgtags
index f17a048b809..b242b0bc918 100644
--- a/jaxws/.hgtags
+++ b/jaxws/.hgtags
@@ -265,3 +265,4 @@ e9780330017a6b464a385356d77e5136f9de8d09 jdk9-b15
6b159e727dac283f424b7d19f5be3ddd9f85acf5 jdk9-b17
275f2385aed80c84297840638d58656366350c58 jdk9-b18
7f922a73e8a2c6ce42634238090fce7c6d599541 jdk9-b19
+6a9f8ff45c04a172df446a418c586da6a86564d5 jdk9-b20
From 1cd83dc91f4de0248a3f8d22f20286a697b8c07e Mon Sep 17 00:00:00 2001
From: David Katleman
Date: Thu, 26 Jun 2014 12:51:38 -0700
Subject: [PATCH 54/76] Added tag jdk9-b20 for changeset 8c82c02495e7
---
jdk/.hgtags | 1 +
1 file changed, 1 insertion(+)
diff --git a/jdk/.hgtags b/jdk/.hgtags
index 5a2f74362fc..827ca017224 100644
--- a/jdk/.hgtags
+++ b/jdk/.hgtags
@@ -262,3 +262,4 @@ ab7d2c565b0de5bee1361d282d4029371327fc9e jdk9-b16
fd8e675f141b9bdb2f46d1ae8251f4ee3a895d64 jdk9-b17
6ad17b31f0d30593392b1e8695b9709dbbd7fb70 jdk9-b18
27561aede285c25a3e9ed8bf8918234ad3bb81e3 jdk9-b19
+f87c5be90e01a7ffb47947108eb3e0b0b1920880 jdk9-b20
From 3bfe90c1b1ee2e8fea8ab48fcb9c4579d5ddcf9a Mon Sep 17 00:00:00 2001
From: David Katleman
Date: Thu, 26 Jun 2014 12:51:49 -0700
Subject: [PATCH 55/76] Added tag jdk9-b20 for changeset d77065991eb8
---
langtools/.hgtags | 1 +
1 file changed, 1 insertion(+)
diff --git a/langtools/.hgtags b/langtools/.hgtags
index 57ed74c4fc4..65e86128fc8 100644
--- a/langtools/.hgtags
+++ b/langtools/.hgtags
@@ -262,3 +262,4 @@ f04fccfbd880c819affc3ef33e0083aab9556409 jdk9-b11
b64f8d5b97faa29e4d629bf4e56ebe0e26c40ecc jdk9-b17
fd8da51c5df4546995c360fc49f0b985cbf8fbd3 jdk9-b18
a9accd7c44159f191ad09740d54493e563c39f95 jdk9-b19
+31acbc476a5251824f919df0b82bca9cbb19cf7c jdk9-b20
From b078d4c58e76e167e2f9c2c6e0480ccae8e0ef4c Mon Sep 17 00:00:00 2001
From: David Katleman
Date: Thu, 26 Jun 2014 12:51:50 -0700
Subject: [PATCH 56/76] Added tag jdk9-b20 for changeset 7fb8003ec760
---
nashorn/.hgtags | 1 +
1 file changed, 1 insertion(+)
diff --git a/nashorn/.hgtags b/nashorn/.hgtags
index 7aaa209e13b..1a1ec8355f0 100644
--- a/nashorn/.hgtags
+++ b/nashorn/.hgtags
@@ -253,3 +253,4 @@ fed8c83dfba4dce94d2ae1cb82f026634ff2a3e4 jdk9-b16
4a47b7cfecdf2a865811ab08a7ef49c942801d7c jdk9-b17
893c337bc95fef3885baa3e4ffc30d68f62a829f jdk9-b18
46e36a92e37c06dea50f8c829549d9d0bfed4e3c jdk9-b19
+d703c59c556f9fcd9604272806ef7acf55c92363 jdk9-b20
From 49402ab5179291b53c13cb209492056258b3ed7f Mon Sep 17 00:00:00 2001
From: Valerie Peng
Date: Tue, 1 Jul 2014 20:35:30 +0000
Subject: [PATCH 57/76] 8046046: Test
sun/security/pkcs11/Signature/TestDSAKeyLength.java fails intermittently on
Solaris 11 in 8u40 nightly
Override the upper limit to 1024 for SHA1withDSA when larger DSA key size is supported.
Reviewed-by: mullan, ascarpino
---
.../share/classes/sun/security/pkcs11/P11Signature.java | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/jdk/src/share/classes/sun/security/pkcs11/P11Signature.java b/jdk/src/share/classes/sun/security/pkcs11/P11Signature.java
index 4a0733d7195..1bac22ca62c 100644
--- a/jdk/src/share/classes/sun/security/pkcs11/P11Signature.java
+++ b/jdk/src/share/classes/sun/security/pkcs11/P11Signature.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -340,7 +340,10 @@ final class P11Signature extends SignatureSpi {
}
int minKeySize = (int) mechInfo.ulMinKeySize;
int maxKeySize = (int) mechInfo.ulMaxKeySize;
-
+ // need to override the MAX keysize for SHA1withDSA
+ if (md != null && mechanism == CKM_DSA && maxKeySize > 1024) {
+ maxKeySize = 1024;
+ }
int keySize = 0;
if (key instanceof P11Key) {
keySize = ((P11Key) key).length();
From edc85c8e4cc6011f37845013a6f3cd2305ef66f2 Mon Sep 17 00:00:00 2001
From: Valerie Peng
Date: Tue, 1 Jul 2014 20:35:43 +0000
Subject: [PATCH 58/76] 8027575: b113 causing a lot of memory allocation and
regression for wls_webapp_atomics
Reduce buffer allocation and do multiple cipher encryption/decryption calls.
Reviewed-by: xuelei, ascarpino
---
.../com/sun/crypto/provider/CipherCore.java | 67 +++++++++++--------
.../provider/Cipher/AES/TestCopySafe.java | 6 +-
2 files changed, 42 insertions(+), 31 deletions(-)
diff --git a/jdk/src/share/classes/com/sun/crypto/provider/CipherCore.java b/jdk/src/share/classes/com/sun/crypto/provider/CipherCore.java
index 8d54633adb1..6b5eea85d6d 100644
--- a/jdk/src/share/classes/com/sun/crypto/provider/CipherCore.java
+++ b/jdk/src/share/classes/com/sun/crypto/provider/CipherCore.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -720,6 +720,15 @@ final class CipherCore {
int outLen = 0;
if (len != 0) { // there is some work to do
+ if ((input == output)
+ && (outputOffset < (inputOffset + inputLen))
+ && (inputOffset < (outputOffset + buffer.length))) {
+ // copy 'input' out to avoid its content being
+ // overwritten prematurely.
+ input = Arrays.copyOfRange(input, inputOffset,
+ inputOffset + inputLen);
+ inputOffset = 0;
+ }
if (len <= buffered) {
// all to-be-processed data are from 'buffer'
if (decrypting) {
@@ -732,37 +741,37 @@ final class CipherCore {
System.arraycopy(buffer, len, buffer, 0, buffered);
}
} else { // len > buffered
- if ((input != output) && (buffered == 0)) {
- // all to-be-processed data are from 'input'
- // however, note that if 'input' and 'output' are the same,
- // then they can't be passed directly to the underlying cipher
- // engine operations as data may be overwritten before they
- // are read.
+ int inputConsumed = len - buffered;
+ int temp;
+ if (buffered > 0) {
+ int bufferCapacity = buffer.length - buffered;
+ if (bufferCapacity != 0) {
+ temp = Math.min(bufferCapacity, inputConsumed);
+ System.arraycopy(input, inputOffset, buffer, buffered, temp);
+ inputOffset += temp;
+ inputConsumed -= temp;
+ inputLen -= temp;
+ buffered += temp;
+ }
+ // process 'buffer'
if (decrypting) {
- outLen = cipher.decrypt(input, inputOffset, len, output, outputOffset);
+ outLen = cipher.decrypt(buffer, 0, buffered, output, outputOffset);
} else {
- outLen = cipher.encrypt(input, inputOffset, len, output, outputOffset);
- }
- inputOffset += len;
- inputLen -= len;
- } else {
- // assemble the data using both 'buffer' and 'input'
- byte[] in = new byte[len];
- int inConsumed = len - buffered;
- if (buffered != 0) {
- System.arraycopy(buffer, 0, in, 0, buffered);
- buffered = 0;
- }
- if (inConsumed != 0) {
- System.arraycopy(input, inputOffset, in, len - inConsumed, inConsumed);
- inputOffset += inConsumed;
- inputLen -= inConsumed;
+ outLen = cipher.encrypt(buffer, 0, buffered, output, outputOffset);
}
+ outputOffset += outLen;
+ buffered = 0;
+ }
+ if (inputConsumed > 0) { // still has input to process
if (decrypting) {
- outLen = cipher.decrypt(in, 0, len, output, outputOffset);
+ outLen += cipher.decrypt(input, inputOffset, inputConsumed,
+ output, outputOffset);
} else {
- outLen = cipher.encrypt(in, 0, len, output, outputOffset);
+ outLen += cipher.encrypt(input, inputOffset, inputConsumed,
+ output, outputOffset);
}
+ inputOffset += inputConsumed;
+ inputLen -= inputConsumed;
}
}
// Let's keep track of how many bytes are needed to make
@@ -925,8 +934,10 @@ final class CipherCore {
byte[] finalBuf = input;
int finalOffset = inputOffset;
int finalBufLen = inputLen;
- if ((input == output) || (buffered != 0) ||
- (!decrypting && padding != null)) {
+ if ((buffered != 0) || (!decrypting && padding != null) ||
+ ((input == output)
+ && (outputOffset < (inputOffset + inputLen))
+ && (inputOffset < (outputOffset + buffer.length)))) {
if (decrypting || padding == null) {
paddingLen = 0;
}
diff --git a/jdk/test/com/sun/crypto/provider/Cipher/AES/TestCopySafe.java b/jdk/test/com/sun/crypto/provider/Cipher/AES/TestCopySafe.java
index 20dff835f90..697da6750ad 100644
--- a/jdk/test/com/sun/crypto/provider/Cipher/AES/TestCopySafe.java
+++ b/jdk/test/com/sun/crypto/provider/Cipher/AES/TestCopySafe.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8026943
+ * @bug 8026943 8027575
* @summary Verify that same buffer can be used as input and output when
* using Cipher objects.
* @author Valerie Peng
@@ -44,7 +44,7 @@ public class TestCopySafe {
private static SecretKey KEY = new SecretKeySpec(new byte[16], "AES");
private static byte[] IV = new byte[16];
- private static int[] OFFSETS = { 1, 8, 17 };
+ private static int[] OFFSETS = { 1, 8, 9, 16, 17, 32, 33 };
private static final String[] MODES = {
"ECB", "CBC", "PCBC", "CTR", "CTS",
From 08343847dc23e3e923940943965b23aafd9fba5c Mon Sep 17 00:00:00 2001
From: "J. Duke"
Date: Wed, 5 Jul 2017 19:45:37 +0200
Subject: [PATCH 59/76] Added tag jdk9-b19 for changeset 2dcf544eb7ed
---
.hgtags | 1 +
1 file changed, 1 insertion(+)
diff --git a/.hgtags b/.hgtags
index 36cbfa27702..1f3b994c4f4 100644
--- a/.hgtags
+++ b/.hgtags
@@ -261,3 +261,4 @@ efe7dbc6088691757404e0c8745f894e3ca9c022 jdk9-b09
4a09f5d30be844ac6f714bdb0f63d8c3c08b9a98 jdk9-b16
410bccbded9e9cce80f1e13ad221e37ae97a3986 jdk9-b17
c5495e25c7258ab5f96a1ae14610887d76d2be63 jdk9-b18
+2dcf544eb7ed5ac6a3f7813a32e33acea7442405 jdk9-b19
From 8af4a825cb8efe415158a41c117920c95e43b41b Mon Sep 17 00:00:00 2001
From: "J. Duke"
Date: Wed, 5 Jul 2017 19:46:41 +0200
Subject: [PATCH 60/76] Added tag jdk9-b20 for changeset 89731ae72a76
---
.hgtags | 1 +
1 file changed, 1 insertion(+)
diff --git a/.hgtags b/.hgtags
index 1f3b994c4f4..a7ad329d42d 100644
--- a/.hgtags
+++ b/.hgtags
@@ -262,3 +262,4 @@ efe7dbc6088691757404e0c8745f894e3ca9c022 jdk9-b09
410bccbded9e9cce80f1e13ad221e37ae97a3986 jdk9-b17
c5495e25c7258ab5f96a1ae14610887d76d2be63 jdk9-b18
2dcf544eb7ed5ac6a3f7813a32e33acea7442405 jdk9-b19
+89731ae72a761afdf4262e8b9513f302f6563f89 jdk9-b20
From 8d02787bfc5894170787e89f891a775bac5e6cdd Mon Sep 17 00:00:00 2001
From: Weijun Wang
Date: Wed, 2 Jul 2014 09:48:32 +0800
Subject: [PATCH 61/76] 8048511: Uninitialised memory in
jdk/src/share/native/sun/security/jgss/wrapper/GSSLibStub.c
Reviewed-by: valeriep
---
jdk/src/share/native/sun/security/jgss/wrapper/GSSLibStub.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/jdk/src/share/native/sun/security/jgss/wrapper/GSSLibStub.c b/jdk/src/share/native/sun/security/jgss/wrapper/GSSLibStub.c
index e14036b899c..b9bfb929830 100644
--- a/jdk/src/share/native/sun/security/jgss/wrapper/GSSLibStub.c
+++ b/jdk/src/share/native/sun/security/jgss/wrapper/GSSLibStub.c
@@ -639,7 +639,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_releaseCred(JNIEnv *env,
*/
void inquireCred(JNIEnv *env, jobject jobj, gss_cred_id_t pCred,
jint type, void *result) {
- OM_uint32 minor, major=0;
+ OM_uint32 minor=0, major=0;
OM_uint32 routineErr;
gss_cred_id_t credHdl;
From f377795d11a5d67f9617ae6551bffd16398e1efd Mon Sep 17 00:00:00 2001
From: Katja Kantserova
Date: Tue, 1 Jul 2014 21:23:54 +0200
Subject: [PATCH 62/76] 8048892: TEST_BUG: shell script tests need to be change
to not use retired @debuggeeVMOptions mechanism
Reviewed-by: sla, jbachorik
---
jdk/test/com/sun/jdi/PrivateTransportTest.sh | 7 +-
jdk/test/com/sun/jdi/ShellScaffold.sh | 9 +-
jdk/test/com/sun/jdi/SuspendNoFlagTest.java | 48 +++++++++
jdk/test/com/sun/jdi/SuspendNoFlagTest.sh | 104 -------------------
jdk/test/com/sun/jdi/VMConnection.java | 3 +-
5 files changed, 52 insertions(+), 119 deletions(-)
create mode 100644 jdk/test/com/sun/jdi/SuspendNoFlagTest.java
delete mode 100644 jdk/test/com/sun/jdi/SuspendNoFlagTest.sh
diff --git a/jdk/test/com/sun/jdi/PrivateTransportTest.sh b/jdk/test/com/sun/jdi/PrivateTransportTest.sh
index 7f4b0029f26..1885b6d3d4b 100644
--- a/jdk/test/com/sun/jdi/PrivateTransportTest.sh
+++ b/jdk/test/com/sun/jdi/PrivateTransportTest.sh
@@ -82,12 +82,7 @@ fi
echo "JDK under test is: $TESTJAVA"
# Get flags being sent to debuggee
-DEBUGGEEFLAGS=
-if [ -r $TESTCLASSES/@debuggeeVMOptions ] ; then
- DEBUGGEEFLAGS=`cat $TESTCLASSES/@debuggeeVMOptions`
-elif [ -r $TESTCLASSES/../@debuggeeVMOptions ] ; then
- DEBUGGEEFLAGS=`cat $TESTCLASSES/../@debuggeeVMOptions`
-fi
+DEBUGGEEFLAGS=$TESTVMOPTS $TESTJAVAOPTS
# Figure out what the libarch path is
os=`uname -s`
diff --git a/jdk/test/com/sun/jdi/ShellScaffold.sh b/jdk/test/com/sun/jdi/ShellScaffold.sh
index 193aabcb907..dec8ed4151f 100644
--- a/jdk/test/com/sun/jdi/ShellScaffold.sh
+++ b/jdk/test/com/sun/jdi/ShellScaffold.sh
@@ -882,15 +882,10 @@ startJdb()
startDebuggee()
{
- args=
- # Note that @debuggeeVMOptions is unique to a test run instead of
- # a test in a run. It is not modified during a test run.
- if [ -r $TESTCLASSES/../@debuggeeVMOptions ] ; then
- args=`cat $TESTCLASSES/../@debuggeeVMOptions`
- fi
+ args=$TESTVMOPTS $TESTJAVAOPTS
if [ ! -z "$args" ] ; then
- echo "--Starting debuggee with args from @debuggeeVMOptions: $args"
+ echo "--Starting debuggee with args from TESTVMOPTS and/or TESTJAVAOPTS: $args"
else
echo "--Starting debuggee"
fi
diff --git a/jdk/test/com/sun/jdi/SuspendNoFlagTest.java b/jdk/test/com/sun/jdi/SuspendNoFlagTest.java
new file mode 100644
index 00000000000..ad506f500ce
--- /dev/null
+++ b/jdk/test/com/sun/jdi/SuspendNoFlagTest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import jdk.testlibrary.OutputAnalyzer;
+import jdk.testlibrary.ProcessTools;
+
+/* @test
+ * @bug 4914611
+ * @summary Test for JDWP: -agentlib:jdwp=suspend=n hanging
+ * @library /lib/testlibrary
+ * @build jdk.testlibarary.*
+ * @compile -g HelloWorld.java
+ * @run driver SuspendNoFlagTest
+ */
+public class SuspendNoFlagTest {
+
+ private static final String TEST_CLASSES = System.getProperty(
+ "test.classes", ".");
+
+ public static void main(String[] args) throws Throwable {
+ OutputAnalyzer output = ProcessTools.executeTestJvm("-classpath",
+ TEST_CLASSES,
+ "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n",
+ "HelloWorld");
+ output.shouldHaveExitValue(0);
+ }
+
+}
diff --git a/jdk/test/com/sun/jdi/SuspendNoFlagTest.sh b/jdk/test/com/sun/jdi/SuspendNoFlagTest.sh
deleted file mode 100644
index dd4a24e4d76..00000000000
--- a/jdk/test/com/sun/jdi/SuspendNoFlagTest.sh
+++ /dev/null
@@ -1,104 +0,0 @@
-#!/bin/ksh -p
-
-#
-# Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-#
-# @test SuspendNoFlagTest.sh
-# @bug 4914611
-# @summary Test for JDWP: -agentlib:jdwp=suspend=n hanging
-# @author Kelly O'Hair
-# Based on test/java/awt/TEMPLATE/AutomaticShellTest.sh
-#
-# @run compile -g HelloWorld.java
-# @run shell/timeout=60 SuspendNoFlagTest.sh
-#
-
-# Beginning of subroutines:
-status=1
-
-#Call this from anywhere to fail the test with an error message
-# usage: fail "reason why the test failed"
-fail()
- { echo "The test failed :-("
- echo "$*" 1>&2
- echo "exit status was $status"
- exit $status
- } #end of fail()
-
-#Call this from anywhere to pass the test with a message
-# usage: pass "reason why the test passed if applicable"
-pass()
- { echo "The test passed!!!"
- echo "$*" 1>&2
- exit 0
- } #end of pass()
-
-# end of subroutines
-
-# The beginning of the script proper
-
-TARGETCLASS="HelloWorld"
-if [ -z "${TESTJAVA}" ] ; then
- # TESTJAVA is not set, so the test is running stand-alone.
- # TESTJAVA holds the path to the root directory of the build of the JDK
- # to be tested. That is, any java files run explicitly in this shell
- # should use TESTJAVA in the path to the java interpreter.
- # So, we'll set this to the JDK spec'd on the command line. If none
- # is given on the command line, tell the user that and use a default.
- # THIS IS THE JDK BEING TESTED.
- if [ -n "$1" ] ; then
- TESTJAVA=$1
- else
- TESTJAVA=$JAVA_HOME
- fi
- TESTSRC=.
- TESTCLASSES=.
- #Deal with .class files:
- ${TESTJAVA}/bin/javac -d ${TESTCLASSES} \
- -classpath "${TESTCLASSES}" -g \
- ${TARGETCLASS}.java
-fi
-#
-echo "JDK under test is: $TESTJAVA"
-#
-CP="-classpath \"${TESTCLASSES}\""
-#
-DEBUGEEFLAGS=
-if [ -r $TESTCLASSES/@debuggeeVMOptions ] ; then
- DEBUGEEFLAGS=`cat $TESTCLASSES/@debuggeeVMOptions`
-elif [ -r $TESTCLASSES/../@debuggeeVMOptions ] ; then
- DEBUGEEFLAGS=`cat $TESTCLASSES/../@debuggeeVMOptions`
-fi
-DEBUGEEFLAGS="$DEBUGEEFLAGS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n"
-
-java=java
-echo ${TESTJAVA}/bin/$java ${DEBUGEEFLAGS} ${CP} ${TARGETCLASS}
-eval ${TESTJAVA}/bin/$java ${DEBUGEEFLAGS} ${CP} ${TARGETCLASS}
-status=$?
-echo "test status was: $status"
-if [ $status -eq "0" ] ;
- then pass "status = 0 and no timeout occured"
-
- else fail "unspecified test failure (timed out or hung)"
-fi
diff --git a/jdk/test/com/sun/jdi/VMConnection.java b/jdk/test/com/sun/jdi/VMConnection.java
index 2df2e63057e..a9e5355a321 100644
--- a/jdk/test/com/sun/jdi/VMConnection.java
+++ b/jdk/test/com/sun/jdi/VMConnection.java
@@ -44,8 +44,7 @@ class VMConnection {
/**
* Return a String containing VM Options to pass to the debugee
* or an empty string if there are none.
- * These are read from the first non-comment line
- * in file @debuggeeVMOptions in the test.classes dir
+ * These are read from TESTVMOPTS and/or TESTJAVAOPTS.
*/
static public String getDebuggeeVMOptions() {
String retVal = "";
From 463b504956df582adb3c51b864abfdb1d9aad2bf Mon Sep 17 00:00:00 2001
From: Raoul-Gabriel Urma
Date: Tue, 1 Jul 2014 23:39:31 -0700
Subject: [PATCH 63/76] 8048989: small errors in Collectors examples
Reviewed-by: darcy
---
jdk/src/share/classes/java/util/stream/Collectors.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/jdk/src/share/classes/java/util/stream/Collectors.java b/jdk/src/share/classes/java/util/stream/Collectors.java
index 75ca1ca0f50..70d7f286d8d 100644
--- a/jdk/src/share/classes/java/util/stream/Collectors.java
+++ b/jdk/src/share/classes/java/util/stream/Collectors.java
@@ -729,7 +729,7 @@ public final class Collectors {
* person in each city:
* {@code
* Comparator byHeight = Comparator.comparing(Person::getHeight);
- * Map tallestByCity
+ * Map> tallestByCity
* = people.stream().collect(groupingBy(Person::getCity, reducing(BinaryOperator.maxBy(byHeight))));
* }
*
@@ -784,7 +784,7 @@ public final class Collectors {
* Comparator byLength = Comparator.comparing(String::length);
* Map longestLastNameByCity
* = people.stream().collect(groupingBy(Person::getCity,
- * reducing(Person::getLastName, BinaryOperator.maxBy(byLength))));
+ * reducing("", Person::getLastName, BinaryOperator.maxBy(byLength))));
* }
*
* @param the type of the input elements
From 0139a3b9e7d3cbbe2c4efe1653856c2cd2769040 Mon Sep 17 00:00:00 2001
From: Staffan Larsen
Date: Wed, 2 Jul 2014 08:41:59 +0200
Subject: [PATCH 64/76] 8046883: com/sun/jdi/ProcessAttachTest.sh gets
"java.io.IOException: Invalid process identifier" on windows
Reviewed-by: dcubed, dsamersoff, allwin
---
.../com/sun/jdi/ProcessAttachDebuggee.java | 62 ------
.../com/sun/jdi/ProcessAttachDebugger.java | 81 -------
jdk/test/com/sun/jdi/ProcessAttachTest.java | 116 ++++++++++
jdk/test/com/sun/jdi/ProcessAttachTest.sh | 199 ------------------
jdk/test/com/sun/jdi/ShutdownDebuggee.java | 62 ------
5 files changed, 116 insertions(+), 404 deletions(-)
delete mode 100644 jdk/test/com/sun/jdi/ProcessAttachDebuggee.java
delete mode 100644 jdk/test/com/sun/jdi/ProcessAttachDebugger.java
create mode 100644 jdk/test/com/sun/jdi/ProcessAttachTest.java
delete mode 100644 jdk/test/com/sun/jdi/ProcessAttachTest.sh
delete mode 100644 jdk/test/com/sun/jdi/ShutdownDebuggee.java
diff --git a/jdk/test/com/sun/jdi/ProcessAttachDebuggee.java b/jdk/test/com/sun/jdi/ProcessAttachDebuggee.java
deleted file mode 100644
index 3208b1551ee..00000000000
--- a/jdk/test/com/sun/jdi/ProcessAttachDebuggee.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- *
- *
- * The "debuggee" used by the unit tests for the ProcessAttachingConnector.
- * This debuggee binds to a random TCP port and waits for a client to connect.
- */
-import java.net.Socket;
-import java.net.ServerSocket;
-import java.nio.file.CopyOption;
-import java.nio.file.Files;
-import java.nio.file.StandardCopyOption;
-import java.io.File;
-import java.io.FileOutputStream;
-
-public class ProcessAttachDebuggee {
- public static void main(String args[]) throws Exception {
- // bind to a random port
- ServerSocket ss = new ServerSocket(0);
- int port = ss.getLocalPort();
-
- // Write the port number to the given file
- File partial = new File(args[0] + ".partial");
- File portFile = new File(args[0]);
- try (FileOutputStream fos = new FileOutputStream(partial)) {
- fos.write( Integer.toString(port).getBytes("UTF-8") );
- }
- Files.move(partial.toPath(), portFile.toPath(), StandardCopyOption.ATOMIC_MOVE);
-
- System.out.println("Debuggee bound to port: " + port);
- System.out.flush();
-
- // wait for test harness to connect
- Socket s = ss.accept();
- s.close();
- ss.close();
-
- System.out.println("Debuggee shutdown.");
- }
-}
diff --git a/jdk/test/com/sun/jdi/ProcessAttachDebugger.java b/jdk/test/com/sun/jdi/ProcessAttachDebugger.java
deleted file mode 100644
index 93094032883..00000000000
--- a/jdk/test/com/sun/jdi/ProcessAttachDebugger.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- *
- *
- * Unit test for ProcessAttachingConnector - this "debugger" attaches to a debuggee
- * given it's pid. Usage:
- *
- * java ProcessAttachDebugger
- */
-
-import com.sun.jdi.Bootstrap;
-import com.sun.jdi.VirtualMachine;
-import com.sun.jdi.ThreadReference;
-import com.sun.jdi.connect.Connector;
-import com.sun.jdi.connect.AttachingConnector;
-
-import java.util.List;
-import java.util.Map;
-
-public class ProcessAttachDebugger {
-
- public static void main(String main_args[]) throws Exception {
- String pid = main_args[0];
-
- // find ProcessAttachingConnector
-
- List l =
- Bootstrap.virtualMachineManager().attachingConnectors();
- AttachingConnector ac = null;
- for (AttachingConnector c: l) {
- if (c.name().equals("com.sun.jdi.ProcessAttach")) {
- ac = c;
- break;
- }
- }
- if (ac == null) {
- throw new RuntimeException("Unable to locate ProcessAttachingConnector");
- }
-
- Map args = ac.defaultArguments();
- Connector.StringArgument arg = (Connector.StringArgument)args.get("pid");
- arg.setValue(pid);
-
- System.out.println("Debugger is attaching to: " + pid + " ...");
-
- VirtualMachine vm = ac.attach(args);
-
- System.out.println("Attached! Now listing threads ...");
-
- // list all threads
-
- for (ThreadReference thr: vm.allThreads()) {
- System.out.println(thr);
- }
-
- System.out.println("Debugger done.");
- }
-
-}
diff --git a/jdk/test/com/sun/jdi/ProcessAttachTest.java b/jdk/test/com/sun/jdi/ProcessAttachTest.java
new file mode 100644
index 00000000000..972f27b04db
--- /dev/null
+++ b/jdk/test/com/sun/jdi/ProcessAttachTest.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Map;
+
+import jdk.testlibrary.ProcessTools;
+
+import com.sun.jdi.Bootstrap;
+import com.sun.jdi.ThreadReference;
+import com.sun.jdi.VirtualMachine;
+import com.sun.jdi.connect.AttachingConnector;
+import com.sun.jdi.connect.Connector;
+import com.sun.jdi.connect.IllegalConnectorArgumentsException;
+
+/**
+ * @test
+ * @bug 4527279
+ * @summary Unit test for ProcessAttachingConnector
+ *
+ * @library /lib/testlibrary
+ * @build jdk.testlibrary.* ProcessAttachTest
+ * @run driver ProcessAttachTest
+ */
+
+class ProcessAttachTestTarg {
+ public static void main(String args[]) throws Exception {
+ // Write something that can be read by the driver
+ System.out.println("Debuggee started");
+ System.out.flush();
+ for (;;) {
+ Thread.sleep(100);
+ }
+ }
+}
+
+public class ProcessAttachTest {
+
+ public static final String TESTCLASSES = System.getProperty("test.classes");
+
+ public static void main(String[] args) throws Exception {
+
+ System.out.println("Test 1: Debuggee start with suspend=n");
+ runTest("-agentlib:jdwp=transport=dt_socket,server=y,suspend=n");
+
+ System.out.println("Test 2: Debuggee start with suspend=y");
+ runTest("-agentlib:jdwp=transport=dt_socket,server=y,suspend=y");
+
+ }
+
+ private static void runTest(String jdwpArg) throws Exception {
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ jdwpArg,
+ "-classpath", TESTCLASSES,
+ "ProcessAttachTestTarg");
+ Process p = null;
+ try {
+ p = pb.start();
+
+ // Wait for the process to start
+ InputStream is = p.getInputStream();
+ is.read();
+
+ // Attach a debugger
+ tryDebug(p.getPid());
+ } finally {
+ p.destroyForcibly();
+ }
+ }
+
+ private static void tryDebug(long pid) throws IOException,
+ IllegalConnectorArgumentsException {
+ AttachingConnector ac = Bootstrap.virtualMachineManager().attachingConnectors()
+ .stream()
+ .filter(c -> c.name().equals("com.sun.jdi.ProcessAttach"))
+ .findFirst()
+ .orElseThrow(() -> new RuntimeException("Unable to locate ProcessAttachingConnector"));
+
+ Map args = ac.defaultArguments();
+ Connector.StringArgument arg = (Connector.StringArgument) args
+ .get("pid");
+ arg.setValue("" + pid);
+
+ System.out.println("Debugger is attaching to: " + pid + " ...");
+ VirtualMachine vm = ac.attach(args);
+
+ // list all threads
+ System.out.println("Attached! Now listing threads ...");
+ vm.allThreads().stream().forEach(System.out::println);
+
+ System.out.println("Debugger done.");
+ vm.dispose();
+ }
+}
diff --git a/jdk/test/com/sun/jdi/ProcessAttachTest.sh b/jdk/test/com/sun/jdi/ProcessAttachTest.sh
deleted file mode 100644
index 739b53abb10..00000000000
--- a/jdk/test/com/sun/jdi/ProcessAttachTest.sh
+++ /dev/null
@@ -1,199 +0,0 @@
-#!/bin/sh
-
-#
-# Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-
-# @test
-# @bug 4527279
-# @summary Unit test for ProcessAttachingConnector
-#
-# @build ProcessAttachDebugger ProcessAttachDebuggee ShutdownDebuggee
-# @run shell/timeout=120 ProcessAttachTest.sh
-
-if [ "${TESTJAVA}" = "" ]
-then
- echo "TESTJAVA not set. Test cannot execute. Failed."
- exit 1
-fi
-
-if [ "${TESTSRC}" = "" ]
-then
- echo "TESTSRC not set. Test cannot execute. Failed."
- exit 1
-fi
-
-if [ "${TESTCLASSES}" = "" ]
-then
- echo "TESTCLASSES not set. Test cannot execute. Failed."
- exit 1
-fi
-
-JAVA="${TESTJAVA}/bin/java"
-
-OS=`uname -s`
-
-case "$OS" in
- Windows*)
- PS=";"
- OS="Windows"
- ;;
- CYGWIN*)
- PS=";"
- OS="CYGWIN"
- ;;
- * )
- PS=":"
- ;;
-esac
-
-startDebuggee()
-{
- rm -f ${OUTPUTFILE}
- ${JAVA} "$@" > ${OUTPUTFILE} 2>&1 &
- startpid="$!"
- pid="${startpid}"
-
- # CYGWIN startpid is not the native windows PID we want, get the WINPID
- if [ "${OS}" = "CYGWIN" ]; then
- sleep 2
- ps -l -p ${startpid}
- pid=`ps -l -p ${startpid} | tail -1 | awk '{print $4;}'`
- fi
-
- # MKS creates an intermediate shell to launch ${JAVA} so
- # ${startpid} is not the actual pid. We have put in a small sleep
- # to give the intermediate shell process time to launch the
- # "java" process.
- if [ "$OS" = "Windows" ]; then
- sleep 2
- pid=`ps -o pid,ppid,comm | awk '/${startpid}.+java/{ print $1 }'`
- fi
-
- echo "Waiting for Debuggee to initialize..."
- attempts=0
- while true; do
- out=`tail -1 ${OUTPUTFILE}`
- if [ ! -z "$out" ]; then
- break
- fi
- sleep 1
- attempts=`expr $attempts + 1`
- echo "Waiting $attempts second(s) ..."
- done
-
- echo "Debuggee is process $pid (startpid=${startpid})"
-}
-
-stopDebuggee()
-{
- # We have to make sure the debuggee has written the portfile before
- # trying to read it.
-
- echo "Waiting for port file to be written..."
- attempts=0
- while true; do
- attempts=`expr $attempts + 1`
- if [ -f ${PORTFILE} ]; then
- break
- fi
- sleep 1
- echo "Waiting $attempts second(s) ..."
- done
-
- $JAVA -classpath "${TESTCLASSES}" ShutdownDebuggee $1 2>&1
- if [ $? != 0 ] ; then
- echo "Error: ShutdownDebuggee failed: $?"
- failures=`expr $failures + 1`
- kill -9 ${startpid}
- fi
-}
-
-failures=0
-
-#########################################################
-echo "Test 1: Debuggee start with suspend=n"
-
-PORTFILE=shutdown1.port
-OUTPUTFILE=Debuggee1.out
-
-DEBUGGEEFLAGS=
-if [ -r $TESTCLASSES/@debuggeeVMOptions ] ; then
- DEBUGGEEFLAGS=`cat $TESTCLASSES/@debuggeeVMOptions`
-elif [ -r $TESTCLASSES/../@debuggeeVMOptions ] ; then
- DEBUGGEEFLAGS=`cat $TESTCLASSES/../@debuggeeVMOptions`
-fi
-
-startDebuggee \
- $DEBUGGEEFLAGS \
- -agentlib:jdwp=transport=dt_socket,server=y,suspend=n \
- -classpath "${TESTCLASSES}" ProcessAttachDebuggee "${PORTFILE}"
-
-$JAVA -classpath "${TESTCLASSES}${PS}${TESTJAVA}/lib/tools.jar" \
- ProcessAttachDebugger $pid 2>&1
-
-if [ $? != 0 ]; then
- echo "Error: ProcessAttachDebugger failed: $?"
- failures=`expr $failures + 1`
-fi
-
-# Note that when the debugger disconnects, the debuggee picks another
-# port and outputs another 'Listening for transport ... ' msg.
-
-stopDebuggee "${PORTFILE}"
-
-echo "${OUTPUTFILE}:"
-cat $OUTPUTFILE
-echo "-----"
-
-#########################################################
-echo "\nTest 2: Debuggee start with suspend=y"
-
-PORTFILE=shutdown2.port
-OUTPUTFILE=Debuggee2.out
-
-startDebuggee \
- $DEBUGGEEFLAGS \
- -agentlib:jdwp=transport=dt_socket,server=y,suspend=y \
- -classpath "${TESTCLASSES}" ProcessAttachDebuggee "${PORTFILE}"
-
-$JAVA -classpath "${TESTCLASSES}${PS}${TESTJAVA}/lib/tools.jar" \
- ProcessAttachDebugger $pid 2>&1
-
-if [ $? != 0 ]; then
- echo "Error: ProcessAttachDebugger failed: $?"
- failures=`expr $failures + 1`
-fi
-
-stopDebuggee "${PORTFILE}"
-
-echo $OUTPUTFILE :
-cat $OUTPUTFILE
-echo -----
-
-###
-if [ $failures = 0 ];
- then echo "All tests passed.";
- else echo "$failures test(s) failed."
-fi
-exit $failures
diff --git a/jdk/test/com/sun/jdi/ShutdownDebuggee.java b/jdk/test/com/sun/jdi/ShutdownDebuggee.java
deleted file mode 100644
index b69768892a5..00000000000
--- a/jdk/test/com/sun/jdi/ShutdownDebuggee.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- *
- *
- * Used by the unit tests for the ProcessAttachingConnector. This class is
- * used to shutdown the debuggee by connecting to its shutdown port.
- */
-import java.net.Socket;
-import java.net.InetSocketAddress;
-import java.io.File;
-import java.io.FileInputStream;
-
-public class ShutdownDebuggee {
- public static void main(String args[]) throws Exception {
-
- // read the (TCP) port number from the given file
-
- File f = new File(args[0]);
- FileInputStream fis = new FileInputStream(f);
- byte b[] = new byte[8];
- int n = fis.read(b);
- if (n < 1) {
- throw new RuntimeException("Empty file");
- }
- fis.close();
-
- String str = new String(b, 0, n, "UTF-8");
- System.out.println("Port number of debuggee is: " + str);
- int port = Integer.parseInt(str);
-
- // Now connect to the port (which will shutdown debuggee)
-
- System.out.println("Connecting to port " + port +
- " to shutdown Debuggee ...");
-
- Socket s = new Socket();
- s.connect( new InetSocketAddress(port) );
- s.close();
- }
-}
From f4db094473e5c9838a1c4e45eba6cb34b438dae8 Mon Sep 17 00:00:00 2001
From: Weijun Wang
Date: Wed, 2 Jul 2014 17:03:47 +0800
Subject: [PATCH 65/76] 8042053: Broken links to jarsigner and keytool docs in
java.security package summary
Reviewed-by: xuelei
---
jdk/src/share/classes/java/security/package-info.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/jdk/src/share/classes/java/security/package-info.java b/jdk/src/share/classes/java/security/package-info.java
index 599e95259ba..2c8205b09b9 100644
--- a/jdk/src/share/classes/java/security/package-info.java
+++ b/jdk/src/share/classes/java/security/package-info.java
@@ -92,14 +92,14 @@
*
*
* keytool
- * (
+ * (
* for Solaris/Linux )
* (
* for Windows )
*
*
* jarsigner
- * (
+ * (
* for Solaris/Linux )
* (
* for Windows )
From fb6a5827280bca622083ad1a545e1e7d12103710 Mon Sep 17 00:00:00 2001
From: Alan Bateman
Date: Wed, 2 Jul 2014 10:03:40 +0100
Subject: [PATCH 66/76] 8048891: Remove unused JObjC from jdk repository
Reviewed-by: mchung
---
.../jobjc/JObjC.xcodeproj/default.pbxuser | 207 ---
.../jobjc/JObjC.xcodeproj/project.pbxproj | 1397 -----------------
jdk/src/macosx/native/jobjc/README.txt | 132 --
jdk/src/macosx/native/jobjc/TODOS | 27 -
jdk/src/macosx/native/jobjc/bridgesupport.gmk | 54 -
jdk/src/macosx/native/jobjc/build.xml | 520 ------
.../macosx/native/jobjc/extract_classes.pl | 39 -
.../macosx/native/jobjc/run-and-write-if-okay | 48 -
jdk/src/macosx/native/jobjc/rungen | 67 -
jdk/src/macosx/native/jobjc/runjava | 27 -
.../native/jobjc/src/core/PrimitiveCoder.hs | 275 ----
.../src/core/java/com/apple/jobjc/CFType.java | 35 -
.../src/core/java/com/apple/jobjc/CIF.java | 63 -
.../src/core/java/com/apple/jobjc/Coder.java | 289 ----
.../core/java/com/apple/jobjc/FFIType.java | 57 -
.../core/java/com/apple/jobjc/Function.java | 60 -
.../src/core/java/com/apple/jobjc/ID.java | 163 --
.../src/core/java/com/apple/jobjc/Invoke.java | 224 ---
.../java/com/apple/jobjc/JObjCRuntime.java | 139 --
.../java/com/apple/jobjc/MacOSXFramework.java | 74 -
.../core/java/com/apple/jobjc/NSClass.java | 117 --
.../com/apple/jobjc/NativeArgumentBuffer.java | 112 --
.../java/com/apple/jobjc/NativeBuffer.java | 109 --
.../jobjc/NativeObjectLifecycleManager.java | 55 -
.../src/core/java/com/apple/jobjc/Opaque.java | 31 -
.../core/java/com/apple/jobjc/Pointer.java | 57 -
.../java/com/apple/jobjc/PrimitiveCoder.java | 700 ---------
.../src/core/java/com/apple/jobjc/SEL.java | 62 -
.../src/core/java/com/apple/jobjc/Struct.java | 56 -
.../java/com/apple/jobjc/Subclassing.java | 167 --
.../macosx/native/jobjc/src/core/native/CIF.m | 50 -
.../native/jobjc/src/core/native/Coder.m | 58 -
.../native/jobjc/src/core/native/FFIType.m | 43 -
.../native/jobjc/src/core/native/Function.m | 51 -
.../macosx/native/jobjc/src/core/native/ID.m | 51 -
.../native/jobjc/src/core/native/Invoke.m | 40 -
.../jobjc/src/core/native/JObjCRuntime.m | 27 -
.../jobjc/src/core/native/MacOSXFramework.m | 69 -
.../native/jobjc/src/core/native/NSClass.m | 78 -
.../jobjc/src/core/native/NativeBuffer.h | 40 -
.../jobjc/src/core/native/NativeBuffer.m | 37 -
.../native/NativeObjectLifecycleManager.m | 65 -
.../macosx/native/jobjc/src/core/native/SEL.m | 44 -
.../jobjc/src/core/native/Subclassing.m | 301 ----
.../jobjc/generator/BootClassPathMinus.java | 51 -
.../jobjc/generator/ClassConsolidator.java | 112 --
.../jobjc/generator/ClassGenerator.java | 45 -
.../internal/jobjc/generator/FileCopier.java | 61 -
.../jobjc/generator/FrameworkGenerator.java | 112 --
.../jobjc/generator/FunctionGenerator.java | 178 ---
.../internal/jobjc/generator/Generator.java | 94 --
.../jobjc/generator/MethodDisambiguator.java | 66 -
.../jobjc/generator/RestrictedKeywords.java | 45 -
.../apple/internal/jobjc/generator/Utils.java | 186 ---
.../classes/AbstractObjCClassFile.java | 41 -
.../generator/classes/CFTypeClassFile.java | 59 -
.../classes/CategoryClassClassFile.java | 64 -
.../generator/classes/CategoryClassFile.java | 48 -
.../jobjc/generator/classes/CopiedFile.java | 54 -
.../generator/classes/FrameworkClassFile.java | 160 --
.../generator/classes/GeneratedClassFile.java | 78 -
.../classes/JObjCClassClassFile.java | 69 -
.../generator/classes/JObjCClassFile.java | 81 -
.../classes/MixedPrimitiveCoderClassFile.java | 51 -
.../generator/classes/OpaqueClassFile.java | 53 -
.../jobjc/generator/classes/OutputFile.java | 58 -
.../generator/classes/RootJObjCClass.java | 84 -
.../generator/classes/StructClassFile.java | 147 --
.../internal/jobjc/generator/model/Arg.java | 36 -
.../jobjc/generator/model/CFType.java | 47 -
.../jobjc/generator/model/Category.java | 44 -
.../internal/jobjc/generator/model/Clazz.java | 154 --
.../jobjc/generator/model/Constant.java | 33 -
.../jobjc/generator/model/Element.java | 102 --
.../jobjc/generator/model/ElementWType.java | 61 -
.../jobjc/generator/model/Framework.java | 209 ---
.../jobjc/generator/model/Function.java | 82 -
.../jobjc/generator/model/FunctionAlias.java | 33 -
.../generator/model/InformalProtocol.java | 33 -
.../jobjc/generator/model/Method.java | 87 -
.../jobjc/generator/model/NativeEnum.java | 138 --
.../jobjc/generator/model/Opaque.java | 42 -
.../generator/model/OutputFileGenerator.java | 33 -
.../jobjc/generator/model/Protocol.java | 33 -
.../jobjc/generator/model/ReturnValue.java | 45 -
.../jobjc/generator/model/StringConstant.java | 36 -
.../jobjc/generator/model/Struct.java | 78 -
.../jobjc/generator/model/TypeElement.java | 46 -
.../model/coders/CoderDescriptor.java | 127 --
.../model/coders/ComplexCoderDescriptor.java | 102 --
.../coders/PrimitiveCoderDescriptor.java | 108 --
.../jobjc/generator/model/types/JType.java | 237 ---
.../jobjc/generator/model/types/NType.java | 280 ----
.../jobjc/generator/model/types/Type.java | 173 --
.../generator/model/types/TypeCache.java | 132 --
.../generator/model/types/TypeToJType.java | 130 --
.../internal/jobjc/generator/utils/Fp.java | 260 ---
.../jobjc/generator/utils/JavaLang.java | 168 --
.../jobjc/generator/utils/NTypeMerger.java | 190 ---
.../jobjc/generator/utils/NTypeParser.java | 273 ----
.../jobjc/generator/utils/NTypePrinter.java | 107 --
.../generator/utils/ObjectInspector.java | 70 -
.../internal/jobjc/generator/utils/QA.java | 39 -
.../jobjc/generator/utils/StringStream.java | 155 --
.../generator/utils/StructOffsetResolver.java | 255 ---
.../utils/StructOffsetResolverBigBang.java | 80 -
.../com/apple/jobjc/SuperClassExtractor.java | 51 -
.../com/apple/jobjc/UnsafeRuntimeAccess.java | 70 -
.../java/com/apple/jobjc/Utils.java | 121 --
.../runtime-additions/native/NativeNumber.m | 50 -
.../runtime-additions/native/NativeString.m | 50 -
.../runtime-additions/native/NativeThread.m | 111 --
.../tests/java/com/apple/jobjc/BaseBench.java | 78 -
.../java/com/apple/jobjc/BenchFunCall.java | 81 -
.../java/com/apple/jobjc/BenchIDPop.java | 95 --
.../com/apple/jobjc/BenchStructCoding.java | 83 -
.../java/com/apple/jobjc/BenchUnsafe.java | 61 -
.../java/com/apple/jobjc/CategoryTest.java | 47 -
.../java/com/apple/jobjc/FunctionTest.java | 81 -
.../tests/java/com/apple/jobjc/GUIDemo.java | 116 --
.../tests/java/com/apple/jobjc/IBDemo.java | 91 --
.../tests/java/com/apple/jobjc/IntroTest.java | 125 --
.../java/com/apple/jobjc/NSClassTest.java | 50 -
.../com/apple/jobjc/NativeBufferTest.java | 38 -
.../java/com/apple/jobjc/NativeTypeTest.java | 97 --
.../java/com/apple/jobjc/PooledTestCase.java | 47 -
.../tests/java/com/apple/jobjc/SELTest.java | 61 -
.../java/com/apple/jobjc/StructTest.java | 93 --
.../java/com/apple/jobjc/SubclassingTest.java | 231 ---
.../tests/java/com/apple/jobjc/TestUtils.java | 36 -
.../tests/java/com/apple/jobjc/UtilsTest.java | 78 -
.../java/com/apple/jobjc/VarArgsTest.java | 63 -
.../jobjc/src/tests/native/FunCallBench.m | 70 -
133 files changed, 14747 deletions(-)
delete mode 100644 jdk/src/macosx/native/jobjc/JObjC.xcodeproj/default.pbxuser
delete mode 100644 jdk/src/macosx/native/jobjc/JObjC.xcodeproj/project.pbxproj
delete mode 100644 jdk/src/macosx/native/jobjc/README.txt
delete mode 100644 jdk/src/macosx/native/jobjc/TODOS
delete mode 100644 jdk/src/macosx/native/jobjc/bridgesupport.gmk
delete mode 100644 jdk/src/macosx/native/jobjc/build.xml
delete mode 100644 jdk/src/macosx/native/jobjc/extract_classes.pl
delete mode 100644 jdk/src/macosx/native/jobjc/run-and-write-if-okay
delete mode 100644 jdk/src/macosx/native/jobjc/rungen
delete mode 100644 jdk/src/macosx/native/jobjc/runjava
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/PrimitiveCoder.hs
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/CFType.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/CIF.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Coder.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/FFIType.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Function.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/ID.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Invoke.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/JObjCRuntime.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/MacOSXFramework.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NSClass.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NativeArgumentBuffer.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NativeBuffer.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NativeObjectLifecycleManager.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Opaque.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Pointer.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/PrimitiveCoder.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/SEL.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Struct.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Subclassing.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/native/CIF.m
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/native/Coder.m
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/native/FFIType.m
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/native/Function.m
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/native/ID.m
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/native/Invoke.m
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/native/JObjCRuntime.m
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/native/MacOSXFramework.m
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/native/NSClass.m
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/native/NativeBuffer.h
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/native/NativeBuffer.m
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/native/NativeObjectLifecycleManager.m
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/native/SEL.m
delete mode 100644 jdk/src/macosx/native/jobjc/src/core/native/Subclassing.m
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/BootClassPathMinus.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/ClassConsolidator.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/ClassGenerator.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/FileCopier.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/FrameworkGenerator.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/FunctionGenerator.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/Generator.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/MethodDisambiguator.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/RestrictedKeywords.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/Utils.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/classes/AbstractObjCClassFile.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/classes/CFTypeClassFile.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/classes/CategoryClassClassFile.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/classes/CategoryClassFile.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/classes/CopiedFile.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/classes/FrameworkClassFile.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/classes/GeneratedClassFile.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/classes/JObjCClassClassFile.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/classes/JObjCClassFile.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/classes/MixedPrimitiveCoderClassFile.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/classes/OpaqueClassFile.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/classes/OutputFile.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/classes/RootJObjCClass.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/classes/StructClassFile.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/Arg.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/CFType.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/Category.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/Clazz.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/Constant.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/Element.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/ElementWType.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/Framework.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/Function.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/FunctionAlias.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/InformalProtocol.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/Method.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/NativeEnum.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/Opaque.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/OutputFileGenerator.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/Protocol.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/ReturnValue.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/StringConstant.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/Struct.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/TypeElement.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/coders/CoderDescriptor.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/coders/ComplexCoderDescriptor.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/coders/PrimitiveCoderDescriptor.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/types/JType.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/types/NType.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/types/Type.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/types/TypeCache.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/types/TypeToJType.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/utils/Fp.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/utils/JavaLang.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/utils/NTypeMerger.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/utils/NTypeParser.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/utils/NTypePrinter.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/utils/ObjectInspector.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/utils/QA.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/utils/StringStream.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/utils/StructOffsetResolver.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/utils/StructOffsetResolverBigBang.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/jobjc/SuperClassExtractor.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/generator/java/com/apple/jobjc/UnsafeRuntimeAccess.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/runtime-additions/java/com/apple/jobjc/Utils.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/runtime-additions/native/NativeNumber.m
delete mode 100644 jdk/src/macosx/native/jobjc/src/runtime-additions/native/NativeString.m
delete mode 100644 jdk/src/macosx/native/jobjc/src/runtime-additions/native/NativeThread.m
delete mode 100644 jdk/src/macosx/native/jobjc/src/tests/java/com/apple/jobjc/BaseBench.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/tests/java/com/apple/jobjc/BenchFunCall.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/tests/java/com/apple/jobjc/BenchIDPop.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/tests/java/com/apple/jobjc/BenchStructCoding.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/tests/java/com/apple/jobjc/BenchUnsafe.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/tests/java/com/apple/jobjc/CategoryTest.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/tests/java/com/apple/jobjc/FunctionTest.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/tests/java/com/apple/jobjc/GUIDemo.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/tests/java/com/apple/jobjc/IBDemo.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/tests/java/com/apple/jobjc/IntroTest.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/tests/java/com/apple/jobjc/NSClassTest.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/tests/java/com/apple/jobjc/NativeBufferTest.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/tests/java/com/apple/jobjc/NativeTypeTest.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/tests/java/com/apple/jobjc/PooledTestCase.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/tests/java/com/apple/jobjc/SELTest.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/tests/java/com/apple/jobjc/StructTest.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/tests/java/com/apple/jobjc/SubclassingTest.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/tests/java/com/apple/jobjc/TestUtils.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/tests/java/com/apple/jobjc/UtilsTest.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/tests/java/com/apple/jobjc/VarArgsTest.java
delete mode 100644 jdk/src/macosx/native/jobjc/src/tests/native/FunCallBench.m
diff --git a/jdk/src/macosx/native/jobjc/JObjC.xcodeproj/default.pbxuser b/jdk/src/macosx/native/jobjc/JObjC.xcodeproj/default.pbxuser
deleted file mode 100644
index cda3de5e2f2..00000000000
--- a/jdk/src/macosx/native/jobjc/JObjC.xcodeproj/default.pbxuser
+++ /dev/null
@@ -1,207 +0,0 @@
-// !$*UTF8*$!
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-{
- 00E6828EFEC88D1A11DB9C8B /* Project object */ = {
- activeBuildConfigurationName = Release;
- activeExecutable = 6A9FA6570246BA6C0CC91562 /* JObjC */;
- activeTarget = EB9FD8610AEECCF5008E157E /* JObjC */;
- addToTargets = (
- 4CEBA78E08679EF10015D03E /* JNILib */,
- );
- breakpointsGroup = 0AB3651F0B2F67B300788B6C /* XCBreakpointsBucket */;
- codeSenseManager = 0AB364DB0B2F66FD00788B6C /* Code sense */;
- executables = (
- 6A9FA6570246BA6C0CC91562 /* JObjC */,
- );
- perUserDictionary = {
- PBXConfiguration.PBXFileTableDataSource3.PBXExecutablesDataSource = {
- PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
- PBXFileTableDataSourceColumnSortingKey = PBXExecutablesDataSource_NameID;
- PBXFileTableDataSourceColumnWidthsKey = (
- 22,
- 300,
- 131,
- );
- PBXFileTableDataSourceColumnsKey = (
- PBXExecutablesDataSource_ActiveFlagID,
- PBXExecutablesDataSource_NameID,
- PBXExecutablesDataSource_CommentsID,
- );
- };
- PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = {
- PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
- PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
- PBXFileTableDataSourceColumnWidthsKey = (
- 20,
- 245,
- 20,
- 48,
- 43,
- 43,
- 20,
- );
- PBXFileTableDataSourceColumnsKey = (
- PBXFileDataSource_FiletypeID,
- PBXFileDataSource_Filename_ColumnID,
- PBXFileDataSource_Built_ColumnID,
- PBXFileDataSource_ObjectSize_ColumnID,
- PBXFileDataSource_Errors_ColumnID,
- PBXFileDataSource_Warnings_ColumnID,
- PBXFileDataSource_Target_ColumnID,
- );
- };
- PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = {
- PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
- PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
- PBXFileTableDataSourceColumnWidthsKey = (
- 20,
- 200,
- 65,
- 20,
- 48,
- 43,
- 43,
- );
- PBXFileTableDataSourceColumnsKey = (
- PBXFileDataSource_FiletypeID,
- PBXFileDataSource_Filename_ColumnID,
- PBXTargetDataSource_PrimaryAttribute,
- PBXFileDataSource_Built_ColumnID,
- PBXFileDataSource_ObjectSize_ColumnID,
- PBXFileDataSource_Errors_ColumnID,
- PBXFileDataSource_Warnings_ColumnID,
- );
- };
- };
- sourceControlManager = 0AB364DA0B2F66FD00788B6C /* Source Control */;
- userBuildSettings = {
- };
- };
- 0AB364DA0B2F66FD00788B6C /* Source Control */ = {
- isa = PBXSourceControlManager;
- fallbackIsa = XCSourceControlManager;
- isSCMEnabled = 0;
- scmConfiguration = {
- };
- scmType = "";
- };
- 0AB364DB0B2F66FD00788B6C /* Code sense */ = {
- isa = PBXCodeSenseManager;
- indexTemplatePath = "";
- };
- 0AB3651F0B2F67B300788B6C /* XCBreakpointsBucket */ = {
- isa = XCBreakpointsBucket;
- name = "Project Breakpoints";
- objects = (
- );
- };
- 0AB365570B2F6ABB00788B6C /* JObjCdylib.c */ = {
- uiCtxt = {
- sepNavIntBoundsRect = "{{0, 0}, {847, 783}}";
- sepNavSelRange = "{0, 0}";
- sepNavVisRect = "{{0, 0}, {847, 783}}";
- sepNavWindowFrame = "{{84, 198}, {886, 912}}";
- };
- };
- 0A3CC35E0B94BB8800F6BA26 /* java */ = {
- isa = PBXFileReference;
- explicitFileType = "compiled.mach-o.executable";
- name = java;
- path = /usr/bin/java;
- sourceTree = "";
- };
- 363028F90383184400C91562 /* Manifest */ = {
- uiCtxt = {
- sepNavIntBoundsRect = "{{0, 0}, {847, 783}}";
- sepNavSelRange = "{0, 0}";
- sepNavVisRect = "{{0, 0}, {847, 783}}";
- sepNavWindowFrame = "{{38, 240}, {886, 912}}";
- };
- };
- 4CEBA78E08679EF10015D03E /* Dylib */ = {
- activeExec = 0;
- };
- 6A9FA6570246BA6C0CC91562 /* JObjC */ = {
- isa = PBXExecutable;
- activeArgIndex = 0;
- activeArgIndices = (
- YES,
- );
- argumentStrings = (
- "-cp JObjC.jar JObjC",
- );
- autoAttachOnCrash = 1;
- configStateDict = {
- "PBXLSLaunchAction-0" = {
- PBXLSLaunchAction = 0;
- PBXLSLaunchStartAction = 1;
- PBXLSLaunchStdioStyle = 2;
- PBXLSLaunchStyle = 0;
- class = PBXLSRunLaunchConfig;
- displayName = "Executable Runner";
- identifier = com.apple.Xcode.launch.runConfig;
- remoteHostInfo = "";
- startActionInfo = "";
- };
- "PBXLSLaunchAction-1" = {
- PBXLSLaunchAction = 1;
- PBXLSLaunchStartAction = 1;
- PBXLSLaunchStdioStyle = 2;
- PBXLSLaunchStyle = 0;
- class = PBXJavaDebuggingNativeLaunchConfig;
- displayName = "Java Debugger";
- identifier = com.apple.Xcode.launch.JavaDebugNativeConfig;
- remoteHostInfo = "";
- startActionInfo = "";
- };
- };
- customDataFormattersEnabled = 1;
- debuggerPlugin = GDBDebugging;
- disassemblyDisplayState = 0;
- dylibVariantSuffix = "";
- enableDebugStr = 1;
- environmentEntries = (
- );
- executableSystemSymbolLevel = 0;
- executableUserSymbolLevel = 0;
- launchableReference = 0A3CC35E0B94BB8800F6BA26 /* java */;
- libgmallocEnabled = 0;
- name = JObjC;
- sourceDirectories = (
- );
- startupPath = "dist";
- };
- EB9FD8610AEECCF5008E157E /* JObjC */ = {
- activeExec = 0;
- };
- EB9FD8720AEECD83008E157E /* build.xml */ = {
- uiCtxt = {
- sepNavIntBoundsRect = "{{0, 0}, {847, 1260}}";
- sepNavSelRange = "{1260, 0}";
- sepNavVisRect = "{{0, 8}, {847, 783}}";
- sepNavWindowFrame = "{{752, 266}, {886, 912}}";
- };
- };
-}
diff --git a/jdk/src/macosx/native/jobjc/JObjC.xcodeproj/project.pbxproj b/jdk/src/macosx/native/jobjc/JObjC.xcodeproj/project.pbxproj
deleted file mode 100644
index 61cf3948d0d..00000000000
--- a/jdk/src/macosx/native/jobjc/JObjC.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,1397 +0,0 @@
-// !$*UTF8*$!
-{
- archiveVersion = 1;
- classes = {
- };
- objectVersion = 44;
- objects = {
-
-/* Begin PBXAggregateTarget section */
- 89EBD58C0C95F43D000F04A0 /* B&I */ = {
- isa = PBXAggregateTarget;
- buildConfigurationList = 89EBD5930C95F44E000F04A0 /* Build configuration list for PBXAggregateTarget "B&I" */;
- buildPhases = (
- );
- dependencies = (
- C592D6590E12F27400D076FF /* PBXTargetDependency */,
- C592D65B0E12F27600D076FF /* PBXTargetDependency */,
- C592D65D0E12F27E00D076FF /* PBXTargetDependency */,
- 89D7CB9C0CDC64F800472EA2 /* PBXTargetDependency */,
- C592D65F0E12F28500D076FF /* PBXTargetDependency */,
- C592D6610E12F28E00D076FF /* PBXTargetDependency */,
- C592D6630E12F29200D076FF /* PBXTargetDependency */,
- 89D7CC920CDE7A8200472EA2 /* PBXTargetDependency */,
- );
- name = "B&I";
- productName = "B&I";
- };
-/* End PBXAggregateTarget section */
-
-/* Begin PBXBuildFile section */
- 89D7C9F70CDB900E00472EA2 /* CIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 89D7C9EC0CDB900E00472EA2 /* CIF.m */; };
- 89D7C9F80CDB900E00472EA2 /* Coder.m in Sources */ = {isa = PBXBuildFile; fileRef = 89D7C9ED0CDB900E00472EA2 /* Coder.m */; };
- 89D7C9F90CDB900E00472EA2 /* Function.m in Sources */ = {isa = PBXBuildFile; fileRef = 89D7C9EE0CDB900E00472EA2 /* Function.m */; };
- 89D7C9FA0CDB900E00472EA2 /* ID.m in Sources */ = {isa = PBXBuildFile; fileRef = 89D7C9EF0CDB900E00472EA2 /* ID.m */; };
- 89D7C9FB0CDB900E00472EA2 /* JObjCRuntime.m in Sources */ = {isa = PBXBuildFile; fileRef = 89D7C9F00CDB900E00472EA2 /* JObjCRuntime.m */; };
- 89D7C9FC0CDB900E00472EA2 /* MacOSXFramework.m in Sources */ = {isa = PBXBuildFile; fileRef = 89D7C9F10CDB900E00472EA2 /* MacOSXFramework.m */; };
- 89D7C9FD0CDB900E00472EA2 /* NativeBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 89D7C9F20CDB900E00472EA2 /* NativeBuffer.h */; };
- 89D7C9FE0CDB900E00472EA2 /* NativeBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = 89D7C9F30CDB900E00472EA2 /* NativeBuffer.m */; };
- 89D7C9FF0CDB900E00472EA2 /* NativeObjectLifecycleManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 89D7C9F40CDB900E00472EA2 /* NativeObjectLifecycleManager.m */; };
- 89D7CA000CDB900E00472EA2 /* NSClass.m in Sources */ = {isa = PBXBuildFile; fileRef = 89D7C9F50CDB900E00472EA2 /* NSClass.m */; };
- 89D7CA010CDB900E00472EA2 /* SEL.m in Sources */ = {isa = PBXBuildFile; fileRef = 89D7C9F60CDB900E00472EA2 /* SEL.m */; };
- 89D7CB770CDC4A6500472EA2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 890FBACC0C6F782C00902C32 /* Foundation.framework */; };
- 89D7CB780CDC4A6500472EA2 /* JavaVM.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 890FBACA0C6F781000902C32 /* JavaVM.framework */; };
- 89D7CB790CDC4A6500472EA2 /* JavaNativeFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 896D90BB0CC2877C005625F5 /* JavaNativeFoundation.framework */; };
- 89D7CB7A0CDC4A6500472EA2 /* libffi.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 89E437680C97A7F200C756EE /* libffi.dylib */; };
- 89D7CCA40CDF9A2600472EA2 /* NativeBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 89D7C9F20CDB900E00472EA2 /* NativeBuffer.h */; };
- 89D7CCA60CDF9A2600472EA2 /* CIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 89D7C9EC0CDB900E00472EA2 /* CIF.m */; };
- 89D7CCA70CDF9A2600472EA2 /* Coder.m in Sources */ = {isa = PBXBuildFile; fileRef = 89D7C9ED0CDB900E00472EA2 /* Coder.m */; };
- 89D7CCA80CDF9A2600472EA2 /* Function.m in Sources */ = {isa = PBXBuildFile; fileRef = 89D7C9EE0CDB900E00472EA2 /* Function.m */; };
- 89D7CCA90CDF9A2600472EA2 /* ID.m in Sources */ = {isa = PBXBuildFile; fileRef = 89D7C9EF0CDB900E00472EA2 /* ID.m */; };
- 89D7CCAA0CDF9A2600472EA2 /* JObjCRuntime.m in Sources */ = {isa = PBXBuildFile; fileRef = 89D7C9F00CDB900E00472EA2 /* JObjCRuntime.m */; };
- 89D7CCAB0CDF9A2600472EA2 /* MacOSXFramework.m in Sources */ = {isa = PBXBuildFile; fileRef = 89D7C9F10CDB900E00472EA2 /* MacOSXFramework.m */; };
- 89D7CCAC0CDF9A2600472EA2 /* NativeBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = 89D7C9F30CDB900E00472EA2 /* NativeBuffer.m */; };
- 89D7CCAD0CDF9A2600472EA2 /* NativeObjectLifecycleManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 89D7C9F40CDB900E00472EA2 /* NativeObjectLifecycleManager.m */; };
- 89D7CCAE0CDF9A2600472EA2 /* NSClass.m in Sources */ = {isa = PBXBuildFile; fileRef = 89D7C9F50CDB900E00472EA2 /* NSClass.m */; };
- 89D7CCAF0CDF9A2600472EA2 /* SEL.m in Sources */ = {isa = PBXBuildFile; fileRef = 89D7C9F60CDB900E00472EA2 /* SEL.m */; };
- 89D7CCB10CDF9A2600472EA2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 890FBACC0C6F782C00902C32 /* Foundation.framework */; };
- 89D7CCB20CDF9A2600472EA2 /* JavaVM.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 890FBACA0C6F781000902C32 /* JavaVM.framework */; };
- 89D7CCB30CDF9A2600472EA2 /* JavaNativeFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 896D90BB0CC2877C005625F5 /* JavaNativeFoundation.framework */; };
- 89D7CCB40CDF9A2600472EA2 /* libffi.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 89E437680C97A7F200C756EE /* libffi.dylib */; };
- 89D7CCBB0CDF9AA200472EA2 /* NativeString.m in Sources */ = {isa = PBXBuildFile; fileRef = 89D7CCBA0CDF9AA200472EA2 /* NativeString.m */; };
- 89D7CCBD0CDF9AB100472EA2 /* NativeNumber.m in Sources */ = {isa = PBXBuildFile; fileRef = 89D7CCBC0CDF9AB100472EA2 /* NativeNumber.m */; };
- 89D7CCBF0CDF9AC600472EA2 /* NativeThread.m in Sources */ = {isa = PBXBuildFile; fileRef = 89D7CCBE0CDF9AC600472EA2 /* NativeThread.m */; };
- C5742F6D0E316EFA00093838 /* Subclassing.m in Sources */ = {isa = PBXBuildFile; fileRef = C5742F6B0E316EFA00093838 /* Subclassing.m */; };
- C5742F700E316F8600093838 /* Subclassing.m in Sources */ = {isa = PBXBuildFile; fileRef = C5742F6B0E316EFA00093838 /* Subclassing.m */; };
- C5D196C90DF9E43C006F9FB9 /* FFIType.m in Sources */ = {isa = PBXBuildFile; fileRef = C5D196C80DF9E43C006F9FB9 /* FFIType.m */; };
- C5D197D90DFB77C6006F9FB9 /* FFIType.m in Sources */ = {isa = PBXBuildFile; fileRef = C5D196C80DF9E43C006F9FB9 /* FFIType.m */; };
- C5E4547B0E36729F0046D3E8 /* Invoke.m in Sources */ = {isa = PBXBuildFile; fileRef = C5E454790E36729F0046D3E8 /* Invoke.m */; };
- C5E4547D0E367DAB0046D3E8 /* Invoke.m in Sources */ = {isa = PBXBuildFile; fileRef = C5E454790E36729F0046D3E8 /* Invoke.m */; };
- C5F3B23D0E39948300B771AE /* FunCallBench.m in Sources */ = {isa = PBXBuildFile; fileRef = C5F3B1370E398F8E00B771AE /* FunCallBench.m */; };
- C5F3B2620E3AB0F300B771AE /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5F3B2610E3AB0F300B771AE /* AppKit.framework */; };
- C5F3B2640E3AB0F300B771AE /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5F3B2630E3AB0F300B771AE /* Cocoa.framework */; };
- C5F3B2650E3AB0F300B771AE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 890FBACC0C6F782C00902C32 /* Foundation.framework */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXContainerItemProxy section */
- 2CC7556013A1322100B09D1B /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 00E6828EFEC88D1A11DB9C8B /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = EB9FD8610AEECCF5008E157E;
- remoteInfo = "build-core-java";
- };
- 2CC7556213A1322800B09D1B /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 00E6828EFEC88D1A11DB9C8B /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = C5F3B1530E39927900B771AE;
- remoteInfo = "build-test-java";
- };
- 2CC7556413A1323700B09D1B /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 00E6828EFEC88D1A11DB9C8B /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 89D7CA160CDBA94D00472EA2;
- remoteInfo = "build-generator-java";
- };
- 2CC7556613A1324300B09D1B /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 00E6828EFEC88D1A11DB9C8B /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 89D7CC600CDE75EC00472EA2;
- remoteInfo = "build-additions-java";
- };
- 2CC7556813A1325700B09D1B /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 00E6828EFEC88D1A11DB9C8B /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 89D7CB870CDC4ED000472EA2;
- remoteInfo = "run-generator";
- };
- 2CC7556A13A132AF00B09D1B /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 00E6828EFEC88D1A11DB9C8B /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 4CEBA78E08679EF10015D03E;
- remoteInfo = "build-core-native";
- };
- 2CC7556C13A132B200B09D1B /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 00E6828EFEC88D1A11DB9C8B /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = EB9FD8610AEECCF5008E157E;
- remoteInfo = "build-core-java";
- };
- 89D7CB9B0CDC64F800472EA2 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 00E6828EFEC88D1A11DB9C8B /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 89D7CB870CDC4ED000472EA2;
- remoteInfo = "run-generator";
- };
- 89D7CC910CDE7A8200472EA2 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 00E6828EFEC88D1A11DB9C8B /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 89D7CC720CDE767500472EA2;
- remoteInfo = "assemble-product-java";
- };
- C592D6580E12F27400D076FF /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 00E6828EFEC88D1A11DB9C8B /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = EB9FD8610AEECCF5008E157E;
- remoteInfo = "build-core-java";
- };
- C592D65A0E12F27600D076FF /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 00E6828EFEC88D1A11DB9C8B /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 4CEBA78E08679EF10015D03E;
- remoteInfo = "build-core-native";
- };
- C592D65C0E12F27E00D076FF /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 00E6828EFEC88D1A11DB9C8B /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 89D7CA160CDBA94D00472EA2;
- remoteInfo = "build-generator-java";
- };
- C592D65E0E12F28500D076FF /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 00E6828EFEC88D1A11DB9C8B /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 89D7CC4C0CDE4C0400472EA2;
- remoteInfo = "build-generated-java";
- };
- C592D6600E12F28E00D076FF /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 00E6828EFEC88D1A11DB9C8B /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 89D7CC600CDE75EC00472EA2;
- remoteInfo = "build-additions-java";
- };
- C592D6620E12F29200D076FF /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 00E6828EFEC88D1A11DB9C8B /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 89D7CCA20CDF9A2600472EA2;
- remoteInfo = "build-additions-native";
- };
- C5D197DA0DFB77E4006F9FB9 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 00E6828EFEC88D1A11DB9C8B /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 4CEBA78E08679EF10015D03E;
- remoteInfo = "build-core-native";
- };
-/* End PBXContainerItemProxy section */
-
-/* Begin PBXFileReference section */
- 0AB364E40B2F671600788B6C /* src */ = {isa = PBXFileReference; lastKnownFileType = folder; path = src; sourceTree = ""; };
- 890FBACA0C6F781000902C32 /* JavaVM.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaVM.framework; path = /System/Library/Frameworks/JavaVM.framework; sourceTree = ""; };
- 890FBACC0C6F782C00902C32 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; };
- 896D90BB0CC2877C005625F5 /* JavaNativeFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaNativeFoundation.framework; path = /System/Library/Frameworks/JavaVM.framework/Versions/A/Frameworks/JavaNativeFoundation.framework; sourceTree = ""; };
- 896D91230CC2ED34005625F5 /* README.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README.txt; sourceTree = ""; };
- 89736E5F0CE819E5008C4205 /* JObjC.jar */ = {isa = PBXFileReference; lastKnownFileType = archive.jar; path = JObjC.jar; sourceTree = BUILT_PRODUCTS_DIR; };
- 89D7C9EC0CDB900E00472EA2 /* CIF.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CIF.m; sourceTree = ""; };
- 89D7C9ED0CDB900E00472EA2 /* Coder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Coder.m; sourceTree = ""; };
- 89D7C9EE0CDB900E00472EA2 /* Function.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Function.m; sourceTree = ""; };
- 89D7C9EF0CDB900E00472EA2 /* ID.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ID.m; sourceTree = ""; };
- 89D7C9F00CDB900E00472EA2 /* JObjCRuntime.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JObjCRuntime.m; sourceTree = ""; };
- 89D7C9F10CDB900E00472EA2 /* MacOSXFramework.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MacOSXFramework.m; sourceTree = ""; };
- 89D7C9F20CDB900E00472EA2 /* NativeBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NativeBuffer.h; sourceTree = ""; };
- 89D7C9F30CDB900E00472EA2 /* NativeBuffer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NativeBuffer.m; sourceTree = ""; };
- 89D7C9F40CDB900E00472EA2 /* NativeObjectLifecycleManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NativeObjectLifecycleManager.m; sourceTree = ""; };
- 89D7C9F50CDB900E00472EA2 /* NSClass.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSClass.m; sourceTree = ""; };
- 89D7C9F60CDB900E00472EA2 /* SEL.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SEL.m; sourceTree = ""; };
- 89D7CCB80CDF9A2600472EA2 /* libJObjC.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libJObjC.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
- 89D7CCBA0CDF9AA200472EA2 /* NativeString.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NativeString.m; sourceTree = ""; };
- 89D7CCBC0CDF9AB100472EA2 /* NativeNumber.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NativeNumber.m; sourceTree = ""; };
- 89D7CCBE0CDF9AC600472EA2 /* NativeThread.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NativeThread.m; sourceTree = ""; };
- 89E437680C97A7F200C756EE /* libffi.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libffi.dylib; path = /usr/lib/libffi.dylib; sourceTree = ""; };
- C5742F6B0E316EFA00093838 /* Subclassing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Subclassing.m; sourceTree = ""; };
- C5D196C80DF9E43C006F9FB9 /* FFIType.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FFIType.m; sourceTree = ""; };
- C5E454790E36729F0046D3E8 /* Invoke.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Invoke.m; sourceTree = ""; };
- C5F3B1370E398F8E00B771AE /* FunCallBench.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FunCallBench.m; sourceTree = ""; };
- C5F3B1450E39910500B771AE /* libJObjC-tests.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = "libJObjC-tests.dylib"; sourceTree = BUILT_PRODUCTS_DIR; };
- C5F3B2610E3AB0F300B771AE /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; };
- C5F3B2630E3AB0F300B771AE /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; };
- EB9FD8720AEECD83008E157E /* build.xml */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xml; path = build.xml; sourceTree = ""; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
- 4CEBA78D08679EF10015D03E /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 89D7CB770CDC4A6500472EA2 /* Foundation.framework in Frameworks */,
- 89D7CB780CDC4A6500472EA2 /* JavaVM.framework in Frameworks */,
- 89D7CB790CDC4A6500472EA2 /* JavaNativeFoundation.framework in Frameworks */,
- 89D7CB7A0CDC4A6500472EA2 /* libffi.dylib in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 89D7CCB00CDF9A2600472EA2 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 89D7CCB10CDF9A2600472EA2 /* Foundation.framework in Frameworks */,
- 89D7CCB20CDF9A2600472EA2 /* JavaVM.framework in Frameworks */,
- 89D7CCB30CDF9A2600472EA2 /* JavaNativeFoundation.framework in Frameworks */,
- 89D7CCB40CDF9A2600472EA2 /* libffi.dylib in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C5F3B1430E39910500B771AE /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C5F3B2620E3AB0F300B771AE /* AppKit.framework in Frameworks */,
- C5F3B2640E3AB0F300B771AE /* Cocoa.framework in Frameworks */,
- C5F3B2650E3AB0F300B771AE /* Foundation.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
- 00E6828FFEC88D1A11DB9C8B = {
- isa = PBXGroup;
- children = (
- 896D91230CC2ED34005625F5 /* README.txt */,
- EB9FD8720AEECD83008E157E /* build.xml */,
- 0AB364E40B2F671600788B6C /* src */,
- 89D7C9EB0CDB900E00472EA2 /* native-core */,
- 89D7CA020CDB902200472EA2 /* native-additions */,
- C5A9597F0E398F050057C96D /* native-tests */,
- 89D7CA030CDB903000472EA2 /* products */,
- 890FBAC90C6F77B700902C32 /* frameworks */,
- C5F3B1450E39910500B771AE /* libJObjC-tests.dylib */,
- C5F3B2610E3AB0F300B771AE /* AppKit.framework */,
- C5F3B2630E3AB0F300B771AE /* Cocoa.framework */,
- );
- sourceTree = "";
- };
- 890FBAC90C6F77B700902C32 /* frameworks */ = {
- isa = PBXGroup;
- children = (
- 890FBACC0C6F782C00902C32 /* Foundation.framework */,
- 890FBACA0C6F781000902C32 /* JavaVM.framework */,
- 896D90BB0CC2877C005625F5 /* JavaNativeFoundation.framework */,
- 89E437680C97A7F200C756EE /* libffi.dylib */,
- );
- name = frameworks;
- sourceTree = "";
- };
- 89D7C9EB0CDB900E00472EA2 /* native-core */ = {
- isa = PBXGroup;
- children = (
- 89D7C9EC0CDB900E00472EA2 /* CIF.m */,
- 89D7C9ED0CDB900E00472EA2 /* Coder.m */,
- C5D196C80DF9E43C006F9FB9 /* FFIType.m */,
- 89D7C9EE0CDB900E00472EA2 /* Function.m */,
- 89D7C9EF0CDB900E00472EA2 /* ID.m */,
- C5E454790E36729F0046D3E8 /* Invoke.m */,
- 89D7C9F00CDB900E00472EA2 /* JObjCRuntime.m */,
- 89D7C9F10CDB900E00472EA2 /* MacOSXFramework.m */,
- 89D7C9F20CDB900E00472EA2 /* NativeBuffer.h */,
- 89D7C9F30CDB900E00472EA2 /* NativeBuffer.m */,
- 89D7C9F40CDB900E00472EA2 /* NativeObjectLifecycleManager.m */,
- 89D7C9F50CDB900E00472EA2 /* NSClass.m */,
- 89D7C9F60CDB900E00472EA2 /* SEL.m */,
- C5742F6B0E316EFA00093838 /* Subclassing.m */,
- );
- name = "native-core";
- path = src/core/native;
- sourceTree = "";
- };
- 89D7CA020CDB902200472EA2 /* native-additions */ = {
- isa = PBXGroup;
- children = (
- 89D7CCBA0CDF9AA200472EA2 /* NativeString.m */,
- 89D7CCBC0CDF9AB100472EA2 /* NativeNumber.m */,
- 89D7CCBE0CDF9AC600472EA2 /* NativeThread.m */,
- );
- name = "native-additions";
- path = "src/runtime-additions/native";
- sourceTree = "";
- };
- 89D7CA030CDB903000472EA2 /* products */ = {
- isa = PBXGroup;
- children = (
- 89736E5F0CE819E5008C4205 /* JObjC.jar */,
- 89D7CCB80CDF9A2600472EA2 /* libJObjC.dylib */,
- );
- name = products;
- path = "src/runtime-additions/native";
- sourceTree = "";
- };
- C5A9597F0E398F050057C96D /* native-tests */ = {
- isa = PBXGroup;
- children = (
- C5F3B1370E398F8E00B771AE /* FunCallBench.m */,
- );
- name = "native-tests";
- path = src/tests/native;
- sourceTree = "";
- };
-/* End PBXGroup section */
-
-/* Begin PBXHeadersBuildPhase section */
- 4CEBA78B08679EF10015D03E /* Headers */ = {
- isa = PBXHeadersBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 89D7C9FD0CDB900E00472EA2 /* NativeBuffer.h in Headers */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 89D7CCA30CDF9A2600472EA2 /* Headers */ = {
- isa = PBXHeadersBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 89D7CCA40CDF9A2600472EA2 /* NativeBuffer.h in Headers */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C5F3B1410E39910500B771AE /* Headers */ = {
- isa = PBXHeadersBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXHeadersBuildPhase section */
-
-/* Begin PBXLegacyTarget section */
- 89D7CA160CDBA94D00472EA2 /* build-generator-java */ = {
- isa = PBXLegacyTarget;
- buildArgumentsString = "-verbose -emacs $ACTION";
- buildConfigurationList = 89D7CA1C0CDBA9B000472EA2 /* Build configuration list for PBXLegacyTarget "build-generator-java" */;
- buildPhases = (
- );
- buildToolPath = /usr/bin/ant;
- dependencies = (
- 2CC7556D13A132B200B09D1B /* PBXTargetDependency */,
- 2CC7556B13A132AF00B09D1B /* PBXTargetDependency */,
- );
- name = "build-generator-java";
- passBuildSettingsInEnvironment = 1;
- productName = "generator-build-java";
- };
- 89D7CB870CDC4ED000472EA2 /* run-generator */ = {
- isa = PBXLegacyTarget;
- buildArgumentsString = "-verbose -emacs $ACTION";
- buildConfigurationList = 89D7CB8E0CDC4ED900472EA2 /* Build configuration list for PBXLegacyTarget "run-generator" */;
- buildPhases = (
- );
- buildToolPath = /usr/bin/ant;
- dependencies = (
- 2CC7556513A1323700B09D1B /* PBXTargetDependency */,
- );
- name = "run-generator";
- passBuildSettingsInEnvironment = 1;
- productName = "run-generator";
- };
- 89D7CC4C0CDE4C0400472EA2 /* build-generated-java */ = {
- isa = PBXLegacyTarget;
- buildArgumentsString = "-verbose -emacs $ACTION";
- buildConfigurationList = 89D7CC510CDE4C5200472EA2 /* Build configuration list for PBXLegacyTarget "build-generated-java" */;
- buildPhases = (
- );
- buildToolPath = /usr/bin/ant;
- dependencies = (
- 2CC7556913A1325700B09D1B /* PBXTargetDependency */,
- );
- name = "build-generated-java";
- passBuildSettingsInEnvironment = 1;
- productName = "build-generated-java";
- };
- 89D7CC600CDE75EC00472EA2 /* build-additions-java */ = {
- isa = PBXLegacyTarget;
- buildArgumentsString = "-verbose -emacs $ACTION";
- buildConfigurationList = 89D7CC630CDE762000472EA2 /* Build configuration list for PBXLegacyTarget "build-additions-java" */;
- buildPhases = (
- );
- buildToolPath = /usr/bin/ant;
- dependencies = (
- );
- name = "build-additions-java";
- passBuildSettingsInEnvironment = 1;
- productName = "build-additions-java";
- };
- 89D7CC720CDE767500472EA2 /* assemble-product-java */ = {
- isa = PBXLegacyTarget;
- buildArgumentsString = "-verbose -emacs $ACTION";
- buildConfigurationList = 89D7CC7A0CDE76F500472EA2 /* Build configuration list for PBXLegacyTarget "assemble-product-java" */;
- buildPhases = (
- );
- buildToolPath = /usr/bin/ant;
- dependencies = (
- );
- name = "assemble-product-java";
- passBuildSettingsInEnvironment = 1;
- productName = "package-product";
- };
- C5F3B1530E39927900B771AE /* build-test-java */ = {
- isa = PBXLegacyTarget;
- buildArgumentsString = "-verbose -emacs $ACTION";
- buildConfigurationList = C5F3B15B0E3992AC00B771AE /* Build configuration list for PBXLegacyTarget "build-test-java" */;
- buildPhases = (
- );
- buildToolPath = /usr/bin/ant;
- dependencies = (
- );
- name = "build-test-java";
- passBuildSettingsInEnvironment = 1;
- productName = "build-test";
- };
- EB9FD8610AEECCF5008E157E /* build-core-java */ = {
- isa = PBXLegacyTarget;
- buildArgumentsString = "-verbose -emacs $ACTION";
- buildConfigurationList = EB9FD8690AEECD13008E157E /* Build configuration list for PBXLegacyTarget "build-core-java" */;
- buildPhases = (
- );
- buildToolPath = /usr/bin/ant;
- buildWorkingDirectory = "";
- dependencies = (
- );
- name = "build-core-java";
- passBuildSettingsInEnvironment = 1;
- productName = AntJNIWrapper;
- };
-/* End PBXLegacyTarget section */
-
-/* Begin PBXNativeTarget section */
- 4CEBA78E08679EF10015D03E /* build-core-native */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 4CEBA79108679F100015D03E /* Build configuration list for PBXNativeTarget "build-core-native" */;
- buildPhases = (
- 4CEBA78B08679EF10015D03E /* Headers */,
- 4CEBA78C08679EF10015D03E /* Sources */,
- 4CEBA78D08679EF10015D03E /* Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- 2CC7556113A1322100B09D1B /* PBXTargetDependency */,
- );
- name = "build-core-native";
- productName = DylibN;
- productType = "com.apple.product-type.library.dynamic";
- };
- 89D7CCA20CDF9A2600472EA2 /* build-additions-native */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 89D7CCB50CDF9A2600472EA2 /* Build configuration list for PBXNativeTarget "build-additions-native" */;
- buildPhases = (
- 89D7CCA30CDF9A2600472EA2 /* Headers */,
- 89D7CCA50CDF9A2600472EA2 /* Sources */,
- 89D7CCB00CDF9A2600472EA2 /* Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- 2CC7556713A1324300B09D1B /* PBXTargetDependency */,
- C5D197DB0DFB77E4006F9FB9 /* PBXTargetDependency */,
- );
- name = "build-additions-native";
- productName = DylibN;
- productReference = 89D7CCB80CDF9A2600472EA2 /* libJObjC.dylib */;
- productType = "com.apple.product-type.library.dynamic";
- };
- C5F3B1440E39910500B771AE /* build-test-native */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = C5F3B1480E39917500B771AE /* Build configuration list for PBXNativeTarget "build-test-native" */;
- buildPhases = (
- C5F3B1410E39910500B771AE /* Headers */,
- C5F3B1420E39910500B771AE /* Sources */,
- C5F3B1430E39910500B771AE /* Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- 2CC7556313A1322800B09D1B /* PBXTargetDependency */,
- );
- name = "build-test-native";
- productName = "build-tests-native";
- productReference = C5F3B1450E39910500B771AE /* libJObjC-tests.dylib */;
- productType = "com.apple.product-type.library.dynamic";
- };
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
- 00E6828EFEC88D1A11DB9C8B /* Project object */ = {
- isa = PBXProject;
- attributes = {
- LastUpgradeCheck = 0410;
- };
- buildConfigurationList = 4CEBA75C08679E4D0015D03E /* Build configuration list for PBXProject "JObjC" */;
- compatibilityVersion = "Xcode 3.0";
- developmentRegion = English;
- hasScannedForEncodings = 1;
- knownRegions = (
- English,
- Japanese,
- French,
- German,
- );
- mainGroup = 00E6828FFEC88D1A11DB9C8B;
- productRefGroup = 00E6828FFEC88D1A11DB9C8B;
- projectDirPath = "";
- projectRoot = "";
- targets = (
- 89EBD58C0C95F43D000F04A0 /* B&I */,
- EB9FD8610AEECCF5008E157E /* build-core-java */,
- 4CEBA78E08679EF10015D03E /* build-core-native */,
- 89D7CA160CDBA94D00472EA2 /* build-generator-java */,
- 89D7CB870CDC4ED000472EA2 /* run-generator */,
- 89D7CC4C0CDE4C0400472EA2 /* build-generated-java */,
- 89D7CC600CDE75EC00472EA2 /* build-additions-java */,
- 89D7CCA20CDF9A2600472EA2 /* build-additions-native */,
- 89D7CC720CDE767500472EA2 /* assemble-product-java */,
- C5F3B1530E39927900B771AE /* build-test-java */,
- C5F3B1440E39910500B771AE /* build-test-native */,
- );
- };
-/* End PBXProject section */
-
-/* Begin PBXSourcesBuildPhase section */
- 4CEBA78C08679EF10015D03E /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C5E4547B0E36729F0046D3E8 /* Invoke.m in Sources */,
- C5742F6D0E316EFA00093838 /* Subclassing.m in Sources */,
- 89D7C9F70CDB900E00472EA2 /* CIF.m in Sources */,
- 89D7C9F80CDB900E00472EA2 /* Coder.m in Sources */,
- 89D7C9F90CDB900E00472EA2 /* Function.m in Sources */,
- 89D7C9FA0CDB900E00472EA2 /* ID.m in Sources */,
- 89D7C9FB0CDB900E00472EA2 /* JObjCRuntime.m in Sources */,
- 89D7C9FC0CDB900E00472EA2 /* MacOSXFramework.m in Sources */,
- 89D7C9FE0CDB900E00472EA2 /* NativeBuffer.m in Sources */,
- 89D7C9FF0CDB900E00472EA2 /* NativeObjectLifecycleManager.m in Sources */,
- 89D7CA000CDB900E00472EA2 /* NSClass.m in Sources */,
- 89D7CA010CDB900E00472EA2 /* SEL.m in Sources */,
- C5D196C90DF9E43C006F9FB9 /* FFIType.m in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 89D7CCA50CDF9A2600472EA2 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C5E4547D0E367DAB0046D3E8 /* Invoke.m in Sources */,
- C5742F700E316F8600093838 /* Subclassing.m in Sources */,
- 89D7CCA60CDF9A2600472EA2 /* CIF.m in Sources */,
- 89D7CCA70CDF9A2600472EA2 /* Coder.m in Sources */,
- 89D7CCA80CDF9A2600472EA2 /* Function.m in Sources */,
- 89D7CCA90CDF9A2600472EA2 /* ID.m in Sources */,
- 89D7CCAA0CDF9A2600472EA2 /* JObjCRuntime.m in Sources */,
- 89D7CCAB0CDF9A2600472EA2 /* MacOSXFramework.m in Sources */,
- 89D7CCAC0CDF9A2600472EA2 /* NativeBuffer.m in Sources */,
- 89D7CCAD0CDF9A2600472EA2 /* NativeObjectLifecycleManager.m in Sources */,
- 89D7CCAE0CDF9A2600472EA2 /* NSClass.m in Sources */,
- 89D7CCAF0CDF9A2600472EA2 /* SEL.m in Sources */,
- 89D7CCBB0CDF9AA200472EA2 /* NativeString.m in Sources */,
- 89D7CCBD0CDF9AB100472EA2 /* NativeNumber.m in Sources */,
- 89D7CCBF0CDF9AC600472EA2 /* NativeThread.m in Sources */,
- C5D197D90DFB77C6006F9FB9 /* FFIType.m in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C5F3B1420E39910500B771AE /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C5F3B23D0E39948300B771AE /* FunCallBench.m in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXSourcesBuildPhase section */
-
-/* Begin PBXTargetDependency section */
- 2CC7556113A1322100B09D1B /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = EB9FD8610AEECCF5008E157E /* build-core-java */;
- targetProxy = 2CC7556013A1322100B09D1B /* PBXContainerItemProxy */;
- };
- 2CC7556313A1322800B09D1B /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = C5F3B1530E39927900B771AE /* build-test-java */;
- targetProxy = 2CC7556213A1322800B09D1B /* PBXContainerItemProxy */;
- };
- 2CC7556513A1323700B09D1B /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 89D7CA160CDBA94D00472EA2 /* build-generator-java */;
- targetProxy = 2CC7556413A1323700B09D1B /* PBXContainerItemProxy */;
- };
- 2CC7556713A1324300B09D1B /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 89D7CC600CDE75EC00472EA2 /* build-additions-java */;
- targetProxy = 2CC7556613A1324300B09D1B /* PBXContainerItemProxy */;
- };
- 2CC7556913A1325700B09D1B /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 89D7CB870CDC4ED000472EA2 /* run-generator */;
- targetProxy = 2CC7556813A1325700B09D1B /* PBXContainerItemProxy */;
- };
- 2CC7556B13A132AF00B09D1B /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 4CEBA78E08679EF10015D03E /* build-core-native */;
- targetProxy = 2CC7556A13A132AF00B09D1B /* PBXContainerItemProxy */;
- };
- 2CC7556D13A132B200B09D1B /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = EB9FD8610AEECCF5008E157E /* build-core-java */;
- targetProxy = 2CC7556C13A132B200B09D1B /* PBXContainerItemProxy */;
- };
- 89D7CB9C0CDC64F800472EA2 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 89D7CB870CDC4ED000472EA2 /* run-generator */;
- targetProxy = 89D7CB9B0CDC64F800472EA2 /* PBXContainerItemProxy */;
- };
- 89D7CC920CDE7A8200472EA2 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 89D7CC720CDE767500472EA2 /* assemble-product-java */;
- targetProxy = 89D7CC910CDE7A8200472EA2 /* PBXContainerItemProxy */;
- };
- C592D6590E12F27400D076FF /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = EB9FD8610AEECCF5008E157E /* build-core-java */;
- targetProxy = C592D6580E12F27400D076FF /* PBXContainerItemProxy */;
- };
- C592D65B0E12F27600D076FF /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 4CEBA78E08679EF10015D03E /* build-core-native */;
- targetProxy = C592D65A0E12F27600D076FF /* PBXContainerItemProxy */;
- };
- C592D65D0E12F27E00D076FF /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 89D7CA160CDBA94D00472EA2 /* build-generator-java */;
- targetProxy = C592D65C0E12F27E00D076FF /* PBXContainerItemProxy */;
- };
- C592D65F0E12F28500D076FF /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 89D7CC4C0CDE4C0400472EA2 /* build-generated-java */;
- targetProxy = C592D65E0E12F28500D076FF /* PBXContainerItemProxy */;
- };
- C592D6610E12F28E00D076FF /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 89D7CC600CDE75EC00472EA2 /* build-additions-java */;
- targetProxy = C592D6600E12F28E00D076FF /* PBXContainerItemProxy */;
- };
- C592D6630E12F29200D076FF /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 89D7CCA20CDF9A2600472EA2 /* build-additions-native */;
- targetProxy = C592D6620E12F29200D076FF /* PBXContainerItemProxy */;
- };
- C5D197DB0DFB77E4006F9FB9 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 4CEBA78E08679EF10015D03E /* build-core-native */;
- targetProxy = C5D197DA0DFB77E4006F9FB9 /* PBXContainerItemProxy */;
- };
-/* End PBXTargetDependency section */
-
-/* Begin XCBuildConfiguration section */
- 4CEBA75D08679E4D0015D03E /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ARCHS = (
- "$(NATIVE_ARCH_32_BIT)",
- "$(NATIVE_ARCH_64_BIT)",
- );
- GCC_ENABLE_OBJC_GC = supported;
- SYMROOT = build;
- };
- name = Debug;
- };
- 4CEBA75E08679E4D0015D03E /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- GCC_ENABLE_OBJC_GC = supported;
- INSTALL_PATH = /System/Library/Java/Extensions;
- };
- name = Release;
- };
- 4CEBA79208679F100015D03E /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ARCHS = (
- "$(NATIVE_ARCH_32_BIT)",
- "$(NATIVE_ARCH_64_BIT)",
- );
- COPY_PHASE_STRIP = NO;
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- EXECUTABLE_EXTENSION = dylib;
- EXECUTABLE_PREFIX = lib;
- FRAMEWORK_SEARCH_PATHS = (
- "$(inherited)",
- "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
- );
- FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SYSTEM_LIBRARY_DIR)/Frameworks/JavaVM.framework/Versions/A/Frameworks\"";
- FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SYSTEM_LIBRARY_DIR)/Frameworks/JavaVM.framework/Versions/A/Frameworks\"";
- GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
- GCC_MODEL_TUNING = G5;
- GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
- GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS = YES;
- GCC_TREAT_WARNINGS_AS_ERRORS = YES;
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
- GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_CHECK_SWITCH_STATEMENTS = YES;
- GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = YES;
- GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
- GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES;
- GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;
- GCC_WARN_MISSING_PARENTHESES = YES;
- GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
- GCC_WARN_PEDANTIC = NO;
- GCC_WARN_PROTOTYPE_CONVERSION = NO;
- GCC_WARN_SHADOW = YES;
- GCC_WARN_SIGN_COMPARE = YES;
- GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES;
- GCC_WARN_UNKNOWN_PRAGMAS = YES;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- HEADER_SEARCH_PATHS = (
- "$(HEADER_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
- /System/Library/Frameworks/JavaVM.framework/Versions/A/Headers,
- );
- HEADER_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/src/jni_headers/core\" \"$(OBJROOT)/src/jni_headers/core\"";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- "$(LIBRARY_SEARCH_PATHS_QUOTED_1)",
- );
- LIBRARY_SEARCH_PATHS_QUOTED_1 = "\"$(SYSTEM_LIBRARY_DIR)/Frameworks/JavaVM.framework/Versions/1.5.0/Libraries\"";
- LIBRARY_STYLE = DYNAMIC;
- MACH_O_TYPE = mh_dylib;
- OTHER_LDFLAGS = "";
- OTHER_REZFLAGS = "";
- PRODUCT_NAME = JObjC;
- SECTORDER_FLAGS = "";
- VALID_ARCHS = "ppc7400 ppc970 i386 x86_64 ppc";
- WARNING_CFLAGS = (
- "-Wmost",
- "-Wno-four-char-constants",
- "-Wno-unknown-pragmas",
- "-Wformat",
- "-Wformat-security",
- "-Wcast-align",
- "-Wwrite-strings",
- "-Wuninitialized",
- "-Wshadow",
- "-Wshorten-64-to-32",
- "-Wsign-compare",
- "-Wpointer-arith",
- "-Wall",
- );
- ZERO_LINK = NO;
- };
- name = Debug;
- };
- 4CEBA79308679F100015D03E /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ARCHS = (
- i386,
- ppc,
- x86_64,
- );
- COPY_PHASE_STRIP = YES;
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- EXECUTABLE_EXTENSION = dylib;
- EXECUTABLE_PREFIX = lib;
- FRAMEWORK_SEARCH_PATHS = (
- "$(inherited)",
- "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
- );
- FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SYSTEM_LIBRARY_DIR)/Frameworks/JavaVM.framework/Versions/A/Frameworks\"";
- FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SYSTEM_LIBRARY_DIR)/Frameworks/JavaVM.framework/Versions/A/Frameworks\"";
- GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_MODEL_TUNING = G5;
- GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
- GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS = YES;
- GCC_TREAT_WARNINGS_AS_ERRORS = YES;
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
- GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_CHECK_SWITCH_STATEMENTS = YES;
- GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = YES;
- GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
- GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES;
- GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;
- GCC_WARN_MISSING_PARENTHESES = YES;
- GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
- GCC_WARN_PEDANTIC = NO;
- GCC_WARN_PROTOTYPE_CONVERSION = NO;
- GCC_WARN_SHADOW = YES;
- GCC_WARN_SIGN_COMPARE = YES;
- GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES;
- GCC_WARN_UNKNOWN_PRAGMAS = YES;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- HEADER_SEARCH_PATHS = (
- "$(HEADER_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
- /System/Library/Frameworks/JavaVM.framework/Versions/A/Headers,
- );
- HEADER_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/src/jni_headers/core\" \"$(OBJROOT)/src/jni_headers/core\"";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
- );
- LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SYSTEM_LIBRARY_DIR)/Frameworks/JavaVM.framework/Versions/1.5.0/Libraries\"";
- LIBRARY_STYLE = DYNAMIC;
- MACH_O_TYPE = mh_dylib;
- OTHER_LDFLAGS = "";
- OTHER_REZFLAGS = "";
- PRODUCT_NAME = JObjC;
- SECTORDER_FLAGS = "";
- VALID_ARCHS = "ppc7400 ppc970 i386 x86_64 ppc";
- WARNING_CFLAGS = (
- "-Wmost",
- "-Wno-four-char-constants",
- "-Wno-unknown-pragmas",
- "-Wformat",
- "-Wformat-security",
- "-Wcast-align",
- "-Wwrite-strings",
- "-Wuninitialized",
- "-Wshadow",
- "-Wshorten-64-to-32",
- "-Wsign-compare",
- "-Wpointer-arith",
- "-Wall",
- );
- ZERO_LINK = NO;
- };
- name = Release;
- };
- 89D7CA170CDBA94D00472EA2 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_OPTIMIZATION_LEVEL = 0;
- PRODUCT_NAME = "build-generator";
- };
- name = Debug;
- };
- 89D7CA180CDBA94D00472EA2 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = YES;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- PRODUCT_NAME = "build-generator";
- ZERO_LINK = NO;
- };
- name = Release;
- };
- 89D7CB880CDC4ED000472EA2 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_OPTIMIZATION_LEVEL = "\U00010";
- PRODUCT_NAME = "run-generator";
- };
- name = Debug;
- };
- 89D7CB890CDC4ED000472EA2 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = YES;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- PRODUCT_NAME = "run-generator";
- ZERO_LINK = NO;
- };
- name = Release;
- };
- 89D7CC4D0CDE4C0400472EA2 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_OPTIMIZATION_LEVEL = 0;
- PRODUCT_NAME = "build-generated";
- };
- name = Debug;
- };
- 89D7CC4E0CDE4C0400472EA2 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = YES;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- PRODUCT_NAME = "build-generated";
- ZERO_LINK = NO;
- };
- name = Release;
- };
- 89D7CC610CDE75EC00472EA2 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_OPTIMIZATION_LEVEL = 0;
- PRODUCT_NAME = "build-additions";
- };
- name = Debug;
- };
- 89D7CC620CDE75EC00472EA2 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = YES;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- PRODUCT_NAME = "build-additions";
- ZERO_LINK = NO;
- };
- name = Release;
- };
- 89D7CC730CDE767500472EA2 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_OPTIMIZATION_LEVEL = 0;
- PRODUCT_NAME = "assemble-product";
- };
- name = Debug;
- };
- 89D7CC740CDE767500472EA2 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = YES;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- PRODUCT_NAME = "assemble-product";
- ZERO_LINK = NO;
- };
- name = Release;
- };
- 89D7CCB60CDF9A2600472EA2 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ARCHS = (
- "$(NATIVE_ARCH_32_BIT)",
- "$(NATIVE_ARCH_64_BIT)",
- );
- COPY_PHASE_STRIP = NO;
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- EXECUTABLE_EXTENSION = dylib;
- EXECUTABLE_PREFIX = lib;
- FRAMEWORK_SEARCH_PATHS = (
- "$(inherited)",
- "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
- );
- FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SYSTEM_LIBRARY_DIR)/Frameworks/JavaVM.framework/Versions/A/Frameworks\"";
- FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SYSTEM_LIBRARY_DIR)/Frameworks/JavaVM.framework/Versions/A/Frameworks\"";
- GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
- GCC_MODEL_TUNING = G5;
- GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
- GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS = YES;
- GCC_TREAT_WARNINGS_AS_ERRORS = NO;
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
- GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_CHECK_SWITCH_STATEMENTS = YES;
- GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = YES;
- GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
- GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES;
- GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;
- GCC_WARN_MISSING_PARENTHESES = YES;
- GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
- GCC_WARN_PEDANTIC = NO;
- GCC_WARN_PROTOTYPE_CONVERSION = NO;
- GCC_WARN_SHADOW = YES;
- GCC_WARN_SIGN_COMPARE = YES;
- GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES;
- GCC_WARN_UNKNOWN_PRAGMAS = YES;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- HEADER_SEARCH_PATHS = (
- "$(HEADER_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
- "$(HEADER_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
- /System/Library/Frameworks/JavaVM.framework/Versions/A/Headers,
- );
- HEADER_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/src/jni_headers/core\" \"$(OBJROOT)/src/jni_headers/core\"";
- HEADER_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/src/jni_headers/additions\" \"$(OBJROOT)/src/jni_headers/additions\"";
- INSTALL_PATH = /usr/local/lib;
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- "$(LIBRARY_SEARCH_PATHS_QUOTED_1)",
- );
- LIBRARY_SEARCH_PATHS_QUOTED_1 = "\"$(SYSTEM_LIBRARY_DIR)/Frameworks/JavaVM.framework/Versions/1.5.0/Libraries\"";
- LIBRARY_STYLE = DYNAMIC;
- MACH_O_TYPE = mh_dylib;
- OTHER_LDFLAGS = "";
- OTHER_REZFLAGS = "";
- PRODUCT_NAME = JObjC;
- SECTORDER_FLAGS = "";
- VALID_ARCHS = "ppc7400 ppc970 i386 x86_64 ppc";
- WARNING_CFLAGS = (
- "-Wmost",
- "-Wno-four-char-constants",
- "-Wno-unknown-pragmas",
- "-Wformat",
- "-Wformat-security",
- "-Wcast-align",
- "-Wwrite-strings",
- "-Wuninitialized",
- "-Wshadow",
- "-Wshorten-64-to-32",
- "-Wsign-compare",
- "-Wpointer-arith",
- "-Wall",
- );
- ZERO_LINK = NO;
- };
- name = Debug;
- };
- 89D7CCB70CDF9A2600472EA2 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ARCHS = (
- x86_64,
- ppc,
- i386,
- );
- COPY_PHASE_STRIP = YES;
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- EXECUTABLE_EXTENSION = dylib;
- EXECUTABLE_PREFIX = lib;
- FRAMEWORK_SEARCH_PATHS = (
- "$(inherited)",
- "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
- );
- FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SYSTEM_LIBRARY_DIR)/Frameworks/JavaVM.framework/Versions/A/Frameworks\"";
- FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SYSTEM_LIBRARY_DIR)/Frameworks/JavaVM.framework/Versions/A/Frameworks\"";
- GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_MODEL_TUNING = G5;
- GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
- GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS = YES;
- GCC_TREAT_WARNINGS_AS_ERRORS = NO;
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
- GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_CHECK_SWITCH_STATEMENTS = YES;
- GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = YES;
- GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
- GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES;
- GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;
- GCC_WARN_MISSING_PARENTHESES = YES;
- GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
- GCC_WARN_PEDANTIC = NO;
- GCC_WARN_PROTOTYPE_CONVERSION = NO;
- GCC_WARN_SHADOW = YES;
- GCC_WARN_SIGN_COMPARE = YES;
- GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES;
- GCC_WARN_UNKNOWN_PRAGMAS = YES;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- HEADER_SEARCH_PATHS = (
- "$(HEADER_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
- "$(HEADER_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
- /System/Library/Frameworks/JavaVM.framework/Versions/A/Headers,
- );
- HEADER_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/src/jni_headers/core\" \"$(OBJROOT)/src/jni_headers/core\"";
- HEADER_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/src/jni_headers/additions\" \"$(OBJROOT)/src/jni_headers/additions\"";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
- );
- LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SYSTEM_LIBRARY_DIR)/Frameworks/JavaVM.framework/Versions/1.5.0/Libraries\"";
- LIBRARY_STYLE = DYNAMIC;
- MACH_O_TYPE = mh_dylib;
- OTHER_LDFLAGS = "";
- OTHER_REZFLAGS = "";
- PRODUCT_NAME = JObjC;
- SECTORDER_FLAGS = "";
- VALID_ARCHS = "ppc7400 ppc970 i386 x86_64 ppc";
- WARNING_CFLAGS = (
- "-Wmost",
- "-Wno-four-char-constants",
- "-Wno-unknown-pragmas",
- "-Wformat",
- "-Wformat-security",
- "-Wcast-align",
- "-Wwrite-strings",
- "-Wuninitialized",
- "-Wshadow",
- "-Wshorten-64-to-32",
- "-Wsign-compare",
- "-Wpointer-arith",
- "-Wall",
- );
- ZERO_LINK = NO;
- };
- name = Release;
- };
- 89EBD58D0C95F43D000F04A0 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_OPTIMIZATION_LEVEL = 0;
- PRODUCT_NAME = "B&I";
- };
- name = Debug;
- };
- 89EBD58E0C95F43D000F04A0 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = YES;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- PRODUCT_NAME = "B&I";
- ZERO_LINK = NO;
- };
- name = Release;
- };
- C5F3B1460E39910500B771AE /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = YES;
- ARCHS = (
- x86_64,
- i386,
- ppc,
- );
- COPY_PHASE_STRIP = NO;
- DEBUG_INFORMATION_FORMAT = dwarf;
- EXECUTABLE_EXTENSION = dylib;
- EXECUTABLE_PREFIX = lib;
- FRAMEWORK_SEARCH_PATHS = (
- "$(inherited)",
- "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
- );
- FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SYSTEM_LIBRARY_DIR)/Frameworks/JavaVM.framework/Versions/A/Frameworks\"";
- FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SYSTEM_LIBRARY_DIR)/Frameworks/JavaVM.framework/Versions/A/Frameworks\"";
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- HEADER_SEARCH_PATHS = (
- "$(HEADER_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
- "$(HEADER_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
- /System/Library/Frameworks/JavaVM.framework/Versions/A/Headers,
- "\"$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/src/jni_headers/core\"",
- "\"$(OBJROOT)/src/jni_headers/core\"",
- "\"$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/src/jni_headers/additions\"",
- "\"$(OBJROOT)/src/jni_headers/additions\"",
- "\"$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/src/jni_headers/test\"",
- "\"$(OBJROOT)/src/jni_headers/test\"",
- );
- INSTALL_PATH = /usr/local/lib;
- LIBRARY_STYLE = DYNAMIC;
- MACH_O_TYPE = mh_dylib;
- PRODUCT_NAME = "JObjC-tests";
- SKIP_INSTALL = YES;
- };
- name = Debug;
- };
- C5F3B1470E39910500B771AE /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = YES;
- ARCHS = (
- x86_64,
- i386,
- ppc,
- );
- COPY_PHASE_STRIP = YES;
- DEBUG_INFORMATION_FORMAT = dwarf;
- EXECUTABLE_EXTENSION = dylib;
- EXECUTABLE_PREFIX = lib;
- FRAMEWORK_SEARCH_PATHS = (
- "$(inherited)",
- "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
- );
- FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SYSTEM_LIBRARY_DIR)/Frameworks/JavaVM.framework/Versions/A/Frameworks\"";
- FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SYSTEM_LIBRARY_DIR)/Frameworks/JavaVM.framework/Versions/A/Frameworks\"";
- GCC_MODEL_TUNING = G5;
- HEADER_SEARCH_PATHS = (
- "$(HEADER_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
- "$(HEADER_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
- /System/Library/Frameworks/JavaVM.framework/Versions/A/Headers,
- "\"$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/src/jni_headers/core\"",
- "\"$(OBJROOT)/src/jni_headers/core\"",
- "\"$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/src/jni_headers/additions\"",
- "\"$(OBJROOT)/src/jni_headers/additions\"",
- "\"$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/src/jni_headers/test\"",
- "\"$(OBJROOT)/src/jni_headers/test\"",
- );
- INSTALL_PATH = /usr/local/lib;
- LIBRARY_STYLE = DYNAMIC;
- MACH_O_TYPE = mh_dylib;
- PRODUCT_NAME = "JObjC-tests";
- SKIP_INSTALL = YES;
- ZERO_LINK = NO;
- };
- name = Release;
- };
- C5F3B1540E39927A00B771AE /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_OPTIMIZATION_LEVEL = 0;
- PRODUCT_NAME = "build-test";
- };
- name = Debug;
- };
- C5F3B1550E39927A00B771AE /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = YES;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- PRODUCT_NAME = "build-test";
- ZERO_LINK = NO;
- };
- name = Release;
- };
- EB9FD86A0AEECD13008E157E /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
- GCC_OPTIMIZATION_LEVEL = 0;
- PRODUCT_NAME = "build-core";
- };
- name = Debug;
- };
- EB9FD86B0AEECD13008E157E /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = YES;
- GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- PRODUCT_NAME = "build-core";
- ZERO_LINK = NO;
- };
- name = Release;
- };
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
- 4CEBA75C08679E4D0015D03E /* Build configuration list for PBXProject "JObjC" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 4CEBA75D08679E4D0015D03E /* Debug */,
- 4CEBA75E08679E4D0015D03E /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 4CEBA79108679F100015D03E /* Build configuration list for PBXNativeTarget "build-core-native" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 4CEBA79208679F100015D03E /* Debug */,
- 4CEBA79308679F100015D03E /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 89D7CA1C0CDBA9B000472EA2 /* Build configuration list for PBXLegacyTarget "build-generator-java" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 89D7CA170CDBA94D00472EA2 /* Debug */,
- 89D7CA180CDBA94D00472EA2 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 89D7CB8E0CDC4ED900472EA2 /* Build configuration list for PBXLegacyTarget "run-generator" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 89D7CB880CDC4ED000472EA2 /* Debug */,
- 89D7CB890CDC4ED000472EA2 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 89D7CC510CDE4C5200472EA2 /* Build configuration list for PBXLegacyTarget "build-generated-java" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 89D7CC4D0CDE4C0400472EA2 /* Debug */,
- 89D7CC4E0CDE4C0400472EA2 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 89D7CC630CDE762000472EA2 /* Build configuration list for PBXLegacyTarget "build-additions-java" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 89D7CC610CDE75EC00472EA2 /* Debug */,
- 89D7CC620CDE75EC00472EA2 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 89D7CC7A0CDE76F500472EA2 /* Build configuration list for PBXLegacyTarget "assemble-product-java" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 89D7CC730CDE767500472EA2 /* Debug */,
- 89D7CC740CDE767500472EA2 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 89D7CCB50CDF9A2600472EA2 /* Build configuration list for PBXNativeTarget "build-additions-native" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 89D7CCB60CDF9A2600472EA2 /* Debug */,
- 89D7CCB70CDF9A2600472EA2 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 89EBD5930C95F44E000F04A0 /* Build configuration list for PBXAggregateTarget "B&I" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 89EBD58D0C95F43D000F04A0 /* Debug */,
- 89EBD58E0C95F43D000F04A0 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- C5F3B1480E39917500B771AE /* Build configuration list for PBXNativeTarget "build-test-native" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- C5F3B1460E39910500B771AE /* Debug */,
- C5F3B1470E39910500B771AE /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- C5F3B15B0E3992AC00B771AE /* Build configuration list for PBXLegacyTarget "build-test-java" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- C5F3B1540E39927A00B771AE /* Debug */,
- C5F3B1550E39927A00B771AE /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- EB9FD8690AEECD13008E157E /* Build configuration list for PBXLegacyTarget "build-core-java" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- EB9FD86A0AEECD13008E157E /* Debug */,
- EB9FD86B0AEECD13008E157E /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
-/* End XCConfigurationList section */
- };
- rootObject = 00E6828EFEC88D1A11DB9C8B /* Project object */;
-}
diff --git a/jdk/src/macosx/native/jobjc/README.txt b/jdk/src/macosx/native/jobjc/README.txt
deleted file mode 100644
index 3bde08a77c4..00000000000
--- a/jdk/src/macosx/native/jobjc/README.txt
+++ /dev/null
@@ -1,132 +0,0 @@
-#title JObjC
-#
-# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation. Oracle designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Oracle in the LICENSE file that accompanied this code.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-JObjC core provides a pure Java interface for calling C functions and
-sending ObjC messages. Given some information, it can marshal types
-automatically.
-
-It also parses BridgeSupport to generate Java wrappers around
-Framework bundles. These wrappers rely on the core to provide access
-to the C constants, enums, structs, functions, ObjC classes, etc of a
-framework.
-
-* How to build it
-
-Your best option is `ant all`. There's an Xcode "B&I" target that
-works for buildit.
-
-You'll need a recent JavaNativeFoundation, and perhaps some other
-things. Everything is usually there on SnowLeopard (or Leopard after
-the common ~javabuild/bin/update runs).
-
-The build process is quite involved. Xcode takes care of the native
-parts, ant takes care of the Java parts, and there's an unholy mix of
-external targets and hidden dependencies that keep Xcode and ant (and
-buildit on top of that) from stepping on each other. So a warning: the
-ant and Xcode targets don't have proper dependencies set up because of
-this. They have some dependencies configured, but not the entire
-chain. This is because of the jumping back and forth between
-externals. If you run the aggregate targets (Xcode B&I, ant all, ant
-test, ant bench), everything's is good. But if you manually invoke
-individual targets, chances are you'll miss something. Let's go over
-it all step by step:
-
-** ant gen-pcoder
-
-The PrimitiveCoder subclasses have a lot of boiler plate which
-simplifies the generated MixedPrimitiveCoder classes. So instead of
-maintaining it, I maintain a tiny Haskell script that spits out the
-Java code. This ant target runs that script if Haskell is available on
-the system. If it isn't available, this will silently fail. That's
-okay, because chances are the PrimitiveCoder.java that you got from
-svn is current and does not need to be updated.
-
-** ant build-core / Xcode build-core-java
-
-Build core simply builds the JObjC core java classes, and also
-generates headers for the JNI for Xcode.
-
-** ant build-core-native / Xcode build-core-native
-
-Xcode builds the native core, using the headers from the Java core. It
-generates libJObjC.dylib.
-
-** ant build-generator / Xcode build-generator-java
-
-ant builds the generator.
-
-** ant run-generator / Xcode run-generator
-
-ant runs the generator, using the core Java and native classes.
-
-What is rungen? And what's run-generator-old? run-generator-old is the
-preferred way to run the generator from ant, but there's a strange bug
-when running from buildit that causes run-generator-old to
-freeze. Pratik was helping me debug it, inspecting the stack and
-snooping dtrace probes, but we never found the reason for the
-block. So I figured that maybe if I just add a layer of indirection
-maybe it'll work around that. And it did. Sad but true.
-
-** ant build-generated / Xcode build-generated-java
-
-Build the generator output.
-
-** ant build-additions / Xcode build-additions-java
-
-Builds java additions.
-
-** ant build-additions-native / Xcode build-additions-native
-
-This builds a new version of libJObjC.dylib. It will rebuild
-everything from the core, and include everything from additions.
-
-** ant assemble-product / Xcode assemble-product-java
-
-Create a jar, copy products to destination, etc.
-
-* How to test it
-
-The test cases also contain a Java component and a native component,
-and are built similarly to the above. The benchmarks are built
-together with the tests. So "ant build-test" and "ant
-build-test-native" will build both the benchmarks and the test. "ant
-test" will run the test. "ant bench" will run benchmarks. If you only
-want to run a specific benchmark, you can pass a regexp in the
-environment variable BENCH_MATCH.
-
-
-ant test
-ant bench
-BENCH_MATCH=Foo ant bench
-
-
-Test and bench reports will end up in
-build/JObjC.build/Debug/test-reports/
-
-* How to use it
-
-Include the jar in your classpath and set your java.library.path to
-the directory that contains the dylib. Same thing for app bundles.
diff --git a/jdk/src/macosx/native/jobjc/TODOS b/jdk/src/macosx/native/jobjc/TODOS
deleted file mode 100644
index 16abea13760..00000000000
--- a/jdk/src/macosx/native/jobjc/TODOS
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/bin/bash
-#
-# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation. Oracle designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Oracle in the LICENSE file that accompanied this code.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-#
-egrep "(TODO|FIXME|XXX|HACK)" -r src
diff --git a/jdk/src/macosx/native/jobjc/bridgesupport.gmk b/jdk/src/macosx/native/jobjc/bridgesupport.gmk
deleted file mode 100644
index 1de9bd1d5c5..00000000000
--- a/jdk/src/macosx/native/jobjc/bridgesupport.gmk
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation. Oracle designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Oracle in the LICENSE file that accompanied this code.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-# makefile for generating a stable set of bridgesupport files that change timestamp
-# only when the bridgesupport data actually changes
-
-FRAMEWORKS_DIR = /System/Library/Frameworks
-GBM = /usr/bin/gen_bridge_metadata
-GEN_HEADERS = $(addsuffix .headers,$(FRAMEWORKS))
-GEN_BRIDGESUPPORT = $(addsuffix .bridgesupport,$(FRAMEWORKS))
-
-%.bridgesupport : %.headers $(FRAMEWORKS_DIR)/%.framework/Headers/*.h
- @echo "generating bridge support for" $<
- if [ -f $(FRAMEWORKS_DIR)/$(<:.headers=.framework)/Resources/BridgeSupport/$(<:.headers=Full.bridgesupport) ] ; \
- then cp $(FRAMEWORKS_DIR)/$(<:.headers=.framework)/Resources/BridgeSupport/$(<:.headers=Full.bridgesupport) $@ ; \
- else $(GBM) -F complete --framework $(<:.headers=.framework) -o $@ ; \
- fi
- if cmp -s $@ $(STABLE_GEN_DIR)/$(@:.bridgesupport=Full.bridgesupport) ; \
- then : ; \
- else cp $@ $(STABLE_GEN_DIR)/$(@:.bridgesupport=Full.bridgesupport) ; \
- fi
-
-%.headers : $(FRAMEWORKS_DIR)/%.framework/Headers
- @echo linking $<
- ln -s $< $@
-
-$(STABLE_GEN_DIR):
- mkdir -p $(STABLE_GEN_DIR)
-
-$(GEN_BRIDGESUPPORT): $(GEN_HEADERS) $(STABLE_GEN_DIR)
-
-all: $(GEN_BRIDGESUPPORT)
diff --git a/jdk/src/macosx/native/jobjc/build.xml b/jdk/src/macosx/native/jobjc/build.xml
deleted file mode 100644
index 9f638840fcf..00000000000
--- a/jdk/src/macosx/native/jobjc/build.xml
+++ /dev/null
@@ -1,520 +0,0 @@
-
-
-
-
-
-
-
- Nothing to do for install-headers build phase
-
-
-
- Nothing to do for install-source build phase
-
-
-
-
-
-
- This Ant build file depends on the native Xcode project to invoke
- targets by defining $PRODUCT_NAME to specify the target.
-
-
- --- Redirecting to target "${env.PRODUCT_NAME}"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/jdk/src/macosx/native/jobjc/extract_classes.pl b/jdk/src/macosx/native/jobjc/extract_classes.pl
deleted file mode 100644
index b0950db4699..00000000000
--- a/jdk/src/macosx/native/jobjc/extract_classes.pl
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/perl
-#
-# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation. Oracle designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Oracle in the LICENSE file that accompanied this code.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-##
-
-$file_dir = $ARGV[0];
-@file_list = qx("/usr/bin/find" "$file_dir");
-
-foreach $file (@file_list) {
- if ($file =~ s/\.class//) {
- if ($file !~ s/\$[0-9]//) {
- $file =~ s/$file_dir\///g;
- $file =~ s/\//\./g;
- chomp($file);
- print "$file,";
- }
- }
-}
diff --git a/jdk/src/macosx/native/jobjc/run-and-write-if-okay b/jdk/src/macosx/native/jobjc/run-and-write-if-okay
deleted file mode 100644
index 8d0bb690276..00000000000
--- a/jdk/src/macosx/native/jobjc/run-and-write-if-okay
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/usr/bin/env ruby
-#
-# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation. Oracle designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Oracle in the LICENSE file that accompanied this code.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-#
-
-if ARGV.length < 2
- puts <&1`. If it returns successfully, it writes the output to OUTPATH.
-This script will return successfully unless writing the output fails.
-EOF
- exit
-end
-
-EXECPATH = ARGV[0]
-OUTPATH = ARGV[1]
-
-output = `#{EXECPATH}`
-puts output
-
-if $?.to_i == 0
- puts "Writing output of #{EXECPATH} to #{OUTPATH}"
- File.open(OUTPATH, 'w') {|f| f.write(output) }
-else
- puts "#{EXECPATH} failed to run trial. Ignoring."
-end
diff --git a/jdk/src/macosx/native/jobjc/rungen b/jdk/src/macosx/native/jobjc/rungen
deleted file mode 100644
index 17aeabea15d..00000000000
--- a/jdk/src/macosx/native/jobjc/rungen
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/usr/bin/env ruby
-#
-# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation. Oracle designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Oracle in the LICENSE file that accompanied this code.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-#
-
-xcodeAction = ARGV[0]
-
-exit unless xcodeAction == "install"
-
-JOBJC_JAR = ARGV[1]
-LIBPATH = ARGV[2]
-OBJROOT = ARGV[3]
-ARCHS = ARGV[4]
-STABLE_GEN_DIR = ARGV[5]
-
-ourJavaHome = ENV['JAVA_HOME']
-ourJavaVersion = `java -fullversion 2>&1`
-$stderr.puts "ENV['JAVA_HOME'] = #{ourJavaHome}"
-$stderr.puts "java -fullversion = #{ourJavaVersion}"
-
-$stderr.puts "jobjc_jar = #{JOBJC_JAR}"
-$stderr.puts "libpath = #{LIBPATH}"
-$stderr.puts "objroot = #{OBJROOT}"
-$stderr.puts "ARCHS = #{ARCHS}"
-$stderr.puts "STABLE_GEN_DIR = #{STABLE_GEN_DIR}"
-
-jarch = if ARCHS =~ /x86_64/ then "-d64" else "-d32" end
-
-# compute the boot class path, but remove the JObjC jar file that may have been installed in the boot jdk
-
-bootclasspathcmd = "java -classpath #{OBJROOT}/bin/core:#{OBJROOT}/bin/generator com.apple.internal.jobjc.generator.BootClassPathMinus #{JOBJC_JAR}"
-$stderr.puts bootclasspathcmd
-bootclasspath = `#{bootclasspathcmd}`
-
-$stderr.puts "bootclasspath is: "
-$stderr.puts bootclasspath
-
-# we run the generator with our newly created JObjC. The installed version (if available) has been removed from
-# the boot class path, so we are building with everything newly created.
-cmd = "java #{jarch} -Xms128m -Xmx512m -Djava.library.path=#{LIBPATH} -Xbootclasspath:#{bootclasspath.chomp} -classpath #{OBJROOT}/bin/core:#{OBJROOT}/bin/generator -ea com.apple.internal.jobjc.generator.Generator dst=#{OBJROOT}/src/jobjc frameworks=#{STABLE_GEN_DIR}"
-
-$stderr.puts cmd
-puts `#{cmd} 2>&1`
-
-raise $?.to_i if $?.to_i != 0
diff --git a/jdk/src/macosx/native/jobjc/runjava b/jdk/src/macosx/native/jobjc/runjava
deleted file mode 100644
index a6e91547e7d..00000000000
--- a/jdk/src/macosx/native/jobjc/runjava
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/bin/bash
-#
-# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation. Oracle designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Oracle in the LICENSE file that accompanied this code.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-#
-java -ea -classpath "lib/junit-4.4.jar:build/JObjC.build/Debug/bin/core:build/JObjC.build/Debug/bin/generator:build/JObjC.build/Debug/bin/additions:build/JObjC.build/Debug/bin/test:build/JObjC.build/Debug/bin/generated" -Djava.library.path=build/Debug $@
diff --git a/jdk/src/macosx/native/jobjc/src/core/PrimitiveCoder.hs b/jdk/src/macosx/native/jobjc/src/core/PrimitiveCoder.hs
deleted file mode 100644
index b9b0070fcb4..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/PrimitiveCoder.hs
+++ /dev/null
@@ -1,275 +0,0 @@
-#!/usr/bin/env runhaskell
-
-{-
-/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
--}
-{-
-The simplest way to get Haskell is through MacPorts: sudo port install ghc
-
-Otherwise, see http://www.haskell.org/ghc/
--}
-
-import Data.List
-import Data.Maybe
-import Data.Char
-
-data Width = W32 | W64
- deriving (Show, Eq, Bounded, Enum)
-
-data NType = NBOOL | Nschar | Nuchar | Nsshort | Nushort | Nsint | Nuint
- | Nslong | Nulong | Nslonglong | Nulonglong | Nfloat | Ndouble
- deriving (Show, Eq, Bounded, Enum)
-
-data JPrim = Jboolean | Jbyte | Jchar | Jshort | Jint | Jlong | Jfloat | Jdouble
- deriving (Show, Eq, Bounded, Enum)
-
-data JClass = JBoolean | JByte | JCharacter | JShort | JInteger | JLong
- | JFloat | JDouble
- deriving (Show, Eq, Bounded, Enum)
-
-data FFIType = SINT8 | UINT8 | SINT16 | UINT16 | SINT32 | UINT32
- | SINT64 | UINT64 | FLOAT | DOUBLE
- deriving (Show, Eq, Bounded, Enum)
-
-widths = [minBound..maxBound] :: [Width]
-ntypes = [minBound..maxBound] :: [NType]
-jprims = [minBound..maxBound] :: [JPrim]
-jclasses = [minBound..maxBound] :: [JClass]
-ffitypes = [minBound..maxBound] :: [FFIType]
-
--- What's the FFIType for a given Width and NType? For example: W32 NBOOL -> SINT8
-ffitype :: Width -> NType -> FFIType
-ffitype _ NBOOL = SINT8
-ffitype _ Nschar = SINT8
-ffitype _ Nuchar = UINT8
-ffitype _ Nsshort = SINT16
-ffitype _ Nushort = UINT16
-ffitype _ Nsint = SINT32
-ffitype _ Nuint = UINT32
-ffitype W32 Nslong = SINT32
-ffitype W64 Nslong = SINT64
-ffitype W32 Nulong = UINT32
-ffitype W64 Nulong = UINT64
-ffitype _ Nslonglong = SINT64
-ffitype _ Nulonglong = UINT64
-ffitype _ Nfloat = FLOAT
-ffitype _ Ndouble = DOUBLE
-
-sizeof :: FFIType -> Int
-sizeof SINT8 = 1
-sizeof UINT8 = 1
-sizeof SINT16 = 2
-sizeof UINT16 = 2
-sizeof SINT32 = 4
-sizeof UINT32 = 4
-sizeof SINT64 = 8
-sizeof UINT64 = 8
-sizeof FLOAT = 4
-sizeof DOUBLE = 8
-
--- What's the Obj-C encoding for a given NType? For example: unsigned char -> 'C'
-encoding nt = fromJust $ lookup nt $
- [(NBOOL, 'B'), (Nschar, 'c'), (Nuchar, 'C'), (Nsshort, 's'),
- (Nushort, 'S'), (Nsint, 'i'), (Nuint, 'I'), (Nslong, 'l'),
- (Nulong, 'L'), (Nslonglong, 'q'), (Nulonglong, 'Q'),
- (Nfloat, 'f'), (Ndouble, 'd')]
-
--- What's the JPrim for a given NType? For example: native signed long long -> java long
-ntype2jprim nt = fromJust $ lookup nt $
- [(NBOOL, Jboolean), (Nschar, Jbyte), (Nuchar, Jbyte),
- (Nsshort, Jshort), (Nushort, Jshort), (Nsint, Jint), (Nuint, Jint),
- (Nslong, Jlong), (Nulong, Jlong),
- (Nslonglong, Jlong), (Nulonglong, Jlong),
- (Nfloat, Jfloat), (Ndouble, Jdouble)]
-
--- What's the JClass for a given JPrim? For example: int -> Integer
-jprim2jclass jp = fromJust $ lookup jp $
- [(Jboolean, JBoolean), (Jbyte, JByte), (Jchar, JCharacter),
- (Jshort, JShort), (Jint, JInteger), (Jlong, JLong),
- (Jfloat, JFloat), (Jdouble, JDouble)]
-
--- Convert a type to something suitable for Java code. For example: Jboolean -> boolean
-ntype2js nt = tail $ show nt
-jclass2js t = tail $ show t
-jprim2js p = tail $ show p
-ffitype2js f = "FFI_" ++ (show f)
-
--- Capitalize the first letter of a String
-capitalize [] = []
-capitalize s = [toUpper $ head s] ++ tail s
-
--- Given an Width and NType, return the Java code for reading said NType from memory.
-popAddr :: Width -> NType -> String
-popAddr _ NBOOL = "rt.unsafe.getByte(addr) != 0"
-popAddr _ Nschar = "rt.unsafe.getByte(addr)"
-popAddr _ Nuchar = "rt.unsafe.getByte(addr)"
-popAddr W32 Nslong = "rt.unsafe.getInt(addr)"
-popAddr W32 Nulong = "rt.unsafe.getInt(addr)"
-popAddr _ ntype = "rt.unsafe.get" ++ (capitalize.jprim2js.ntype2jprim $ ntype) ++ "(addr)"
-
--- Given an Width and NType, return the Java code for writing said NType to memory.
-pushAddr :: Width -> NType -> String
-pushAddr _ NBOOL = "rt.unsafe.putByte(addr, (byte) (x ? 1 : 0));"
-pushAddr _ Nschar = "rt.unsafe.putByte(addr, x);"
-pushAddr _ Nuchar = "rt.unsafe.putByte(addr, x);"
-pushAddr W32 Nslong = "rt.unsafe.putInt(addr, (int) x);"
-pushAddr W32 Nulong = "rt.unsafe.putInt(addr, (int) x);"
-pushAddr _ ntype = "rt.unsafe.put" ++ (capitalize jprimS) ++ "(addr, (" ++ jprimS ++ ") x);"
- where jprimS = jprim2js.ntype2jprim $ ntype
-
--- Helpers for generating Java ternarnies and conditionals.
-archExpr x32 x64 = if x32 /= x64 then retdiff else x32
- where retdiff = "(JObjCRuntime.IS64 ? (" ++ x64 ++ ") : (" ++ x32 ++ "))"
-
-archStmt x32 x64 = if x32 /= x64 then retdiff else x32
- where retdiff = "if(JObjCRuntime.IS64){ " ++ x64 ++ " }else{ " ++ x32 ++ " }"
-
--- Get a Java expression for the correct FFIType at runtime. For example: (JObjCRuntime.IS64 ? FFI_SINT64 : FFI_SINT32)
-ffitypeVal nt = archExpr (ffitype2js $ ffitype W32 nt)
- (ffitype2js $ ffitype W64 nt)
-
--- Similar to ffiTypeVal. Get the correct pop expression and push statement.
-popAddrVal nt = archExpr (popAddr W32 nt) (popAddr W64 nt)
-pushAddrVal nt = archStmt (pushAddr W32 nt) (pushAddr W64 nt)
-
--- What's the Coder class name we're using for a given NType?
-coderName nt = aux nt ++ "Coder"
- where
- aux NBOOL = "Bool"
- aux Nschar = "SChar"
- aux Nuchar = "UChar"
- aux Nsshort = "SShort"
- aux Nushort = "UShort"
- aux Nsint = "SInt"
- aux Nuint = "UInt"
- aux Nslong = "SLong"
- aux Nulong = "ULong"
- aux Nslonglong = "SLongLong"
- aux Nulonglong = "ULongLong"
- aux Nfloat = "Float"
- aux Ndouble = "Double"
-
--- Operation for converting between primitives. Usually it just casts, but booleans are special.
-jconvertPrims sym Jboolean Jboolean = sym
-jconvertPrims sym Jboolean b = "((" ++ jprim2js b ++ ")(" ++ sym ++ " ? 1 : 0))"
-jconvertPrims sym a Jboolean = "(" ++ sym ++ " != 0)"
-jconvertPrims sym a b = if a == b then sym else "((" ++ jprim2js b ++ ")" ++ sym ++ ")"
-
-sizeofRet nt =
- let ffitypes = map (\w -> ffitype w nt) widths
- sizes = map sizeof ffitypes in
- if (length $ nub sizes) == 1
- then "\t\treturn " ++ (show.head $ sizes) ++ ";"
- else unlines [
- "\t\tswitch(w){",
- (unlines $ map casestmt widths),
- "\t\tdefault: return -1;",
- "\t\t}"]
- where
- casestmt w = "\t\t\tcase " ++ (show w) ++ ": return " ++
- (show.sizeof $ ffitype w nt) ++ ";"
-
--- Generate a coder class for a given NType.
-c2java ntype =
- unlines [
- "// native " ++ ntypeS ++ " -> java " ++ jprimS,
- "public static final class " ++ className ++ " extends PrimitiveCoder<" ++ jclassS ++ ">{",
- "\tpublic static final " ++ className ++ " INST = new " ++ className ++ "();",
- "\tpublic " ++ className ++ "(){ super("++ffitypeVal ntype++", \"" ++ [encoding ntype] ++ "\", "++jclassS++".class, "++jprimS++".class); }",
- "\t// compile time",
- "\t@Override public void push(JObjCRuntime rt, long addr, " ++ jprimS ++ " x){",
- "\t\t" ++ pushAddrVal ntype,
- "\t}",
- "\t@Override public " ++ jprimS ++ " pop" ++ capitalize jprimS ++ "(JObjCRuntime rt, long addr){",
- "\t\treturn " ++ popAddrVal ntype ++ ";",
- "\t}",
- "\t// for runtime coding",
- "\t@Override public int sizeof(Width w){",
- sizeofRet ntype,
- "\t}",
- "\t@Override public void push(JObjCRuntime rt, long addr, " ++ jclassS ++ " x){ " ++
- "push(rt, addr, (" ++ jprimS ++ ") x); }",
- "\t@Override public " ++ jclassS ++ " pop(JObjCRuntime rt, long addr){ " ++
- "return pop" ++ capitalize jprimS ++ "(rt, addr); }",
- "\t// proxies for mixed encoding",
- makeProxyMethods ntype,
- "}"
- ]
- where
- jprim = ntype2jprim ntype
- jclass = jprim2jclass jprim
- jprimS = jprim2js jprim
- jclassS = jclass2js jclass
- ntypeS = ntype2js ntype
- className = coderName ntype
-
--- Generate push and pop methods that convert and proxy to actual implementation.
-makeProxyMethods nt = unlines $ map aux jprims
- where
- targetJPrim = ntype2jprim nt
- targetJPrimS = jprim2js targetJPrim
- aux jprim = if targetJPrim == jprim then "" else unlines [
- "\t@Override public void push(JObjCRuntime rt, long addr, " ++ jprimS ++ " x){ " ++
- "push(rt, addr, " ++ pushConversion "x" ++ "); }",
- "\t@Override public " ++ jprimS ++ " pop" ++ capitalize jprimS ++ "(JObjCRuntime rt, long addr){ " ++
- "return " ++ (popConversion ("pop" ++ capitalize targetJPrimS ++ "(rt, addr)")) ++ "; }"
- ]
- where
- jprimS = jprim2js jprim
- pushConversion sym = jconvertPrims sym jprim targetJPrim
- popConversion sym = jconvertPrims sym targetJPrim jprim
-
-main = do
- putStrLn "package com.apple.jobjc;"
-
- putStrLn "import com.apple.jobjc.JObjCRuntime.Width;"
-
- putStrLn "// Auto generated by PrimitiveCoder.hs"
- putStrLn "// Do not edit by hand."
-
- putStrLn "public abstract class PrimitiveCoder extends Coder{"
-
- putStrLn "\tpublic PrimitiveCoder(int ffiTypeCode, String objCEncoding, Class jclass, Class jprim){"
- putStrLn "\t\tsuper(ffiTypeCode, objCEncoding, jclass, jprim);"
- putStrLn "\t}"
-
- mapM_ (\p -> putStrLn $ unlines [makePopI p, makePushI p]) jprims
-
- mapM_ (putStrLn . c2java) ntypes
-
- putStrLn "}"
- where
- makePopI jprim = unlines ["\tpublic final " ++ jprim2js jprim ++ " pop" ++ (capitalize.jprim2js $ jprim)
- ++ "(NativeArgumentBuffer args){\n"
- ++ "\t\treturn pop" ++ (capitalize.jprim2js $ jprim) ++ "(args.runtime, args.retValPtr);\n"
- ++ "\t}",
- "\tpublic abstract " ++ jprim2js jprim ++ " pop" ++ (capitalize.jprim2js $ jprim) ++ "(JObjCRuntime runtime, long addr);"]
- makePushI jprim = unlines ["\tpublic final void push"
- ++ "(NativeArgumentBuffer args, " ++ jprim2js jprim ++ " x){\n"
- ++ "\t\tpush(args.runtime, args.argValuesPtr, x);\n"
- ++ "\t\targs.didPutArgValue(sizeof());\n"
- ++ "\t}",
- "\tpublic abstract void push(JObjCRuntime runtime, long addr, " ++ jprim2js jprim ++ " x);"]
diff --git a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/CFType.java b/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/CFType.java
deleted file mode 100644
index 5207cf81d57..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/CFType.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.jobjc;
-
-
-public class CFType extends Pointer {
- protected CFType(long ptr) { super(ptr); }
- protected CFType(Pointer> ptr) { super(ptr.ptr); }
-
- protected ID getTollFreeBridge(JObjCRuntime runtime){
- return ID.getObjCObjectFor(runtime, super.ptr);
- }
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/CIF.java b/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/CIF.java
deleted file mode 100644
index c32d822662f..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/CIF.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.jobjc;
-
-import com.apple.jobjc.Coder.PrimitivePointerCoder;
-
-class CIF {
- private static native int getSizeofCIF();
- private static final int SIZEOF = getSizeofCIF();
- private static native boolean prepCIF(long cifPtr, int nargs, long retFFITypePtr, long argsPtr);
-
- public static CIF createCIFFor(final NativeArgumentBuffer args, final Coder returnCoder, final Coder ... argCoders) {
- NativeBuffer cifBuf = new NativeBuffer(SIZEOF + (argCoders.length * JObjCRuntime.PTR_LEN));
- final long argsPtr = cifBuf.bufferPtr + SIZEOF;
-
- {
- long argsIterPtr = argsPtr;
- for(final Coder coder : argCoders){
- PrimitivePointerCoder.INST.push(args.runtime, argsIterPtr, coder.getFFITypePtr());
- argsIterPtr += JObjCRuntime.PTR_LEN;
- }
- }
-
- boolean ok = prepCIF(cifBuf.bufferPtr, argCoders.length, returnCoder.getFFITypePtr(), argsPtr);
- if(!ok)
- throw new RuntimeException("ffi_prep_cif failed.");
-
- return new CIF(cifBuf, returnCoder, argCoders);
- }
-
- final NativeBuffer cif;
- // CIF needs to keep refs to the Coders, so they don't get finalized and their FFITypes freed.
- final Coder returnCoder;
- final Coder[] argCoders;
-
- private CIF(final NativeBuffer cif, Coder returnCoder, Coder... argCoders) {
- this.cif = cif;
- this.returnCoder = returnCoder;
- this.argCoders = argCoders;
- }
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Coder.java b/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Coder.java
deleted file mode 100644
index 9efc76e9c05..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Coder.java
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.jobjc;
-
-import java.io.StringWriter;
-import java.lang.reflect.Method;
-
-import com.apple.jobjc.JObjCRuntime.Width;
-import com.apple.jobjc.PrimitiveCoder.BoolCoder;
-import com.apple.jobjc.PrimitiveCoder.DoubleCoder;
-import com.apple.jobjc.PrimitiveCoder.FloatCoder;
-import com.apple.jobjc.PrimitiveCoder.SCharCoder;
-import com.apple.jobjc.PrimitiveCoder.SIntCoder;
-import com.apple.jobjc.PrimitiveCoder.SLongLongCoder;
-import com.apple.jobjc.PrimitiveCoder.SShortCoder;
-
-public abstract class Coder {
- private static native long getNativeFFITypePtrForCode(final int code);
-
- static final int FFI_VOID = 0;
- static final int FFI_PTR = FFI_VOID+1;
-
- static final int FFI_SINT8 = FFI_PTR+1;
- static final int FFI_UINT8 = FFI_SINT8+1;
- static final int FFI_SINT16 = FFI_UINT8+1;
- static final int FFI_UINT16 = FFI_SINT16+1;
- static final int FFI_SINT32 = FFI_UINT16+1;
- static final int FFI_UINT32 = FFI_SINT32+1;
- static final int FFI_SINT64 = FFI_UINT32+1;
- static final int FFI_UINT64 = FFI_SINT64+1;
-
- static final int FFI_FLOAT = FFI_UINT64+1;
- static final int FFI_DOUBLE = FFI_FLOAT+1;
- static final int FFI_LONGDOUBLE = FFI_DOUBLE+1;
-
- private static long[] ffiCodesToFFITypePtrs;
- static{
- System.loadLibrary("JObjC");
- ffiCodesToFFITypePtrs = new long[FFI_LONGDOUBLE + 1];
- for (int i = 0; i < FFI_LONGDOUBLE + 1; i++) ffiCodesToFFITypePtrs[i] = getNativeFFITypePtrForCode(i);
- }
-
- long getFFITypePtr() {
- return ffiCodesToFFITypePtrs[getTypeCode()];
- }
-
- // runtime coding
- public abstract void push(final JObjCRuntime runtime, final long addr, final T x);
- public abstract T pop(final JObjCRuntime runtime, final long addr);
-
- public void push(final NativeArgumentBuffer args, final T x){
- push(args.runtime, args.argValuesPtr, x);
- args.didPutArgValue(sizeof());
- }
-
- public T pop(final NativeArgumentBuffer args){
- return pop(args.runtime, args.retValPtr);
- }
-
- public abstract int sizeof(Width w);
- final public int sizeof(){ return sizeof(JObjCRuntime.WIDTH); }
-
- //
-
- public Coder(int ffiTypeCode, String objCEncoding, Class jclass, Class jprim) {
- this.ffiTypeCode = ffiTypeCode;
- this.objCEncoding = objCEncoding;
- this.jclass = jclass;
- this.jprim = jprim;
- }
-
- public Coder(int ffiTypeCode, String objCEncoding, Class jclass) {
- this(ffiTypeCode, objCEncoding, jclass, null);
- }
-
- private final int ffiTypeCode;
- private final String objCEncoding;
- private final Class jclass;
- private final Class jprim;
-
- final int getTypeCode() { return ffiTypeCode; }
- final String getObjCEncoding(){ return objCEncoding; }
- public final Class getJavaClass() { return jclass; }
- public final Class getJavaPrimitive() { return jprim; }
-
- // runtime coding
-
- private static Coder[] runtimeCoders;
- static public Coder getCoderAtRuntimeForType(Class cls){
- if(runtimeCoders == null) runtimeCoders = new Coder[]{
- NSClassCoder.INST, IDCoder.INST, PointerCoder.INST,
- DoubleCoder.INST, FloatCoder.INST, SLongLongCoder.INST,
- SIntCoder.INST, SShortCoder.INST, SCharCoder.INST, BoolCoder.INST,
- VoidCoder.INST
- };
-
- for(Coder c : runtimeCoders)
- if((c.getJavaClass() != null && c.getJavaClass().isAssignableFrom(cls)) ||
- (c.getJavaPrimitive() != null && c.getJavaPrimitive().isAssignableFrom(cls)))
- return c;
-
- if(Struct.class.isAssignableFrom(cls)){
- try {
- Method m = cls.getDeclaredMethod("getStructCoder");
- m.setAccessible(true);
- return (Coder) m.invoke(null);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- throw new RuntimeException("Could not find suitable coder for " + cls);
- }
-
- static public Coder getCoderAtRuntime(Object inst){
- if(inst == null) return PointerCoder.INST;
- if(inst instanceof Struct) return ((Struct) inst).getCoder();
- return getCoderAtRuntimeForType(inst.getClass());
- }
-
- //
-
- public static final class VoidCoder extends Coder{
- public static final VoidCoder INST = new VoidCoder();
- public VoidCoder(){ super(FFI_VOID, "v", Void.class, void.class); }
- @Override public int sizeof(Width w) { return -1; }
- @Override public Object pop(JObjCRuntime runtime, long addr) { throw new RuntimeException("Trying to pop a Void."); }
- @Override public void push(JObjCRuntime runtime, long addr, Object x) { throw new RuntimeException("Trying to push a Void."); }
- }
-
- public static final class UnknownCoder extends Coder {
- public static final UnknownCoder INST = new UnknownCoder();
- public UnknownCoder(){ super(-1, "?", null, null); }
- @Override public int sizeof(Width w) { return -1; }
- @Override public void push(JObjCRuntime runtime, long addr, Object x) { throw new RuntimeException("Coder not implemented");}
- @Override public Object pop(JObjCRuntime runtime, long addr) { throw new RuntimeException("Coder not implemented"); }
- }
-
- public static final class PrimitivePointerCoder extends Coder {
- public static final PrimitivePointerCoder INST = new PrimitivePointerCoder();
- public PrimitivePointerCoder(){ super(Coder.FFI_PTR, "^?", Long.class, long.class); }
- @Override public int sizeof(Width w) { return JObjCRuntime.PTR_LEN; }
-
- public void push(JObjCRuntime runtime, long addr, long x) {
- if(JObjCRuntime.IS64)
- runtime.unsafe.putLong(addr, x);
- else
- runtime.unsafe.putInt(addr, (int) x);
- }
-
- public void push(final JObjCRuntime runtime, final NativeArgumentBuffer argBuf, final long ptr) {
- push(runtime, argBuf.argValuesPtr, ptr);
- argBuf.didPutArgValue(sizeof());
- }
-
- public long popPtr(final JObjCRuntime runtime, final long addr) {
- return JObjCRuntime.IS64 ? runtime.unsafe.getLong(addr) : runtime.unsafe.getInt(addr);
- }
-
- public long popPtr(final JObjCRuntime runtime, final NativeArgumentBuffer argBuf) {
- return popPtr(runtime, argBuf.retValPtr);
- }
-
- @Override public Long pop(JObjCRuntime runtime, long addr) { return popPtr(runtime, addr); }
- @Override public void push(JObjCRuntime runtime, long addr, Long x) { push(runtime, addr, (long) x); }
- }
-
- public static final class PointerCoder extends Coder {
- public static final PointerCoder INST = new PointerCoder();
- public PointerCoder(){ super(FFI_PTR, "^?", Pointer.class); }
- @Override public int sizeof(Width w) { return PrimitivePointerCoder.INST.sizeof(w); }
-
- @Override public Pointer pop(JObjCRuntime runtime, long addr) {
- return new Pointer(PrimitivePointerCoder.INST.popPtr(runtime, addr));
- }
- @Override public void push(JObjCRuntime runtime, long addr, Pointer x) {
- PrimitivePointerCoder.INST.push(runtime, addr, x == null ? 0 : x.ptr);
- }
- }
-
- public static final class SELCoder extends Coder {
- public static final SELCoder INST = new SELCoder();
- public SELCoder(){ super(FFI_PTR, ":", SEL.class); }
- @Override public int sizeof(Width w) { return PrimitivePointerCoder.INST.sizeof(w); }
-
- @Override public void push(JObjCRuntime runtime, long addr, SEL x) {
- PrimitivePointerCoder.INST.push(runtime, addr, x == null ? 0 : x.selPtr);
- }
- @Override public SEL pop(JObjCRuntime runtime, long addr) {
- return new SEL(PrimitivePointerCoder.INST.popPtr(runtime, addr));
- }
- }
-
- public static abstract class StructCoder extends Coder {
- private final FFIType ffiType;
- final int sizeof;
-
- public StructCoder(final int sizeof, final Coder... elementCoders){
- super(-1, objCEncoding(elementCoders), null);
- this.ffiType = new FFIType(elementCoders);
- this.sizeof = sizeof;
- }
-
- @Override public int sizeof(Width w) { return sizeof; }
-
- private static String objCEncoding(final Coder[] elementCoders) {
- StringWriter str = new StringWriter();
- str.append("{?=");
- for(Coder c : elementCoders)
- str.append(c.getObjCEncoding());
- str.append("}");
- return str.toString();
- }
-
- @Override long getFFITypePtr() { return ffiType.getPtr(); }
-
- @Override public void push(NativeArgumentBuffer argBuf, Struct x) {
- // Just point to the instance on the heap instead of copying it onto the arg buf.
- argBuf.doPutArgPtr(x.raw.bufferPtr);
- }
-
- @Override public void push(JObjCRuntime rt, long addr, Struct x) {
- rt.unsafe.copyMemory(x.raw.bufferPtr, addr, sizeof);
- }
-
- protected abstract Struct newInstance(JObjCRuntime runtime);
-
- @Override public Struct pop(final JObjCRuntime runtime, final long addr) {
- Struct s = newInstance(runtime);
- runtime.unsafe.copyMemory(addr, s.raw.bufferPtr, sizeof);
- return s;
- }
- }
-
- public static final class IDCoder extends Coder{
- public static final IDCoder INST = new IDCoder();
- public IDCoder(){ super(FFI_PTR, "@", ID.class); }
- @Override public int sizeof(Width w) { return PrimitivePointerCoder.INST.sizeof(w); }
-
- public T newID(final JObjCRuntime runtime, final long objPtr) {
- return (T) ID.getObjCObjectFor(runtime, objPtr);
- }
-
- @Override public ID pop(final JObjCRuntime runtime, final long addr) {
- return newID(runtime, PrimitivePointerCoder.INST.popPtr(runtime, addr));
- }
-
- @Override public void push(final JObjCRuntime runtime, final long addr, final ID x) {
- PointerCoder.INST.push(runtime, addr, x);
- }
- }
-
- public static final class NSClassCoder extends Coder{
- public static final NSClassCoder INST = new NSClassCoder();
- public NSClassCoder(){ super(FFI_PTR, "#", NSClass.class); }
- @Override public int sizeof(Width w) { return PrimitivePointerCoder.INST.sizeof(w); }
-
- @Override public NSClass pop(JObjCRuntime runtime, long addr) {
- final long clsPtr = PrimitivePointerCoder.INST.popPtr(runtime, addr);
- if (clsPtr == 0) return null;
- return NSClass.getObjCClassFor(runtime, clsPtr);
- }
- @Override public void push(JObjCRuntime runtime, long addr, NSClass x) {
- PointerCoder.INST.push(runtime, addr, x);
- }
- }
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/FFIType.java b/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/FFIType.java
deleted file mode 100644
index dcff0035587..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/FFIType.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.jobjc;
-
-import com.apple.jobjc.Coder.PrimitivePointerCoder;
-
-
-class FFIType{
- private static native void makeFFIType(long ffi_type_buf, long elements_buf);
- private static native int getFFITypeSizeof();
- private static int FFI_TYPE_SIZEOF = getFFITypeSizeof();
- final NativeBuffer ffi_type;
- final NativeBuffer elements;
- final Coder[] elementCoders;
-
- public FFIType(final Coder... elementCoders){
- final JObjCRuntime runtime = JObjCRuntime.inst();
- this.elementCoders = elementCoders;
- this.ffi_type = new NativeBuffer(FFI_TYPE_SIZEOF);
- this.elements = new NativeBuffer(JObjCRuntime.PTR_LEN * (elementCoders.length + 1));
-
- long elIterPtr = elements.bufferPtr;
- for(Coder c : elementCoders){
- PrimitivePointerCoder.INST.push(runtime, elIterPtr, c.getFFITypePtr());
- elIterPtr += PrimitivePointerCoder.INST.sizeof();
- }
- PrimitivePointerCoder.INST.push(runtime, elIterPtr, 0);
-
- makeFFIType(ffi_type.bufferPtr, elements.bufferPtr);
- }
-
- public long getPtr(){
- return ffi_type.bufferPtr;
- }
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Function.java b/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Function.java
deleted file mode 100644
index 413d8fafe76..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Function.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.jobjc;
-
-
-public class Function {
- private static native long getFxnPtrForFunctionName(final String functionName);
- private static native long getFxnPtrForFunctionNameAndLib(final long libPtr, final String functionName);
-
- final long fxnPtr;
-
- Function(final long fxnPtr) {
- this.fxnPtr = fxnPtr;
- }
-
- public Function(final String name) {
- this(getFxnPtr(name));
- }
-
- public Function(final MacOSXFramework framework, final String name) {
- this(getFxnPtr(name, framework));
- }
-
- static long getFxnPtr(final String name){
- long fxnPtr = getFxnPtrForFunctionName(name);
- if(fxnPtr == 0) throw new RuntimeException("Function pointer for " + name + " not found in runtime.");
- return fxnPtr;
- }
-
- static long getFxnPtr(final String name, final MacOSXFramework framework){
- long fxnPtr = 0;
- for(int i = 0; fxnPtr == 0 && i < framework.nativeLibPtrs.length; i++){
- fxnPtr = getFxnPtrForFunctionNameAndLib(framework.nativeLibPtrs[i], name);
- if(fxnPtr != 0) return fxnPtr;
- }
- throw new RuntimeException("Function pointer for " + name + " not found in framework " + framework + ".");
- }
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/ID.java b/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/ID.java
deleted file mode 100644
index aa202cf0943..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/ID.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.jobjc;
-
-import java.lang.ref.WeakReference;
-import java.lang.reflect.Constructor;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-
-public class ID extends Pointer{
- static native String getNativeDescription(final long objPtr);
-
- final JObjCRuntime runtime;
-
- static final Class[] CTOR_ARGS = { long.class, JObjCRuntime.class };
- protected ID(final long objPtr, final JObjCRuntime runtime) {
- super(objPtr);
- runtime.assertOK();
- this.runtime = runtime;
- }
-
- protected ID(final ID obj, final JObjCRuntime runtime) {
- this(obj.ptr, runtime);
- }
-
- @Override protected NativeObjectLifecycleManager getNativeObjectLifecycleManager() {
- return NativeObjectLifecycleManager.CFRetainRelease.INST;
- }
-
- protected final JObjCRuntime getRuntime() { return runtime; }
-
- @Override public String toString(){
- String s = super.toString();
- return s + " (ObjC: " + ptr + " / " + Long.toHexString(ptr) + ")";
- }
-
- //
-
- public static T getInstance(final long ptr, final JObjCRuntime runtime){
- return (T) getObjCObjectFor(runtime, ptr);
- }
-
- static T getObjCObjectFor(final JObjCRuntime runtime, final long objPtr){
- if (objPtr == 0) return null;
-
- final WeakReference cachedObj = objectCache.get().get(objPtr);
- if(cachedObj != null && cachedObj.get() != null) return (T) cachedObj.get();
-
- final long clsPtr = NSClass.getClass(objPtr);
-
- final T newObj = (T) (runtime.subclassing.isUserClass(clsPtr) ?
- Subclassing.getJObjectFromIVar(objPtr)
- : createNewObjCObjectFor(runtime, objPtr, clsPtr));
-
- objectCache.get().put(objPtr, new WeakReference(newObj));
- return newObj;
- }
-
- static T createNewObjCObjectFor(final JObjCRuntime runtime, final long objPtr, final long clsPtr) {
- final Constructor ctor = getConstructorForClassPtr(runtime, clsPtr);
- return (T) createNewObjCObjectForConstructor(ctor, objPtr, runtime);
- }
-
- @SuppressWarnings("unchecked")
- static Constructor getConstructorForClassPtr(final JObjCRuntime runtime, final long clazzPtr){
- final Constructor cachedCtor = (Constructor) constructorCache.get().get(clazzPtr);
- if(cachedCtor != null) return cachedCtor;
-
- final Class clazz = getClassForClassPtr(runtime, clazzPtr);
- Constructor ctor;
- try {
- ctor = clazz.getDeclaredConstructor(CTOR_ARGS);
- } catch (SecurityException e) {
- throw new RuntimeException(e);
- } catch (NoSuchMethodException e) {
- throw new RuntimeException(e);
- }
- ctor.setAccessible(true);
- constructorCache.get().put(clazzPtr, (Constructor) ctor);
- return ctor;
- }
-
- @SuppressWarnings("unchecked")
- static Class getClassForClassPtr(final JObjCRuntime runtime, final long clazzPtr){
- final String className = NSClass.getClassNameOfClass(clazzPtr);
- final Class clazz = (Class) runtime.getClassForNativeClassName(className);
- if(clazz == null){
- final long superClazzPtr = NSClass.getSuperClassOfClass(clazzPtr);
- if(superClazzPtr != 0)
- return getClassForClassPtr(runtime, superClazzPtr);
- }
- return clazz;
- }
-
- static T createNewObjCObjectForConstructor(final Constructor ctor, final long objPtr, final JObjCRuntime runtime) {
- try {
- final T newInstance = (T) ctor.newInstance(new Object[] { Long.valueOf(objPtr), runtime });
- objectCache.get().put(objPtr, new WeakReference(newInstance));
- return newInstance;
- } catch (final Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- static T createNewObjCObjectForClass(final Class clazz, final long objPtr, final JObjCRuntime runtime) {
- try {
- final Constructor constructor = clazz.getDeclaredConstructor(CTOR_ARGS);
- constructor.setAccessible(true);
- return (T) createNewObjCObjectForConstructor(constructor, objPtr, runtime);
- } catch (final Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- //
-
- static final ThreadLocal> constructorCache = new ThreadLocal>(){
- @Override protected LinkedHashMap initialValue(){
- final int MAX_ENTRIES = 1000;
- final float LOAD_FACTOR = 0.75f;
- return new LinkedHashMap((int) (MAX_ENTRIES/LOAD_FACTOR), LOAD_FACTOR, true) {
- @Override protected boolean removeEldestEntry(Map.Entry eldest) {
- return size() > MAX_ENTRIES;
- }
- };
- }
- };
-
- static final ThreadLocal> objectCache = new ThreadLocal>(){
- @Override protected LinkedHashMap initialValue(){
- final int MAX_ENTRIES = 1000;
- final float LOAD_FACTOR = 0.75f;
- return new LinkedHashMap((int) (MAX_ENTRIES/LOAD_FACTOR), LOAD_FACTOR, true) {
- @Override protected boolean removeEldestEntry(Map.Entry eldest) {
- return size() > MAX_ENTRIES || eldest.getValue().get() == null;
- }
- };
- }
- };
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Invoke.java b/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Invoke.java
deleted file mode 100644
index 48ffc98663f..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Invoke.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.jobjc;
-
-import com.apple.jobjc.Coder.IDCoder;
-import com.apple.jobjc.Coder.NSClassCoder;
-import com.apple.jobjc.Coder.PrimitivePointerCoder;
-import com.apple.jobjc.Coder.SELCoder;
-import com.apple.jobjc.Coder.StructCoder;
-
-
-public abstract class Invoke {
- public abstract void invoke(NativeArgumentBuffer argBuf);
- public abstract void invoke(NativeArgumentBuffer buffer, Struct retvalStruct);
-
- //
-
- public static final class FunCall extends Invoke{
- static native void invoke(long cifPtr, long fxnPtr, long retValPtr, long argsPtr);
-
- final long fxnPtr;
- final CIF cif;
-
- FunCall(long fxnPtr, CIF cif) {
- this.fxnPtr = fxnPtr;
- this.cif = cif;
- }
-
- public FunCall(final JObjCRuntime runtime, final String name, final Coder returnCoder, final Coder ... argCoders) {
- this(Function.getFxnPtr(name), CIF.createCIFFor(runtime.getThreadLocalState(), returnCoder, argCoders));
- }
-
- public FunCall(final MacOSXFramework framework, final String name, final Coder returnCoder, final Coder ... argCoders) {
- this(Function.getFxnPtr(name, framework), CIF.createCIFFor(framework.getRuntime().getThreadLocalState(), returnCoder, argCoders));
- }
-
- public void init(final NativeArgumentBuffer argBuf) {
- argBuf.reset();
- }
-
- @Override public void invoke(final NativeArgumentBuffer argBuf) {
- invoke(argBuf, argBuf.retValPtr);
- }
-
- @Override public void invoke(final NativeArgumentBuffer buffer, final Struct retvalStruct) {
- invoke(buffer, retvalStruct.raw.bufferPtr);
- }
-
- void invoke(final NativeArgumentBuffer argBuf, final long retValPtr) {
- invoke(cif.cif.bufferPtr, fxnPtr, retValPtr, argBuf.buffer.bufferPtr);
- }
- }
-
- public static final class MsgSend extends Invoke{
- static{ System.load("/usr/lib/libobjc.dylib"); }
-
- private static final long OBJC_MSG_SEND_FXN_PTR = new Function("objc_msgSend").fxnPtr;
- private static final long OBJC_MSG_SEND_FPRET_FXN_PTR = new Function("objc_msgSend_fpret").fxnPtr;
- private static final long OBJC_MSG_SEND_STRET_FXN_PTR = new Function("objc_msgSend_stret").fxnPtr;
-
- final FunCall funCall;
- final long selPtr;
-
- public MsgSend(final JObjCRuntime runtime, final String name, final Coder returnCoder, final Coder ... argCoders) {
- this.funCall = new FunCall(getMsgSendFxnPtr(returnCoder),
- CIF.createCIFFor(runtime.getThreadLocalState(), returnCoder, getSelCoders(argCoders)));
- this.selPtr = SEL.getSelectorPtr(name);
- }
-
- public void init(final NativeArgumentBuffer nativeBuffer, final ID obj) {
- funCall.init(nativeBuffer);
- IDCoder.INST.push(nativeBuffer, obj);
- PrimitivePointerCoder.INST.push(nativeBuffer.runtime, nativeBuffer, selPtr);
- }
-
- @Override public void invoke(final NativeArgumentBuffer argBuf) {
- funCall.invoke(argBuf);
- }
-
- @Override public void invoke(final NativeArgumentBuffer buffer, final Struct retvalStruct) {
- funCall.invoke(buffer, retvalStruct);
- }
-
- // support
-
- static Coder[] getSelCoders(final Coder[] argCoders) {
- final Coder[] selArgCoders = new Coder[argCoders.length + 2];
- selArgCoders[0] = IDCoder.INST;
- selArgCoders[1] = SELCoder.INST;
- for (int i = 0; i < argCoders.length; i++)
- selArgCoders[i + 2] = argCoders[i];
- return selArgCoders;
- }
-
- static long getMsgSendFxnPtr(final Coder returnCoder) {
- if(returnCoder instanceof StructCoder){
- StructCoder scoder = (StructCoder) returnCoder;
-
- switch(JObjCRuntime.ARCH){
- case ppc:
- return OBJC_MSG_SEND_STRET_FXN_PTR;
- case i386:
- switch(scoder.sizeof){
- case 1: case 2: case 4: case 8:
- return OBJC_MSG_SEND_FXN_PTR;
- }
- return OBJC_MSG_SEND_STRET_FXN_PTR;
- case x86_64:
- if(scoder.sizeof > 16)
- return OBJC_MSG_SEND_STRET_FXN_PTR;
- else
- return OBJC_MSG_SEND_FXN_PTR;
- default:
- throw new RuntimeException();
- }
- }
-
- final int typeCode = returnCoder.getTypeCode();
-
- switch(JObjCRuntime.ARCH){
- case ppc:
- return OBJC_MSG_SEND_FXN_PTR;
- case i386:
- switch(typeCode) {
- case Coder.FFI_FLOAT: case Coder.FFI_DOUBLE: case Coder.FFI_LONGDOUBLE:
- return OBJC_MSG_SEND_FPRET_FXN_PTR;
- }
- return OBJC_MSG_SEND_FXN_PTR;
- case x86_64:
- if(typeCode == Coder.FFI_LONGDOUBLE)
- return OBJC_MSG_SEND_FPRET_FXN_PTR;
- return OBJC_MSG_SEND_FXN_PTR;
- default:
- throw new RuntimeException();
- }
- }
- }
-
- public static final class MsgSendSuper extends Invoke{
- static{ System.load("/usr/lib/libobjc.dylib"); }
-
- private static final long OBJC_MSG_SEND_SUPER_FXN_PTR = new Function("objc_msgSendSuper").fxnPtr;
- private static final long OBJC_MSG_SEND_SUPER_STRET_FXN_PTR = new Function("objc_msgSendSuper_stret").fxnPtr;
-
- final FunCall funCall;
- final long selPtr;
-
- public MsgSendSuper(final JObjCRuntime runtime, final String name, final Coder returnCoder, final Coder ... argCoders) {
- this.funCall = new FunCall(getMsgSendSuperFxnPtr(returnCoder),
- CIF.createCIFFor(runtime.getThreadLocalState(), returnCoder, getSuperSelCoders(argCoders)));
- this.selPtr = SEL.getSelectorPtr(name);
- }
-
- public void init(final NativeArgumentBuffer argBuf, final ID obj, final NSClass cls) {
- funCall.init(argBuf);
-
- // Instead of mallocing a struct, or keeping another thread local,
- // let's write objc_super out to the argbuf, and then point an argument
- // to the data.
-
- final long valPtr = argBuf.argValuesPtr;
- final int ptrLen = JObjCRuntime.PTR_LEN;
-
- IDCoder .INST.push(argBuf.runtime, valPtr, obj);
- NSClassCoder.INST.push(argBuf.runtime, valPtr + ptrLen, cls);
- argBuf.argValuesPtr += ptrLen + ptrLen;
-
- PrimitivePointerCoder.INST.push(argBuf.runtime, argBuf, valPtr);
- PrimitivePointerCoder.INST.push(argBuf.runtime, argBuf, selPtr);
- }
-
- @Override public void invoke(final NativeArgumentBuffer argBuf) {
- funCall.invoke(argBuf);
- }
-
- @Override public void invoke(final NativeArgumentBuffer buffer, final Struct retvalStruct) {
- funCall.invoke(buffer, retvalStruct);
- }
-
- //
-
- private final static StructCoder objc_super_coder = new StructCoder(JObjCRuntime.PTR_LEN*2, IDCoder.INST, NSClassCoder.INST){
- @Override protected Struct newInstance(JObjCRuntime runtime) { return null; }};
-
- static Coder[] getSuperSelCoders(final Coder[] argCoders) {
- final Coder[] selArgCoders = new Coder[argCoders.length + 2];
- selArgCoders[0] = objc_super_coder;
- selArgCoders[1] = SELCoder.INST;
- for (int i = 0; i < argCoders.length; i++)
- selArgCoders[i + 2] = argCoders[i];
- return selArgCoders;
- }
-
- static long getMsgSendSuperFxnPtr(final Coder returnCoder){
- long normal = MsgSend.getMsgSendFxnPtr(returnCoder);
- if(normal == MsgSend.OBJC_MSG_SEND_STRET_FXN_PTR)
- return OBJC_MSG_SEND_SUPER_STRET_FXN_PTR;
- else
- return OBJC_MSG_SEND_SUPER_FXN_PTR;
- }
- }
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/JObjCRuntime.java b/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/JObjCRuntime.java
deleted file mode 100644
index 5bc01bc4e97..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/JObjCRuntime.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.jobjc;
-
-import java.lang.reflect.Field;
-import java.nio.ByteOrder;
-import java.util.ArrayList;
-import java.util.List;
-
-import sun.misc.Unsafe;
-
-
-public final class JObjCRuntime {
- static { System.loadLibrary("JObjC"); }
-
- public static enum Arch{ ppc, i386, x86_64 };
- public static enum Width{ W32, W64 };
-
- public static final Arch ARCH = getArch();
- public static final Width WIDTH = getWidth();
-
- private static Arch getArch(){
- String arch = System.getProperty("os.arch");
- if("ppc".equals(arch)) return Arch.ppc;
- if("i386".equals(arch)) return Arch.i386;
- if("x86_64".equals(arch)) return Arch.x86_64;
- if("amd64".equals(arch)) return Arch.x86_64;
- if("universal".equals(arch)) return Arch.x86_64;
- throw new RuntimeException("Did not recognize os.arch system property: '" + arch + "'");
- }
-
- private static Width getWidth(){
- String width = System.getProperty("sun.arch.data.model");
- if("32".equals(width)) return Width.W32;
- if("64".equals(width)) return Width.W64;
- throw new RuntimeException("Did not recognize sun.arch.data.model system property: '" + width + "'");
- }
-
- public static final boolean IS32 = System.getProperty("sun.arch.data.model").equals("32");
- public static final boolean IS64 = System.getProperty("sun.arch.data.model").equals("64");
- public static final int PTR_LEN = IS64 ? 8 : 4;
- public static final boolean IS_BIG_ENDIAN = ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN;
- static final boolean DEBUG = Boolean.parseBoolean(System.getProperty("JObjC.debug"));
-
- static void checkPermission(){
- final SecurityManager security = System.getSecurityManager();
- if (security != null) security.checkPermission(new RuntimePermission("canProcessApplicationEvents"));
- }
-
- public final void assertOK(){
- if(this != instance)
- throw new SecurityException("runtime");
- }
-
- private JObjCRuntime(){}
-
- private static JObjCRuntime instance;
- static JObjCRuntime inst() {
- if (instance == null) instance = new JObjCRuntime();
- return instance;
- }
-
- public static JObjCRuntime getInstance() {
- checkPermission();
- return inst();
- }
-
- public final NativeArgumentBuffer getThreadLocalState() {
- return NativeArgumentBuffer.getThreadLocalBuffer(this);
- }
-
- final Unsafe unsafe = getUnsafe();
- final Subclassing subclassing = new Subclassing(this);
- final List registeredPackages = new ArrayList();
-
- @SuppressWarnings("unchecked")
- Class extends ID> getClassForNativeClassName(final String className) {
- for (final String pkg : registeredPackages) {
- try {
- final Class> clazz = Class.forName(pkg + "." + className);
- if (clazz != null) return (Class extends ID>)clazz;
- } catch (final ClassNotFoundException e) { }
- }
-
- return null;
- }
-
- private final static Unsafe getUnsafe() {
- Unsafe inst = null;
- try {
- Field f = Unsafe.class.getDeclaredField("theUnsafe");
- f.setAccessible(true);
- inst = (Unsafe) f.get(null);
- if(inst == null) throw new NullPointerException("Unsafe.theUnsafe == null");
- } catch (Exception e) {
- throw new RuntimeException("Unable to get instance of Unsafe.", e);
- }
- return inst;
- }
-
- public void registerPackage(final String pkg) {
- registeredPackages.add(pkg);
- }
-
- /**
- * Register a subclass of NSObject to allow the native side to send
- * messages which in turn call java methods declared on the class.
- * If a native class by the same name already exists, registerClass
- * will simply return without doing anything.
- *
- * For a usage example, see the SubclassingTest.
- */
- public boolean registerUserClass(Class extends ID> clazz, Class extends NSClass> clazzClazz) {
- return subclassing.registerUserClass(clazz, clazzClazz);
- }
-
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/MacOSXFramework.java b/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/MacOSXFramework.java
deleted file mode 100644
index bd776688f7d..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/MacOSXFramework.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.jobjc;
-
-
-
-public class MacOSXFramework {
- private static native long retainFramework(final String frameworkName);
- private static native void releaseFramework(final long frameworkPtr);
- private static native void getConstant(final long frameworkPtr, String symbol, final long bufferPtr, final int size);
-
- private final JObjCRuntime runtime;
- protected final long[] nativeLibPtrs;
-
- final long getFrameworkPtr() { return nativeLibPtrs.length > 0 ? nativeLibPtrs[0] : 0; }
-
- private static long[] createFrameworkPtrsFromPaths(final String[] frameworkLibPaths) {
- final long[] libPtrs = new long[frameworkLibPaths.length];
- for(int i = 0; i < libPtrs.length; i++){
- libPtrs[i] = retainFramework(frameworkLibPaths[i]);
- if(libPtrs[i] == 0) throw new RuntimeException("Could not open library at " + frameworkLibPaths[i]);
- }
- return libPtrs;
- }
-
- protected MacOSXFramework(final JObjCRuntime runtime, final String[] nativeLibPaths) {
- runtime.assertOK();
- this.runtime = runtime;
- this.nativeLibPtrs = createFrameworkPtrsFromPaths(nativeLibPaths);
- }
-
- @Override protected final synchronized void finalize() throws Throwable {
- for(long lib : nativeLibPtrs)
- if(lib != 0) releaseFramework(lib);
- }
-
- protected final JObjCRuntime getRuntime(){ return runtime; }
-
- protected void getConstant(final String symbol, final long retValPtr, final int size){
- assert size >= 0;
- assert retValPtr != 0;
- getConstant(getFrameworkPtr(), symbol, retValPtr, size);
- }
-
- protected void getConstant(final String symbol, final NativeArgumentBuffer out, final int size){
- getConstant(symbol, out.retValPtr, size);
- }
-
- protected void getConstant(final String symbol, final Struct out, final int size){
- getConstant(symbol, out.raw.bufferPtr, size);
- }
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NSClass.java b/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NSClass.java
deleted file mode 100644
index dfda99acf35..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NSClass.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.jobjc;
-
-import java.lang.ref.WeakReference;
-import java.lang.reflect.Constructor;
-
-
-public class NSClass extends ID {
- public static class NSClassNotFoundException extends RuntimeException{
- public NSClassNotFoundException(String m){ super(m); }
- public NSClassNotFoundException(String m, Throwable cause){ super(m, cause); }
- }
-
- static native long getNativeClassByName(String name);
- static native long getSuperClassOfClass(long classPtr);
- static native String getClassNameOfClass(long classPtr);
- static native long getClass(long objPtr);
-
- public NSClass(final long ptr, final JObjCRuntime runtime) {
- super(ptr, runtime);
- }
-
- public NSClass(final String name, final JObjCRuntime runtime) {
- this(getNativeClassByName(name), runtime);
- if(ptr == 0) throw new NSClassNotFoundException("NSClass pointer is 0. Found no class named " + name);
- }
-
- protected NSClass(final JObjCRuntime runtime){
- super(0, runtime);
- final String sn = getClass().getSimpleName();
- final String name = sn.substring(0, sn.lastIndexOf("Class"));
- ptr = getNativeClassByName(name);
- if(ptr == 0) throw new NSClassNotFoundException("NSClass pointer is 0. Found no class named " + name);
- }
-
- NSClass super T> getSuperClass() {
- return new NSClass(getSuperClassOfClass(ptr), runtime);
- }
-
- String getClassName() { return getClassNameOfClass(ptr); }
-
- @Override protected NativeObjectLifecycleManager getNativeObjectLifecycleManager() {
- return NativeObjectLifecycleManager.Nothing.INST;
- }
-
- @Override public boolean equals(Object o){
- return (o instanceof NSClass) && (this.ptr == ((NSClass) o).ptr);
- }
-
- //
-
- static T getObjCClassFor(final JObjCRuntime runtime, final long clsPtr){
- if (clsPtr == 0) return null;
-
- final WeakReference cachedObj = objectCache.get().get(clsPtr);
- if(cachedObj != null && cachedObj.get() != null) return (T) cachedObj.get();
-
- final T newObj = (T) createNewObjCClassFor(runtime, clsPtr);
- objectCache.get().put(clsPtr, new WeakReference(newObj));
- return newObj;
- }
-
- static T createNewObjCClassFor(final JObjCRuntime runtime, final long clsPtr) {
- final Constructor ctor = getNSClassConstructorForClassPtr(runtime, clsPtr);
- return (T) createNewObjCObjectForConstructor(ctor, clsPtr, runtime);
- }
-
- @SuppressWarnings("unchecked")
- static Constructor getNSClassConstructorForClassPtr(final JObjCRuntime runtime, final long clazzPtr){
- final Class clazz = getNSClassForClassPtr(runtime, clazzPtr);
- Constructor ctor;
- try {
- ctor = clazz.getDeclaredConstructor(CTOR_ARGS);
- } catch (SecurityException e) {
- throw new RuntimeException(e);
- } catch (NoSuchMethodException e) {
- throw new RuntimeException(e);
- }
- ctor.setAccessible(true);
- return ctor;
- }
-
- @SuppressWarnings("unchecked")
- static Class getNSClassForClassPtr(final JObjCRuntime runtime, final long clazzPtr){
- final String className = NSClass.getClassNameOfClass(clazzPtr);
- final Class clazz = (Class) runtime.getClassForNativeClassName(className + "Class");
- if(clazz == null){
- final long superClazzPtr = NSClass.getSuperClassOfClass(clazzPtr);
- if(superClazzPtr != 0)
- return getNSClassForClassPtr(runtime, superClazzPtr);
- }
- return clazz;
- }
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NativeArgumentBuffer.java b/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NativeArgumentBuffer.java
deleted file mode 100644
index 7f8949a2b40..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NativeArgumentBuffer.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.jobjc;
-
-import java.nio.ByteOrder;
-
-import com.apple.jobjc.Coder.PrimitivePointerCoder;
-
-
-public final class NativeArgumentBuffer{
- private static final ThreadLocal threadLocal = new ThreadLocal();
-
- static NativeArgumentBuffer getThreadLocalBuffer(final JObjCRuntime runtime) {
- runtime.assertOK();
- final NativeArgumentBuffer alreadyCreated = threadLocal.get();
- if (alreadyCreated != null) return alreadyCreated;
-
- final NativeArgumentBuffer newThreadLocalState = new NativeArgumentBuffer(runtime);
- threadLocal.set(newThreadLocalState);
- return newThreadLocalState;
- }
-
- final JObjCRuntime runtime;
-
- final NativeBuffer buffer;
-
- long argPtrsPtr;
- long argValuesPtr;
- final long retValPtr;
-
- private static final int MAX_ARGS = 512;
- private static final int BUF_SIZE = MAX_ARGS * 8 * 2;
- private static final int ARG_VALS_OFFSET = BUF_SIZE/2;
-
- private NativeArgumentBuffer(final JObjCRuntime runtime) {
- runtime.assertOK();
- this.runtime = runtime;
- this.buffer = new NativeBuffer(BUF_SIZE);
- this.buffer.buffer.order(ByteOrder.nativeOrder());
-
- reset();
- this.retValPtr = buffer.bufferPtr;
- }
-
-
- // Call before each new call
- public void reset() {
- argPtrsPtr = buffer.bufferPtr;
- argValuesPtr = buffer.bufferPtr + ARG_VALS_OFFSET;
- assert buffer.ptrInBounds(argValuesPtr);
- }
-
- // Push a pointer to a block of memory
- public void doPutArgPtr(long ptr) {
- assert buffer.ptrInBounds(argPtrsPtr);
- PrimitivePointerCoder.INST.push(runtime, argPtrsPtr, ptr);
- argPtrsPtr += JObjCRuntime.PTR_LEN;
- }
-
- // Call this after having written a value of size `sizeof` to `argValuesPtr`.
- public void didPutArgValue(int sizeof) {
- assert buffer.ptrInBounds(argValuesPtr);
- doPutArgPtr(argValuesPtr);
- argValuesPtr += sizeof;
- }
-
-
- @Override public String toString() {
- final StringBuilder builder = new StringBuilder();
- final long bptr = buffer.bufferPtr;
-
- for(long i = bptr; i < bptr + ARG_VALS_OFFSET; i += JObjCRuntime.PTR_LEN){
- if(argPtrsPtr == i)
- builder.append("*");
- builder.append(PrimitivePointerCoder.INST.popPtr(JObjCRuntime.inst(), i));
- builder.append(" ");
- }
-
- builder.append("\n");
-
- for(long i = bptr + ARG_VALS_OFFSET; i < bptr + BUF_SIZE; i += JObjCRuntime.PTR_LEN){
- if(argValuesPtr == i)
- builder.append("*");
- builder.append(PrimitivePointerCoder.INST.popPtr(JObjCRuntime.inst(), i));
- builder.append(" ");
- }
-
- return builder.toString();
- }
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NativeBuffer.java b/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NativeBuffer.java
deleted file mode 100644
index 8630971c206..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NativeBuffer.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.jobjc;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-
-/**
- * A wrapper around a direct ByteBuffer and its native pointer. For documentation, @see java.nio.ByteBuffer
- */
-public class NativeBuffer {
- static native long getPtrOfBuffer(final ByteBuffer byteBuffer);
-
- public final ByteBuffer buffer;
- public final long bufferPtr;
-
- public NativeBuffer(final int capacity){
- this(ByteBuffer.allocateDirect(capacity));
- }
-
- /**
- * Wrap a ByteBuffer and set the ByteOrder to nativeOrder.
- */
- public NativeBuffer(ByteBuffer buffer){
- this.buffer = buffer;
- this.bufferPtr = getPtrOfBuffer(buffer);
- assert buffer != null;
- assert bufferPtr != 0;
- this.buffer.order(ByteOrder.nativeOrder());
- }
-
- public byte get() { return buffer.get(); }
- public char getChar() { return buffer.getChar(); }
- public double getDouble() { return buffer.getDouble(); }
- public float getFloat() { return buffer.getFloat(); }
- public int getInt() { return buffer.getInt(); }
- public long getLong() { return buffer.getLong(); }
- public short getShort() { return buffer.getShort(); }
- public NativeBuffer put(byte b) { buffer.put(b); return this; }
- public NativeBuffer put(NativeBuffer src) { buffer.put(src.buffer); return this; }
- public NativeBuffer putChar(char c) { buffer.putChar(c); return this; }
- public NativeBuffer putDouble(double d) { buffer.putDouble(d); return this; }
- public NativeBuffer putFloat(float f) { buffer.putFloat(f); return this; }
- public NativeBuffer putInt(int i) { buffer.putInt(i); return this; }
- public NativeBuffer putLong(long l) { buffer.putLong(l); return this; }
- public NativeBuffer putShort(short s) { buffer.putShort(s); return this; }
-
- public int capacity() { return buffer.capacity(); }
- public int position() { return buffer.position(); }
- public NativeBuffer position(int newPosition) { buffer.position(newPosition); return this; }
- public NativeBuffer rewind(){ buffer.rewind(); return this; }
-
- public int limit() { return buffer.limit(); }
- public NativeBuffer limit(final int sizeof) { buffer.limit(sizeof); return this; }
-
- public int remaining() { return buffer.remaining(); }
-
- public NativeBuffer slice(){ return new NativeBuffer(buffer.slice()); }
-
- @Override public String toString() {
- final StringBuilder builder = new StringBuilder();
-
- for(int i = 0; i < limit(); i += JObjCRuntime.PTR_LEN){
- if(position() == i)
- builder.append("*");
- if(JObjCRuntime.IS32)
- builder.append(buffer.getInt(i));
- else
- builder.append(buffer.getLong(i));
- builder.append(" ");
- }
-
- return builder.toString();
- }
-
- public long positionPtr() {
- return bufferPtr + position();
- }
-
- /**
- * bufferPtr <= ptr && ptr < bufferPtr + capacity();
- */
- public boolean ptrInBounds(final long ptr){
- return bufferPtr <= ptr && ptr < bufferPtr + capacity();
- }
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NativeObjectLifecycleManager.java b/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NativeObjectLifecycleManager.java
deleted file mode 100644
index 993be3337fe..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NativeObjectLifecycleManager.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.jobjc;
-
-
-public abstract class NativeObjectLifecycleManager {
- private static native void retainNativeObject(final long ptr);
- private static native void releaseNativeObject(final long ptr);
- private static native void freeNativeObject(final long ptr);
-
- abstract void begin(final long ptr);
- abstract void end(final long ptr);
- boolean shouldPreRetain() { return false; }
-
- public static class CFRetainRelease extends NativeObjectLifecycleManager {
- public static final NativeObjectLifecycleManager INST = new CFRetainRelease();
- @Override void begin(final long ptr) { retainNativeObject(ptr); }
- @Override void end(final long ptr) { releaseNativeObject(ptr); }
- @Override boolean shouldPreRetain() { return true; }
- }
-
- public static class Free extends NativeObjectLifecycleManager {
- public static final NativeObjectLifecycleManager INST = new Free();
- @Override void begin(final long ptr) { }
- @Override void end(final long ptr) { freeNativeObject(ptr); }
- }
-
- public static class Nothing extends NativeObjectLifecycleManager {
- public static final NativeObjectLifecycleManager INST = new Nothing();
- @Override void begin(final long ptr) { }
- @Override void end(final long ptr) { }
- }
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Opaque.java b/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Opaque.java
deleted file mode 100644
index fe6684833e0..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Opaque.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.jobjc;
-
-
-public class Opaque extends Pointer {
- protected Opaque(long ptr) { super(ptr); }
- protected Opaque(Pointer> ptr) { super(ptr.ptr); }
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Pointer.java b/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Pointer.java
deleted file mode 100644
index d5b83b93930..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Pointer.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.jobjc;
-
-
-public class Pointer implements Comparable>{
- long ptr;
-
- protected Pointer(final long ptr) {
- this.ptr = ptr;
- getNativeObjectLifecycleManager().begin(ptr);
- }
-
- @Override protected final synchronized void finalize() throws Throwable {
- long pptr = ptr;
- ptr = 0;
- if (pptr != 0) getNativeObjectLifecycleManager().end(pptr);
- }
-
- protected NativeObjectLifecycleManager getNativeObjectLifecycleManager() {
- return NativeObjectLifecycleManager.Nothing.INST;
- }
-
- @Override public boolean equals(Object o) {
- return o instanceof Pointer && ptr == ((Pointer) o).ptr;
- }
-
- @Override public int hashCode() { return (int)(ptr^(ptr>>>32)); }
-
- public int compareTo(Pointer o) {
- if(this==o || ptr==o.ptr) return 0;
- if(ptr < o.ptr) return -1;
- return 1;
- }
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/PrimitiveCoder.java b/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/PrimitiveCoder.java
deleted file mode 100644
index eab34a7e6af..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/PrimitiveCoder.java
+++ /dev/null
@@ -1,700 +0,0 @@
-/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.jobjc;
-import com.apple.jobjc.JObjCRuntime.Width;
-// Auto generated by PrimitiveCoder.hs
-// Do not edit by hand.
-public abstract class PrimitiveCoder extends Coder{
- public PrimitiveCoder(int ffiTypeCode, String objCEncoding, Class jclass, Class jprim){
- super(ffiTypeCode, objCEncoding, jclass, jprim);
- }
- public final boolean popBoolean(NativeArgumentBuffer args){
- return popBoolean(args.runtime, args.retValPtr);
- }
- public abstract boolean popBoolean(JObjCRuntime runtime, long addr);
-
- public final void push(NativeArgumentBuffer args, boolean x){
- push(args.runtime, args.argValuesPtr, x);
- args.didPutArgValue(sizeof());
- }
- public abstract void push(JObjCRuntime runtime, long addr, boolean x);
-
-
- public final byte popByte(NativeArgumentBuffer args){
- return popByte(args.runtime, args.retValPtr);
- }
- public abstract byte popByte(JObjCRuntime runtime, long addr);
-
- public final void push(NativeArgumentBuffer args, byte x){
- push(args.runtime, args.argValuesPtr, x);
- args.didPutArgValue(sizeof());
- }
- public abstract void push(JObjCRuntime runtime, long addr, byte x);
-
-
- public final char popChar(NativeArgumentBuffer args){
- return popChar(args.runtime, args.retValPtr);
- }
- public abstract char popChar(JObjCRuntime runtime, long addr);
-
- public final void push(NativeArgumentBuffer args, char x){
- push(args.runtime, args.argValuesPtr, x);
- args.didPutArgValue(sizeof());
- }
- public abstract void push(JObjCRuntime runtime, long addr, char x);
-
-
- public final short popShort(NativeArgumentBuffer args){
- return popShort(args.runtime, args.retValPtr);
- }
- public abstract short popShort(JObjCRuntime runtime, long addr);
-
- public final void push(NativeArgumentBuffer args, short x){
- push(args.runtime, args.argValuesPtr, x);
- args.didPutArgValue(sizeof());
- }
- public abstract void push(JObjCRuntime runtime, long addr, short x);
-
-
- public final int popInt(NativeArgumentBuffer args){
- return popInt(args.runtime, args.retValPtr);
- }
- public abstract int popInt(JObjCRuntime runtime, long addr);
-
- public final void push(NativeArgumentBuffer args, int x){
- push(args.runtime, args.argValuesPtr, x);
- args.didPutArgValue(sizeof());
- }
- public abstract void push(JObjCRuntime runtime, long addr, int x);
-
-
- public final long popLong(NativeArgumentBuffer args){
- return popLong(args.runtime, args.retValPtr);
- }
- public abstract long popLong(JObjCRuntime runtime, long addr);
-
- public final void push(NativeArgumentBuffer args, long x){
- push(args.runtime, args.argValuesPtr, x);
- args.didPutArgValue(sizeof());
- }
- public abstract void push(JObjCRuntime runtime, long addr, long x);
-
-
- public final float popFloat(NativeArgumentBuffer args){
- return popFloat(args.runtime, args.retValPtr);
- }
- public abstract float popFloat(JObjCRuntime runtime, long addr);
-
- public final void push(NativeArgumentBuffer args, float x){
- push(args.runtime, args.argValuesPtr, x);
- args.didPutArgValue(sizeof());
- }
- public abstract void push(JObjCRuntime runtime, long addr, float x);
-
-
- public final double popDouble(NativeArgumentBuffer args){
- return popDouble(args.runtime, args.retValPtr);
- }
- public abstract double popDouble(JObjCRuntime runtime, long addr);
-
- public final void push(NativeArgumentBuffer args, double x){
- push(args.runtime, args.argValuesPtr, x);
- args.didPutArgValue(sizeof());
- }
- public abstract void push(JObjCRuntime runtime, long addr, double x);
-
-
-// native BOOL -> java boolean
-public static final class BoolCoder extends PrimitiveCoder{
- public static final BoolCoder INST = new BoolCoder();
- public BoolCoder(){ super(FFI_SINT8, "B", Boolean.class, boolean.class); }
- // compile time
- @Override public void push(JObjCRuntime rt, long addr, boolean x){
- rt.unsafe.putByte(addr, (byte) (x ? 1 : 0));
- }
- @Override public boolean popBoolean(JObjCRuntime rt, long addr){
- return rt.unsafe.getByte(addr) != 0;
- }
- // for runtime coding
- @Override public int sizeof(Width w){
- return 1;
- }
- @Override public void push(JObjCRuntime rt, long addr, Boolean x){ push(rt, addr, (boolean) x); }
- @Override public Boolean pop(JObjCRuntime rt, long addr){ return popBoolean(rt, addr); }
- // proxies for mixed encoding
-
- @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, (x != 0)); }
- @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)(popBoolean(rt, addr) ? 1 : 0)); }
-
- @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, (x != 0)); }
- @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)(popBoolean(rt, addr) ? 1 : 0)); }
-
- @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, (x != 0)); }
- @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)(popBoolean(rt, addr) ? 1 : 0)); }
-
- @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, (x != 0)); }
- @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)(popBoolean(rt, addr) ? 1 : 0)); }
-
- @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, (x != 0)); }
- @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)(popBoolean(rt, addr) ? 1 : 0)); }
-
- @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, (x != 0)); }
- @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)(popBoolean(rt, addr) ? 1 : 0)); }
-
- @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, (x != 0)); }
- @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)(popBoolean(rt, addr) ? 1 : 0)); }
-
-
-}
-
-// native schar -> java byte
-public static final class SCharCoder extends PrimitiveCoder{
- public static final SCharCoder INST = new SCharCoder();
- public SCharCoder(){ super(FFI_SINT8, "c", Byte.class, byte.class); }
- // compile time
- @Override public void push(JObjCRuntime rt, long addr, byte x){
- rt.unsafe.putByte(addr, x);
- }
- @Override public byte popByte(JObjCRuntime rt, long addr){
- return rt.unsafe.getByte(addr);
- }
- // for runtime coding
- @Override public int sizeof(Width w){
- return 1;
- }
- @Override public void push(JObjCRuntime rt, long addr, Byte x){ push(rt, addr, (byte) x); }
- @Override public Byte pop(JObjCRuntime rt, long addr){ return popByte(rt, addr); }
- // proxies for mixed encoding
- @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((byte)(x ? 1 : 0))); }
- @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popByte(rt, addr) != 0); }
-
-
- @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((byte)x)); }
- @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popByte(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((byte)x)); }
- @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popByte(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((byte)x)); }
- @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popByte(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((byte)x)); }
- @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popByte(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((byte)x)); }
- @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popByte(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((byte)x)); }
- @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popByte(rt, addr)); }
-
-
-}
-
-// native uchar -> java byte
-public static final class UCharCoder extends PrimitiveCoder{
- public static final UCharCoder INST = new UCharCoder();
- public UCharCoder(){ super(FFI_UINT8, "C", Byte.class, byte.class); }
- // compile time
- @Override public void push(JObjCRuntime rt, long addr, byte x){
- rt.unsafe.putByte(addr, x);
- }
- @Override public byte popByte(JObjCRuntime rt, long addr){
- return rt.unsafe.getByte(addr);
- }
- // for runtime coding
- @Override public int sizeof(Width w){
- return 1;
- }
- @Override public void push(JObjCRuntime rt, long addr, Byte x){ push(rt, addr, (byte) x); }
- @Override public Byte pop(JObjCRuntime rt, long addr){ return popByte(rt, addr); }
- // proxies for mixed encoding
- @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((byte)(x ? 1 : 0))); }
- @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popByte(rt, addr) != 0); }
-
-
- @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((byte)x)); }
- @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popByte(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((byte)x)); }
- @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popByte(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((byte)x)); }
- @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popByte(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((byte)x)); }
- @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popByte(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((byte)x)); }
- @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popByte(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((byte)x)); }
- @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popByte(rt, addr)); }
-
-
-}
-
-// native sshort -> java short
-public static final class SShortCoder extends PrimitiveCoder{
- public static final SShortCoder INST = new SShortCoder();
- public SShortCoder(){ super(FFI_SINT16, "s", Short.class, short.class); }
- // compile time
- @Override public void push(JObjCRuntime rt, long addr, short x){
- rt.unsafe.putShort(addr, (short) x);
- }
- @Override public short popShort(JObjCRuntime rt, long addr){
- return rt.unsafe.getShort(addr);
- }
- // for runtime coding
- @Override public int sizeof(Width w){
- return 2;
- }
- @Override public void push(JObjCRuntime rt, long addr, Short x){ push(rt, addr, (short) x); }
- @Override public Short pop(JObjCRuntime rt, long addr){ return popShort(rt, addr); }
- // proxies for mixed encoding
- @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((short)(x ? 1 : 0))); }
- @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popShort(rt, addr) != 0); }
-
- @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((short)x)); }
- @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popShort(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((short)x)); }
- @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popShort(rt, addr)); }
-
-
- @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((short)x)); }
- @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popShort(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((short)x)); }
- @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popShort(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((short)x)); }
- @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popShort(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((short)x)); }
- @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popShort(rt, addr)); }
-
-
-}
-
-// native ushort -> java short
-public static final class UShortCoder extends PrimitiveCoder{
- public static final UShortCoder INST = new UShortCoder();
- public UShortCoder(){ super(FFI_UINT16, "S", Short.class, short.class); }
- // compile time
- @Override public void push(JObjCRuntime rt, long addr, short x){
- rt.unsafe.putShort(addr, (short) x);
- }
- @Override public short popShort(JObjCRuntime rt, long addr){
- return rt.unsafe.getShort(addr);
- }
- // for runtime coding
- @Override public int sizeof(Width w){
- return 2;
- }
- @Override public void push(JObjCRuntime rt, long addr, Short x){ push(rt, addr, (short) x); }
- @Override public Short pop(JObjCRuntime rt, long addr){ return popShort(rt, addr); }
- // proxies for mixed encoding
- @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((short)(x ? 1 : 0))); }
- @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popShort(rt, addr) != 0); }
-
- @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((short)x)); }
- @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popShort(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((short)x)); }
- @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popShort(rt, addr)); }
-
-
- @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((short)x)); }
- @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popShort(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((short)x)); }
- @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popShort(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((short)x)); }
- @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popShort(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((short)x)); }
- @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popShort(rt, addr)); }
-
-
-}
-
-// native sint -> java int
-public static final class SIntCoder extends PrimitiveCoder{
- public static final SIntCoder INST = new SIntCoder();
- public SIntCoder(){ super(FFI_SINT32, "i", Integer.class, int.class); }
- // compile time
- @Override public void push(JObjCRuntime rt, long addr, int x){
- rt.unsafe.putInt(addr, (int) x);
- }
- @Override public int popInt(JObjCRuntime rt, long addr){
- return rt.unsafe.getInt(addr);
- }
- // for runtime coding
- @Override public int sizeof(Width w){
- return 4;
- }
- @Override public void push(JObjCRuntime rt, long addr, Integer x){ push(rt, addr, (int) x); }
- @Override public Integer pop(JObjCRuntime rt, long addr){ return popInt(rt, addr); }
- // proxies for mixed encoding
- @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((int)(x ? 1 : 0))); }
- @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popInt(rt, addr) != 0); }
-
- @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((int)x)); }
- @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popInt(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((int)x)); }
- @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popInt(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((int)x)); }
- @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popInt(rt, addr)); }
-
-
- @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((int)x)); }
- @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popInt(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((int)x)); }
- @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popInt(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((int)x)); }
- @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popInt(rt, addr)); }
-
-
-}
-
-// native uint -> java int
-public static final class UIntCoder extends PrimitiveCoder{
- public static final UIntCoder INST = new UIntCoder();
- public UIntCoder(){ super(FFI_UINT32, "I", Integer.class, int.class); }
- // compile time
- @Override public void push(JObjCRuntime rt, long addr, int x){
- rt.unsafe.putInt(addr, (int) x);
- }
- @Override public int popInt(JObjCRuntime rt, long addr){
- return rt.unsafe.getInt(addr);
- }
- // for runtime coding
- @Override public int sizeof(Width w){
- return 4;
- }
- @Override public void push(JObjCRuntime rt, long addr, Integer x){ push(rt, addr, (int) x); }
- @Override public Integer pop(JObjCRuntime rt, long addr){ return popInt(rt, addr); }
- // proxies for mixed encoding
- @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((int)(x ? 1 : 0))); }
- @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popInt(rt, addr) != 0); }
-
- @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((int)x)); }
- @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popInt(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((int)x)); }
- @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popInt(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((int)x)); }
- @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popInt(rt, addr)); }
-
-
- @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((int)x)); }
- @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popInt(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((int)x)); }
- @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popInt(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((int)x)); }
- @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popInt(rt, addr)); }
-
-
-}
-
-// native slong -> java long
-public static final class SLongCoder extends PrimitiveCoder{
- public static final SLongCoder INST = new SLongCoder();
- public SLongCoder(){ super((JObjCRuntime.IS64 ? (FFI_SINT64) : (FFI_SINT32)), "l", Long.class, long.class); }
- // compile time
- @Override public void push(JObjCRuntime rt, long addr, long x){
- if(JObjCRuntime.IS64){ rt.unsafe.putLong(addr, (long) x); }else{ rt.unsafe.putInt(addr, (int) x); }
- }
- @Override public long popLong(JObjCRuntime rt, long addr){
- return (JObjCRuntime.IS64 ? (rt.unsafe.getLong(addr)) : (rt.unsafe.getInt(addr)));
- }
- // for runtime coding
- @Override public int sizeof(Width w){
- switch(w){
- case W32: return 4;
- case W64: return 8;
-
- default: return -1;
- }
-
- }
- @Override public void push(JObjCRuntime rt, long addr, Long x){ push(rt, addr, (long) x); }
- @Override public Long pop(JObjCRuntime rt, long addr){ return popLong(rt, addr); }
- // proxies for mixed encoding
- @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((long)(x ? 1 : 0))); }
- @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popLong(rt, addr) != 0); }
-
- @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((long)x)); }
- @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popLong(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((long)x)); }
- @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popLong(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((long)x)); }
- @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popLong(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((long)x)); }
- @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popLong(rt, addr)); }
-
-
- @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((long)x)); }
- @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popLong(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((long)x)); }
- @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popLong(rt, addr)); }
-
-
-}
-
-// native ulong -> java long
-public static final class ULongCoder extends PrimitiveCoder{
- public static final ULongCoder INST = new ULongCoder();
- public ULongCoder(){ super((JObjCRuntime.IS64 ? (FFI_UINT64) : (FFI_UINT32)), "L", Long.class, long.class); }
- // compile time
- @Override public void push(JObjCRuntime rt, long addr, long x){
- if(JObjCRuntime.IS64){ rt.unsafe.putLong(addr, (long) x); }else{ rt.unsafe.putInt(addr, (int) x); }
- }
- @Override public long popLong(JObjCRuntime rt, long addr){
- return (JObjCRuntime.IS64 ? (rt.unsafe.getLong(addr)) : (rt.unsafe.getInt(addr)));
- }
- // for runtime coding
- @Override public int sizeof(Width w){
- switch(w){
- case W32: return 4;
- case W64: return 8;
-
- default: return -1;
- }
-
- }
- @Override public void push(JObjCRuntime rt, long addr, Long x){ push(rt, addr, (long) x); }
- @Override public Long pop(JObjCRuntime rt, long addr){ return popLong(rt, addr); }
- // proxies for mixed encoding
- @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((long)(x ? 1 : 0))); }
- @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popLong(rt, addr) != 0); }
-
- @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((long)x)); }
- @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popLong(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((long)x)); }
- @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popLong(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((long)x)); }
- @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popLong(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((long)x)); }
- @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popLong(rt, addr)); }
-
-
- @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((long)x)); }
- @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popLong(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((long)x)); }
- @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popLong(rt, addr)); }
-
-
-}
-
-// native slonglong -> java long
-public static final class SLongLongCoder extends PrimitiveCoder{
- public static final SLongLongCoder INST = new SLongLongCoder();
- public SLongLongCoder(){ super(FFI_SINT64, "q", Long.class, long.class); }
- // compile time
- @Override public void push(JObjCRuntime rt, long addr, long x){
- rt.unsafe.putLong(addr, (long) x);
- }
- @Override public long popLong(JObjCRuntime rt, long addr){
- return rt.unsafe.getLong(addr);
- }
- // for runtime coding
- @Override public int sizeof(Width w){
- return 8;
- }
- @Override public void push(JObjCRuntime rt, long addr, Long x){ push(rt, addr, (long) x); }
- @Override public Long pop(JObjCRuntime rt, long addr){ return popLong(rt, addr); }
- // proxies for mixed encoding
- @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((long)(x ? 1 : 0))); }
- @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popLong(rt, addr) != 0); }
-
- @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((long)x)); }
- @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popLong(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((long)x)); }
- @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popLong(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((long)x)); }
- @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popLong(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((long)x)); }
- @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popLong(rt, addr)); }
-
-
- @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((long)x)); }
- @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popLong(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((long)x)); }
- @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popLong(rt, addr)); }
-
-
-}
-
-// native ulonglong -> java long
-public static final class ULongLongCoder extends PrimitiveCoder{
- public static final ULongLongCoder INST = new ULongLongCoder();
- public ULongLongCoder(){ super(FFI_UINT64, "Q", Long.class, long.class); }
- // compile time
- @Override public void push(JObjCRuntime rt, long addr, long x){
- rt.unsafe.putLong(addr, (long) x);
- }
- @Override public long popLong(JObjCRuntime rt, long addr){
- return rt.unsafe.getLong(addr);
- }
- // for runtime coding
- @Override public int sizeof(Width w){
- return 8;
- }
- @Override public void push(JObjCRuntime rt, long addr, Long x){ push(rt, addr, (long) x); }
- @Override public Long pop(JObjCRuntime rt, long addr){ return popLong(rt, addr); }
- // proxies for mixed encoding
- @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((long)(x ? 1 : 0))); }
- @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popLong(rt, addr) != 0); }
-
- @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((long)x)); }
- @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popLong(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((long)x)); }
- @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popLong(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((long)x)); }
- @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popLong(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((long)x)); }
- @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popLong(rt, addr)); }
-
-
- @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((long)x)); }
- @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popLong(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((long)x)); }
- @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popLong(rt, addr)); }
-
-
-}
-
-// native float -> java float
-public static final class FloatCoder extends PrimitiveCoder{
- public static final FloatCoder INST = new FloatCoder();
- public FloatCoder(){ super(FFI_FLOAT, "f", Float.class, float.class); }
- // compile time
- @Override public void push(JObjCRuntime rt, long addr, float x){
- rt.unsafe.putFloat(addr, (float) x);
- }
- @Override public float popFloat(JObjCRuntime rt, long addr){
- return rt.unsafe.getFloat(addr);
- }
- // for runtime coding
- @Override public int sizeof(Width w){
- return 4;
- }
- @Override public void push(JObjCRuntime rt, long addr, Float x){ push(rt, addr, (float) x); }
- @Override public Float pop(JObjCRuntime rt, long addr){ return popFloat(rt, addr); }
- // proxies for mixed encoding
- @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((float)(x ? 1 : 0))); }
- @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popFloat(rt, addr) != 0); }
-
- @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((float)x)); }
- @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popFloat(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((float)x)); }
- @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popFloat(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((float)x)); }
- @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popFloat(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((float)x)); }
- @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popFloat(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((float)x)); }
- @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popFloat(rt, addr)); }
-
-
- @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((float)x)); }
- @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popFloat(rt, addr)); }
-
-
-}
-
-// native double -> java double
-public static final class DoubleCoder extends PrimitiveCoder{
- public static final DoubleCoder INST = new DoubleCoder();
- public DoubleCoder(){ super(FFI_DOUBLE, "d", Double.class, double.class); }
- // compile time
- @Override public void push(JObjCRuntime rt, long addr, double x){
- rt.unsafe.putDouble(addr, (double) x);
- }
- @Override public double popDouble(JObjCRuntime rt, long addr){
- return rt.unsafe.getDouble(addr);
- }
- // for runtime coding
- @Override public int sizeof(Width w){
- return 8;
- }
- @Override public void push(JObjCRuntime rt, long addr, Double x){ push(rt, addr, (double) x); }
- @Override public Double pop(JObjCRuntime rt, long addr){ return popDouble(rt, addr); }
- // proxies for mixed encoding
- @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((double)(x ? 1 : 0))); }
- @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popDouble(rt, addr) != 0); }
-
- @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((double)x)); }
- @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popDouble(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((double)x)); }
- @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popDouble(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((double)x)); }
- @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popDouble(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((double)x)); }
- @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popDouble(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((double)x)); }
- @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popDouble(rt, addr)); }
-
- @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((double)x)); }
- @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popDouble(rt, addr)); }
-
-
-
-}
-
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/SEL.java b/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/SEL.java
deleted file mode 100644
index 7e085f8d54d..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/SEL.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.jobjc;
-
-
-public class SEL {
- static native long getSelectorPtr(String selectorName);
- static native String getSelectorName(long ptr);
-
- final long selPtr;
-
- SEL(long ptr) {
- this.selPtr = ptr;
- }
-
- public SEL(final String name) {
- this(getSelectorPtr(name));
- }
-
- @Override public String toString(){
- return ((int)selPtr) + " / " + selPtr + " : " + getSelectorName(selPtr);
- }
-
- /**
- * Converts something like "performSelectorOnMainThread_withObject_wait"
- * to "performSelectorOnMainThread:withObject:wait:"
- */
- public static String selectorName(String jMethodName, boolean hasArgs){
- String b = jMethodName.replaceAll("_", ":");
- return hasArgs ? b + ":" : b;
- }
-
- public static String jMethodName(String selectorName){
- return selectorName.replaceAll(":", "_").replaceAll("_$", "");
- }
-
- public static boolean validName(String selectorName){
- return selectorName.matches("^[a-zA-Z_][a-zA-Z0-9_:]*$");
- }
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Struct.java b/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Struct.java
deleted file mode 100644
index b14e84dcaca..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Struct.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.jobjc;
-
-
-/**
- * A struct is malloced on the C heap and accessed in Java through a ByteBuffer.
- */
-public abstract class Struct{
- protected final NativeBuffer raw;
- private final JObjCRuntime runtime;
- protected final JObjCRuntime getRuntime(){ return runtime; }
-
- /**
- * Create a brand new struct from nothing.
- */
- protected Struct(final JObjCRuntime runtime, final int SIZEOF){
- this(runtime, new NativeBuffer(SIZEOF), SIZEOF);
- }
-
- /**
- * Create a struct by taking ownership of an existing buffer.
- * Used for struct fields of type struct. For example, the origin and size fields
- * in NSRect would be initialized with this constructor.
- */
- protected Struct(final JObjCRuntime runtime, final NativeBuffer buffer, final int SIZEOF){
- if(runtime == null) throw new NullPointerException("runtime");
- this.runtime = runtime;
- this.raw = buffer;
- this.raw.limit(SIZEOF);
- }
-
- abstract public Coder getCoder();
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Subclassing.java b/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Subclassing.java
deleted file mode 100644
index c0e72b13e33..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Subclassing.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.jobjc;
-
-import java.io.StringWriter;
-import java.lang.reflect.Method;
-import java.util.HashSet;
-import java.util.Set;
-
-import com.apple.jobjc.Coder.PrimitivePointerCoder;
-import com.apple.jobjc.Coder.VoidCoder;
-import com.apple.jobjc.Invoke.MsgSend;
-
-
-final class Subclassing {
- static native long allocateClassPair(long superClass, String name);
- static native boolean addIVarForJObj(long clazz);
- static native boolean patchAlloc(long classPtr);
- static native boolean addMethod(long cls, String name, Method jMethod, CIF cif, long cifPtr, String objCEncodedType);
- static native void registerClassPair(long clazz);
-
- static native T getJObjectFromIVar(long objPtr);
- static native void initJObjectToIVar(long objPtr, ID object);
-
- final Set registeredUserSubclasses = new HashSet();
- final JObjCRuntime runtime;
-
- Subclassing(JObjCRuntime runtime){
- this.runtime = runtime;
- }
-
- boolean registerUserClass(final Class extends ID> clazz, final Class extends NSClass> clazzClazz) {
- final String nativeClassName = clazz.getSimpleName();
- // Is it already registered?
- if(0 != NSClass.getNativeClassByName(nativeClassName))
- return false;
-
- if(clazz.isAnonymousClass())
- throw new RuntimeException("JObjC cannot register anonymous classes.");
-
- // Verify superclass
- long superClass = NSClass.getNativeClassByName(clazz.getSuperclass().getSimpleName());
- if(0 == superClass)
- throw new RuntimeException(clazz.getSuperclass() + ", the superclass of " + clazz + ", must be a registered class.");
-
- runtime.registerPackage(clazz.getPackage().getName());
-
- // Create class
- long classPtr = Subclassing.allocateClassPair(superClass, nativeClassName);
- if(classPtr == 0) throw new RuntimeException("objc_allocateClassPair returned 0.");
-
- // Add ivar to hold jobject
- boolean addedI = Subclassing.addIVarForJObj(classPtr);
- if(!addedI) throw new RuntimeException("class_addIvar returned false.");
-
- // Verify constructor
- try {
- clazz.getConstructor(ID.CTOR_ARGS);
- } catch (Exception e) {
- throw new RuntimeException("Could not access required constructor: " + ID.CTOR_ARGS, e);
- }
-
- // Patch alloc to create corresponding jobject on invoke
- patchAlloc(classPtr);
-
- // Add methods
- Set takenSelNames = new HashSet();
- for(Method method : clazz.getDeclaredMethods()){
- // No overloading
- String selName = SEL.selectorName(method.getName(), method.getParameterTypes().length > 0);
- if(takenSelNames.contains(selName))
- throw new RuntimeException("Obj-C does not allow method overloading. The Objective-C selector '"
- + selName + "' appears more than once in class " + clazz.getCanonicalName() + " / " + nativeClassName + ".");
-
- method.setAccessible(true);
-
- // Divine CIF
- Coder returnCoder = Coder.getCoderAtRuntimeForType(method.getReturnType());
- Class[] paramTypes = method.getParameterTypes();
- Coder[] argCoders = new Coder[paramTypes.length];
- for(int i = 0; i < paramTypes.length; i++)
- argCoders[i] = Coder.getCoderAtRuntimeForType(paramTypes[i]);
-
- CIF cif = new MsgSend(runtime, selName, returnCoder, argCoders).funCall.cif;
-
- // .. and objc encoding
- StringWriter encType = new StringWriter();
- encType.append(returnCoder.getObjCEncoding());
- encType.append("@:");
- for(int i = 0; i < argCoders.length; i++)
- encType.append(argCoders[i].getObjCEncoding());
-
- // Add it!
- boolean addedM = Subclassing.addMethod(classPtr, selName, method, cif, cif.cif.bufferPtr, encType.toString());
- if(!addedM) throw new RuntimeException("Failed to add method.");
- takenSelNames.add(selName);
- }
-
- // Seal it
- Subclassing.registerClassPair(classPtr);
- registeredUserSubclasses.add(classPtr);
-
- return true;
- }
-
- boolean isUserClass(long clsPtr) {
- return registeredUserSubclasses.contains(clsPtr);
- }
-
- // Called from JNI
-
- private static void initJObject(final long objPtr){
-// System.err.println("initJObject " + objPtr + " / " + Long.toHexString(objPtr));
- ID newObj = ID.createNewObjCObjectFor(JObjCRuntime.inst(), objPtr, NSClass.getClass(objPtr));
-// System.err.println("... " + newObj);
- initJObjectToIVar(objPtr, newObj);
- }
-
- private static void invokeFromJNI(ID obj, Method method, CIF cif, long result, long args){
- assert obj != null;
- assert obj.getClass().equals(method.getDeclaringClass()) :
- obj.getClass().toString() + " != " + method.getDeclaringClass().toString();
-
- final int argCount = method.getParameterTypes().length;
-
- // The first two args & coders are for objc id and sel. Skip them.
- final Object[] argObjects = new Object[argCount];
- for(int i = 0; i < argCount; i++){
- final long argAddrAddr = args + ((i+2) * JObjCRuntime.PTR_LEN);
- final long argAddr = PrimitivePointerCoder.INST.popPtr(obj.runtime, argAddrAddr);
- argObjects[i] = cif.argCoders[i + 2].pop(obj.runtime, argAddr);
- }
-
- Object retVal;
- try {
- retVal = method.invoke(obj, argObjects);
- } catch (Exception e) {
- e.printStackTrace();
- throw new RuntimeException(e);
- }
-
- if(!(cif.returnCoder instanceof VoidCoder))
- cif.returnCoder.push(obj.runtime, result, retVal);
- }
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/native/CIF.m b/jdk/src/macosx/native/jobjc/src/core/native/CIF.m
deleted file mode 100644
index 7aa4dd542a5..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/native/CIF.m
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "com_apple_jobjc_CIF.h"
-
-#define MACOSX
-#include
-#include
-
-#include "NativeBuffer.h"
-
-JNIEXPORT jint JNICALL Java_com_apple_jobjc_CIF_getSizeofCIF
-(JNIEnv *env, jclass clazz)
-{
- return (jint) sizeof(ffi_cif);
-}
-
-JNIEXPORT jboolean JNICALL Java_com_apple_jobjc_CIF_prepCIF
-(JNIEnv *env, jclass clazz, jlong jCIFPtr, jint jNargs, jlong jRetTypePtr, jlong jArgsPtr)
-{
- ffi_cif *cif = jlong_to_ptr(jCIFPtr);
- unsigned int nargs = jNargs;
- ffi_type *rtype = jlong_to_ptr(jRetTypePtr);
- ffi_type **atypes = jlong_to_ptr(jArgsPtr);
-
-// NSLog(@"rtype->(size: %d, alignment: %d, type: %d)", rtype->size, rtype->alignment, rtype->type);
- return (jboolean) (FFI_OK == ffi_prep_cif(cif, FFI_DEFAULT_ABI, nargs, rtype, atypes));
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/native/Coder.m b/jdk/src/macosx/native/jobjc/src/core/native/Coder.m
deleted file mode 100644
index af3553949bf..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/native/Coder.m
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "com_apple_jobjc_Coder.h"
-
-#include
-#define MACOSX
-#include
-#include
-
-/*
- * Class: com_apple_jobjc_Coder
- * Method: getNativeFFITypeCodeForCode
- * Signature: (I)J
- */
-JNIEXPORT jlong JNICALL Java_com_apple_jobjc_Coder_getNativeFFITypePtrForCode
-(JNIEnv *env, jclass clazz, jint code)
-{
- switch ((long)code) {
- case com_apple_jobjc_Coder_FFI_VOID: return ptr_to_jlong(&ffi_type_void);
- case com_apple_jobjc_Coder_FFI_PTR: return ptr_to_jlong(&ffi_type_pointer);
- case com_apple_jobjc_Coder_FFI_SINT8: return ptr_to_jlong(&ffi_type_sint8);
- case com_apple_jobjc_Coder_FFI_UINT8: return ptr_to_jlong(&ffi_type_uint8);
- case com_apple_jobjc_Coder_FFI_SINT16: return ptr_to_jlong(&ffi_type_sint16);
- case com_apple_jobjc_Coder_FFI_UINT16: return ptr_to_jlong(&ffi_type_uint16);
- case com_apple_jobjc_Coder_FFI_SINT32: return ptr_to_jlong(&ffi_type_sint32);
- case com_apple_jobjc_Coder_FFI_UINT32: return ptr_to_jlong(&ffi_type_uint32);
- case com_apple_jobjc_Coder_FFI_SINT64: return ptr_to_jlong(&ffi_type_sint64);
- case com_apple_jobjc_Coder_FFI_UINT64: return ptr_to_jlong(&ffi_type_uint64);
- case com_apple_jobjc_Coder_FFI_FLOAT: return ptr_to_jlong(&ffi_type_float);
- case com_apple_jobjc_Coder_FFI_DOUBLE: return ptr_to_jlong(&ffi_type_double);
- case com_apple_jobjc_Coder_FFI_LONGDOUBLE: return ptr_to_jlong(&ffi_type_longdouble);
- }
-
- return ptr_to_jlong(NULL);
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/native/FFIType.m b/jdk/src/macosx/native/jobjc/src/core/native/FFIType.m
deleted file mode 100644
index 731397e1a01..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/native/FFIType.m
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-#include
-#include
-
-#include "com_apple_jobjc_FFIType.h"
-
-JNIEXPORT void JNICALL Java_com_apple_jobjc_FFIType_makeFFIType
-(JNIEnv *env, jclass clazz, jlong ffi_type_jlong, jlong ffi_type_elements_jlong)
-{
- ffi_type *type = jlong_to_ptr(ffi_type_jlong);
- type->elements = jlong_to_ptr(ffi_type_elements_jlong);
- type->type = FFI_TYPE_STRUCT;
- type->size = type->alignment = 0;
-}
-
-JNIEXPORT jint JNICALL Java_com_apple_jobjc_FFIType_getFFITypeSizeof
-(JNIEnv *env, jclass clazz)
-{
- return (jint) sizeof(ffi_type);
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/native/Function.m b/jdk/src/macosx/native/jobjc/src/core/native/Function.m
deleted file mode 100644
index 9060a0fd158..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/native/Function.m
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "com_apple_jobjc_Function.h"
-
-#define MACOSX
-#include
-#include
-
-JNIEXPORT jlong JNICALL Java_com_apple_jobjc_Function_getFxnPtrForFunctionName
-(JNIEnv *env, jclass clazz, jstring fxnName)
-{
- const char *functionName = (*env)->GetStringUTFChars(env, fxnName, NULL);
- void *fxnPtr = dlsym(RTLD_SELF, functionName);
- (*env)->ReleaseStringUTFChars(env, fxnName, functionName);
- return ptr_to_jlong(fxnPtr);
-}
-
-JNIEXPORT jlong JNICALL Java_com_apple_jobjc_Function_getFxnPtrForFunctionNameAndLib
-(JNIEnv *env, jclass clazz, jlong frameworkPtr, jstring fxnName)
-{
- void *frameworkHandle = jlong_to_ptr(frameworkPtr);
-
- const char *functionName = (*env)->GetStringUTFChars(env, fxnName, NULL);
- void *fxnPtr = dlsym(frameworkHandle, functionName);
- (*env)->ReleaseStringUTFChars(env, fxnName, functionName);
-
- return ptr_to_jlong(fxnPtr);
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/native/ID.m b/jdk/src/macosx/native/jobjc/src/core/native/ID.m
deleted file mode 100644
index 2e40a03fad2..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/native/ID.m
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "com_apple_jobjc_ID.h"
-
-#include
-
-#include
-#include
-
-/*
- * Class: com_apple_jobjc_ID
- * Method: getNativeDescription
- * Signature: (J)Ljava/lang/String;
- */
-JNIEXPORT jstring JNICALL Java_com_apple_jobjc_ID_getNativeDescription
-(JNIEnv *env, jclass clazz, jlong objPtr)
-{
- jstring ret = NULL;
-
-JNF_COCOA_ENTER(env);
-
- NSString *desc = [((id)jlong_to_ptr(objPtr)) description];
- ret = JNFNSToJavaString(env, desc);
-
-JNF_COCOA_EXIT(env);
-
- return ret;
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/native/Invoke.m b/jdk/src/macosx/native/jobjc/src/core/native/Invoke.m
deleted file mode 100644
index 28a11d92d80..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/native/Invoke.m
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "com_apple_jobjc_Invoke_FunCall.h"
-#include
-#include
-#include
-
-JNIEXPORT void JNICALL Java_com_apple_jobjc_Invoke_00024FunCall_invoke
-(JNIEnv *env, jclass clazz, jlong cifPtr, jlong fxnPtr, jlong retValPtr, jlong argsPtr)
-{
- ffi_cif *cif = jlong_to_ptr(cifPtr);
- void *fxn = jlong_to_ptr(fxnPtr);
- void *retVal = jlong_to_ptr(retValPtr);
- void **args = jlong_to_ptr(argsPtr);
-
- ffi_call(cif, fxn, retVal, args);
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/native/JObjCRuntime.m b/jdk/src/macosx/native/jobjc/src/core/native/JObjCRuntime.m
deleted file mode 100644
index dfb5b48676a..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/native/JObjCRuntime.m
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "Cocoa/Cocoa.h"
-
diff --git a/jdk/src/macosx/native/jobjc/src/core/native/MacOSXFramework.m b/jdk/src/macosx/native/jobjc/src/core/native/MacOSXFramework.m
deleted file mode 100644
index 4609d79fdcd..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/native/MacOSXFramework.m
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "com_apple_jobjc_MacOSXFramework.h"
-
-#include
-#include
-
-/*
- * Class: com_apple_jobjc_MacOSXFramework
- * Method: retainFramework
- * Signature: (Ljava/lang/String;)J
- */
-JNIEXPORT jlong JNICALL Java_com_apple_jobjc_MacOSXFramework_retainFramework
-(JNIEnv *env, jclass clazz, jstring frameworkName)
-{
- if (frameworkName == NULL) return ptr_to_jlong(NULL);
- const char *frameworkNameCStr = (*env)->GetStringUTFChars(env, frameworkName, JNI_FALSE);
- const void *library = dlopen(frameworkNameCStr, RTLD_LOCAL);
- (*env)->ReleaseStringUTFChars(env, frameworkName, frameworkNameCStr);
- return ptr_to_jlong(library);
-}
-
-/*
- * Class: com_apple_jobjc_MacOSXFramework
- * Method: releaseFramework
- * Signature: (J)V
- */
-JNIEXPORT void JNICALL Java_com_apple_jobjc_MacOSXFramework_releaseFramework
-(JNIEnv *env, jclass clazz, jlong frameworkPtr)
-{
- dlclose(jlong_to_ptr(frameworkPtr));
-}
-
-JNIEXPORT void JNICALL Java_com_apple_jobjc_MacOSXFramework_getConstant
-(JNIEnv *env, jclass clazz, jlong frameworkPtr, jstring constSymbol, jlong retBuffer, jint size)
-{
- const char *symbol = (*env)->GetStringUTFChars(env, constSymbol, JNI_FALSE);
- void *handle = frameworkPtr ? jlong_to_ptr(frameworkPtr) : RTLD_DEFAULT;
- void *data = dlsym(handle, symbol);
- (*env)->ReleaseStringUTFChars(env, constSymbol, symbol);
-
- if(!data)
- (*env)->ThrowNew(env, (*env)->FindClass(env, "java/lang/RuntimeException"), dlerror());
- else
- memcpy(jlong_to_ptr(retBuffer), data, (size_t) size);
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/native/NSClass.m b/jdk/src/macosx/native/jobjc/src/core/native/NSClass.m
deleted file mode 100644
index 8ae15e3a368..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/native/NSClass.m
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "com_apple_jobjc_NSClass.h"
-#include
-
-#include
-
-/*
- * Class: com_apple_jobjc_NSClass
- * Method: getNativeClassByName
- * Signature: (JLjava/lang/String;)J
- */
-JNIEXPORT jlong JNICALL Java_com_apple_jobjc_NSClass_getNativeClassByName
-(JNIEnv *env, jclass clazz, jstring className)
-{
- if (className == NULL) return ptr_to_jlong(NULL);
- const char *classNameCStr = (*env)->GetStringUTFChars(env, className, JNI_FALSE);
- const id obj = objc_getClass(classNameCStr);
- (*env)->ReleaseStringUTFChars(env, className, classNameCStr);
-
- if (obj == nil) return ptr_to_jlong(NULL);
- return ptr_to_jlong(obj);
-}
-
-/*
- * Class: com_apple_jobjc_NSClass
- * Method: getSuperClass
- * Signature: (J)J
- */
-JNIEXPORT jlong JNICALL Java_com_apple_jobjc_NSClass_getSuperClassOfClass
-(JNIEnv *env, jclass clazz, jlong clazzPtr)
-{
- if (clazzPtr == 0L) return ptr_to_jlong(NULL);
- const Class objClazz = (Class)jlong_to_ptr(clazzPtr);
- return ptr_to_jlong(class_getSuperclass(objClazz));
-}
-
-/*
- * Class: com_apple_jobjc_NSClass
- * Method: getClassName
- * Signature: (J)Ljava/lang/String;
- */
-JNIEXPORT jstring JNICALL Java_com_apple_jobjc_NSClass_getClassNameOfClass
-(JNIEnv *env, jclass clazz, jlong clazzPtr)
-{
- const char *clazzName = (char *)class_getName((Class)jlong_to_ptr(clazzPtr));
- return (*env)->NewStringUTF(env, clazzName);
-}
-
-JNIEXPORT jlong JNICALL Java_com_apple_jobjc_NSClass_getClass
-(JNIEnv *env, jclass clazz, jlong objPtr)
-{
- id obj = (id)jlong_to_ptr(objPtr);
- return ptr_to_jlong(object_getClass(obj));
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/native/NativeBuffer.h b/jdk/src/macosx/native/jobjc/src/core/native/NativeBuffer.h
deleted file mode 100644
index 0fafa6ef3a8..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/native/NativeBuffer.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * NativeBuffer.h
- * Copyright 2007 Apple Inc. All rights reserved.
- *
- */
-
-#define BUFFER_AT(buffer, offset) (((UInt8 *)buffer) + offset)
-#define GET_VALUE(type, buffer, offset) (*((type *)BUFFER_AT(buffer, offset)))
-#define PUT_VALUE(type, buffer, offset, value) (*((type *)BUFFER_AT(buffer, offset)) = value)
-
-#define GET_INT_AT(buffer, offset) GET_VALUE(jint, buffer, offset)
-#define GET_LONG_AT(buffer, offset) GET_VALUE(jlong, buffer, offset)
-
-#define PUT_INT_AT(buffer, offset, value) PUT_VALUE(jint, buffer, offset, value)
-#define PUT_LONG_AT(buffer, offset, value) PUT_VALUE(jlong, buffer, offset, value)
diff --git a/jdk/src/macosx/native/jobjc/src/core/native/NativeBuffer.m b/jdk/src/macosx/native/jobjc/src/core/native/NativeBuffer.m
deleted file mode 100644
index 8f7b9b0fe01..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/native/NativeBuffer.m
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "com_apple_jobjc_NativeBuffer.h"
-
-#define MACOSX
-#include
-#include
-
-JNIEXPORT jlong JNICALL Java_com_apple_jobjc_NativeBuffer_getPtrOfBuffer
-(JNIEnv *env, jclass clazz, jobject buffer)
-{
- if (buffer == NULL) return ptr_to_jlong(0);
- return ptr_to_jlong((*env)->GetDirectBufferAddress(env, buffer));
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/native/NativeObjectLifecycleManager.m b/jdk/src/macosx/native/jobjc/src/core/native/NativeObjectLifecycleManager.m
deleted file mode 100644
index 012f83a1d6a..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/native/NativeObjectLifecycleManager.m
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "com_apple_jobjc_NativeObjectLifecycleManager.h"
-
-#include
-
-
-/*
- * Class: com_apple_jobjc_NativeObjectLifecycleManager
- * Method: retainNativeObject
- * Signature: (J)V
- */
-JNIEXPORT void JNICALL Java_com_apple_jobjc_NativeObjectLifecycleManager_retainNativeObject
-(JNIEnv *env, jclass clazz, jlong ptr)
-{
- if (ptr == 0L) return;
- CFRetain(jlong_to_ptr(ptr));
-}
-
-/*
- * Class: com_apple_jobjc_NativeObjectLifecycleManager
- * Method: releaseNativeObject
- * Signature: (J)V
- */
-JNIEXPORT void JNICALL Java_com_apple_jobjc_NativeObjectLifecycleManager_releaseNativeObject
-(JNIEnv *env, jclass clazz, jlong ptr)
-{
- if (ptr == 0L) return;
- CFRelease(jlong_to_ptr(ptr));
-}
-
-/*
- * Class: com_apple_jobjc_NativeObjectLifecycleManager
- * Method: freeNativeObject
- * Signature: (J)V
- */
-JNIEXPORT void JNICALL Java_com_apple_jobjc_NativeObjectLifecycleManager_freeNativeObject
-(JNIEnv *env, jclass clazz, jlong ptr)
-{
- if (ptr == 0L) return;
- free(jlong_to_ptr(ptr));
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/native/SEL.m b/jdk/src/macosx/native/jobjc/src/core/native/SEL.m
deleted file mode 100644
index dc39ed10132..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/native/SEL.m
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "com_apple_jobjc_SEL.h"
-
-#include
-#include
-
-JNIEXPORT jlong JNICALL Java_com_apple_jobjc_SEL_getSelectorPtr
-(JNIEnv *env, jclass jclazz, jstring selName)
-{
- const char *selNameAsChars = (*env)->GetStringUTFChars(env, selName, JNI_FALSE);
- const SEL sel = sel_registerName(selNameAsChars);
- (*env)->ReleaseStringUTFChars(env, selName, selNameAsChars);
- return ptr_to_jlong((void*)sel);
-}
-
-JNIEXPORT jstring JNICALL Java_com_apple_jobjc_SEL_getSelectorName
-(JNIEnv *env, jclass jclazz, jlong selPtr)
-{
- return (*env)->NewStringUTF(env, sel_getName(jlong_to_ptr(selPtr)));
-}
diff --git a/jdk/src/macosx/native/jobjc/src/core/native/Subclassing.m b/jdk/src/macosx/native/jobjc/src/core/native/Subclassing.m
deleted file mode 100644
index 0e9d4651db8..00000000000
--- a/jdk/src/macosx/native/jobjc/src/core/native/Subclassing.m
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "com_apple_jobjc_Subclassing.h"
-
-#include
-#include
-#include
-
-#include
-#include
-
-#include
-#include
-
-#include
-
-// Subclassing of Obj-C classes in Java
-//
-// See:
-// - Objective-C Runtime documentation
-// - man ffi_prep_closure
-// - Subclassing.java
-
-
-#pragma mark Accessing object in IVar
-
-#define JOBJ_IVAR_NAME "jObjWrapper"
-static jobject getJObjectFromIVar(id obj);
-
-jobject getJObjectFromIVar(id obj)
-{
- JNFJObjectWrapper *wrapper = NULL;
- object_getInstanceVariable(obj, JOBJ_IVAR_NAME, (void**) &wrapper);
- return wrapper ? [wrapper jObject] : NULL;
-}
-
-JNIEXPORT jobject JNICALL Java_com_apple_jobjc_Subclassing_getJObjectFromIVar
-(JNIEnv *env, jclass jClass, jlong jPtr)
-{
- id obj = (id) jlong_to_ptr(jPtr);
- if(obj == NULL){
- (*env)->ThrowNew(env, (*env)->FindClass(env,
- "java/lang/NullPointerException"), "obj");
- return NULL;
- }
-
- JNFJObjectWrapper *wrapper;
-
- if(!object_getInstanceVariable(obj, JOBJ_IVAR_NAME, (void**) &wrapper)){
- NSLog(@"IVar '%s' not found. obj: %@", JOBJ_IVAR_NAME, obj);
- (*env)->ThrowNew(env, (*env)->FindClass(env, "java/lang/RuntimeException"),
- "Could not find instance variable that holds Java object.");
- return NULL;
- }
-
- return wrapper ? [wrapper jObject] : NULL;
-}
-
-JNIEXPORT void JNICALL Java_com_apple_jobjc_Subclassing_initJObjectToIVar
-(JNIEnv *env, jclass jClass, jlong jPtr, jobject jObject)
-{
- id obj = (id) jlong_to_ptr(jPtr);
- JNFJObjectWrapper *wrapper = [[JNFJObjectWrapper alloc]
- initWithJObject:jObject withEnv:env];
- [wrapper retain];
-
- if(!object_setInstanceVariable(obj, JOBJ_IVAR_NAME, wrapper)){
- NSLog(@"IVar '%s' not found. obj: %@", JOBJ_IVAR_NAME, obj);
- (*env)->ThrowNew(env, (*env)->FindClass(env, "java/lang/RuntimeException"),
- "Could not find instance variable that holds Java object.");
- return;
- }
-}
-
-#pragma mark Registering class
-
-JNIEXPORT jlong JNICALL Java_com_apple_jobjc_Subclassing_allocateClassPair
-(JNIEnv *env, jclass clazz, jlong jSuperClass, jstring jName)
-{
- const Class superClass = (Class)jlong_to_ptr(jSuperClass);
- assert(superClass);
-
- const char *name = (*env)->GetStringUTFChars(env, jName, JNI_FALSE);
- const Class newClass = objc_allocateClassPair(superClass, name, 0);
- (*env)->ReleaseStringUTFChars(env, jName, name);
-
- return ptr_to_jlong(newClass);
-}
-
-JNIEXPORT jboolean JNICALL Java_com_apple_jobjc_Subclassing_addIVarForJObj
-(JNIEnv *env, jclass clazz, jlong jSynthClass)
-{
- return class_addIvar(
- jlong_to_ptr(jSynthClass),
- JOBJ_IVAR_NAME,
- sizeof(id),
- (uint8_t)log2((double)sizeof(id)),
- "@");
-}
-
-JNIEXPORT void JNICALL Java_com_apple_jobjc_Subclassing_registerClassPair
-(JNIEnv *env, jclass clazz, jlong jClass)
-{
- Class c = jlong_to_ptr(jClass);
-// NSLog(@"Registering class pair %p / %s", c, class_getName(c));
- objc_registerClassPair(c);
-}
-
-
-#pragma mark Patching +alloc
-
-static id patchedAllocIMP(id obj, SEL sel);
-static void addJavaInstance(id obj);
-
-JNIEXPORT jboolean JNICALL Java_com_apple_jobjc_Subclassing_patchAlloc
-(JNIEnv *env, jclass clazz, jlong jNativeClass)
-{
- Class metaClass = object_getClass(jlong_to_ptr(jNativeClass));
- return class_addMethod(metaClass,
- sel_registerName("alloc"),
- (IMP) patchedAllocIMP,
- "@@:");
-}
-
-static id patchedAllocIMP(id cls, SEL sel){
- id inst = class_createInstance(cls, 0);
- addJavaInstance(inst);
- return inst;
-}
-
-static void addJavaInstance(id obj){
-// NSLog(@"addJavaInstance %p", obj);
-// NSLog(@"... calling up to Java");
-
- static JNF_CLASS_CACHE(jc_Subclassing, "com/apple/jobjc/Subclassing");
- static JNF_STATIC_MEMBER_CACHE(jm_Subclassing_initJObject,
- jc_Subclassing,
- "initJObject",
- "(J)V");
-
- JNFThreadContext threadWasAttached = JNFThreadDetachOnThreadDeath;
- JNIEnv *env = JNFObtainEnv(&threadWasAttached);
- JNFCallStaticVoidMethod(env, jm_Subclassing_initJObject,
- ptr_to_jlong(obj));
-
- JNFReleaseEnv(env, &threadWasAttached);
-}
-
-
-#pragma mark Adding methods
-
-static ffi_closure *make_closure(ffi_cif *cif, void *user_data);
-static void sel_closure_call(ffi_cif* cif, void* result, void** args, void* user_data);
-
-typedef struct closure_data_t{
- JNFJObjectWrapper *jMethod;
- JNFJObjectWrapper *jCIF;
-} closure_data_t;
-
-static ffi_closure *make_closure(ffi_cif *cif, void *user_data){
- // Allocate a page to hold the closure with read and write permissions.
- ffi_closure *closure;
- if ((closure = mmap(NULL, sizeof(ffi_closure), PROT_READ | PROT_WRITE,
- MAP_ANON | MAP_PRIVATE, -1, (off_t) 0)) == (void*)-1)
- {
- fprintf(stderr, "mmap failed with errno: %d", errno);
- return NULL;
- }
-
- // Prepare the ffi_closure structure.
- ffi_status status;
- if ((status = ffi_prep_closure(closure, cif, sel_closure_call, (void *)user_data)) != FFI_OK)
- {
- fprintf(stderr, "ffi_prep_closure failed with ffi_status: %d", status);
- munmap(closure, sizeof(ffi_closure));
- return NULL;
- }
-
- // Ensure that the closure will execute on all architectures.
- if (mprotect(closure, sizeof(closure), PROT_READ | PROT_EXEC) == -1)
- {
- fprintf(stderr, "mprotect failed with errno: %d", errno);
- munmap(closure, sizeof(ffi_closure));
- return NULL;
- }
- return closure;
-}
-
-JNIEXPORT jboolean JNICALL Java_com_apple_jobjc_Subclassing_addMethod
-(JNIEnv *env, jclass clazz, jlong jClass, jstring jSelName, jobject jMethod,
- jobject jCIF, jlong jCIFPtr, jstring jObjCEncodedType)
-{
- ffi_cif *cif = jlong_to_ptr(jCIFPtr);
-
- closure_data_t *user_data = malloc(sizeof(closure_data_t));
- user_data->jMethod = [[JNFJObjectWrapper alloc] initWithJObject:jMethod withEnv:env];
- user_data->jCIF = [[JNFJObjectWrapper alloc] initWithJObject:jCIF withEnv:env];
-
- ffi_closure *closure;;
- if(!(closure = make_closure(cif, user_data))){
- [user_data->jMethod release];
- [user_data->jCIF release];
- free(user_data);
- return NO;
- }
-
- const Class objcClass = (Class)jlong_to_ptr(jClass);
-
- const char *selName = (*env)->GetStringUTFChars(env, jSelName, JNI_FALSE);
- const char *objCEncodedType = (*env)->GetStringUTFChars(env, jObjCEncodedType, JNI_FALSE);
-
-// NSLog(@"Adding method '%s' :: '%s' to '%s' / %p",
-// selName,
-// objCEncodedType,
-// class_getName(objcClass),
-// objcClass);
-
- BOOL ret = class_addMethod(objcClass, sel_registerName(selName), (IMP) closure, objCEncodedType);
-
- (*env)->ReleaseStringUTFChars(env, jSelName, selName);
- (*env)->ReleaseStringUTFChars(env, jObjCEncodedType, objCEncodedType);
-
- if(!ret){
- NSLog(@"class_addMethod failed");
- munmap(closure, sizeof(ffi_closure));
- [user_data->jMethod release];
- [user_data->jCIF release];
- free(user_data);
- return NO;
- }
-
- return ret;
-}
-
-static void sel_closure_call(ffi_cif* cif, void* result, void** args, void* user_data)
-{
- id obj = *(id*) args[0];
-// SEL sel = *(SEL*) args[1];
-
-// NSLog(@"Subclassing: sel_closure_call: %p %p", obj, sel);
-// NSLog(@"Subclassing: sel_closure_call: obj class: %@ sel name: %s", object_getClass(obj), sel_getName(sel));
-
- jobject jObj = getJObjectFromIVar(obj);
-
- if(!jObj){
- addJavaInstance(obj);
- jObj = getJObjectFromIVar(obj);
- }
-
- closure_data_t *jmeta = user_data;
- jobject jMethod = [jmeta->jMethod jObject];
- jobject jCIF = [jmeta->jCIF jObject];
-
- JNFThreadContext threadWasAttached = JNFThreadDetachOnThreadDeath;
- JNIEnv *env = JNFObtainEnv(&threadWasAttached);
-
- if((*env)->ExceptionOccurred(env)) goto bail;
-
- static JNF_CLASS_CACHE(jc, "com/apple/jobjc/Subclassing");
- static JNF_STATIC_MEMBER_CACHE(jm_invokeFromJNI, jc, "invokeFromJNI",
- "(Lcom/apple/jobjc/ID;Ljava/lang/reflect/Method;Lcom/apple/jobjc/CIF;JJ)V");
-
- JNFCallStaticVoidMethod(env, jm_invokeFromJNI,
- jObj,
- jMethod,
- jCIF,
- ptr_to_jlong(result),
- ptr_to_jlong(args));
-
-bail:
- JNFReleaseEnv(env, &threadWasAttached);
-
- if((*env)->ExceptionOccurred(env)){
- NSLog(@"Exception!");
- (*env)->ExceptionDescribe(env);
- }
- JNFReleaseEnv(env, &threadWasAttached);
-}
diff --git a/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/BootClassPathMinus.java b/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/BootClassPathMinus.java
deleted file mode 100644
index efbad58a104..00000000000
--- a/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/BootClassPathMinus.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.internal.jobjc.generator;
-
-public class BootClassPathMinus {
-
- /*
- * return the default boot class path with all parts mentioned in arguments removed
- */
- public static void main(String[] args) {
- String bootClassPath = System.getProperty("sun.boot.class.path");
- StringBuffer newPath = new StringBuffer(bootClassPath.length());
- String[] bootClassPathParts = bootClassPath.split(java.io.File.pathSeparator, 0);
- for (String part : bootClassPathParts) {
- boolean found = false;
- for (String minus : args) {
- if (part.endsWith(minus)) {
- found = true;
- }
- }
- if (!found) {
- if (newPath.length() > 0) newPath.append(java.io.File.pathSeparatorChar);
- newPath.append(part);
- }
- }
- System.out.println(newPath.toString());
- }
-
-}
diff --git a/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/ClassConsolidator.java b/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/ClassConsolidator.java
deleted file mode 100644
index 69a872f8dbc..00000000000
--- a/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/ClassConsolidator.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.internal.jobjc.generator;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import com.apple.internal.jobjc.generator.model.Category;
-import com.apple.internal.jobjc.generator.model.Clazz;
-import com.apple.internal.jobjc.generator.model.Framework;
-
-public class ClassConsolidator {
- private static String[] PREFERRED_FRAMEWORKS = { "Foundation", "AppKit" };
-
- static void consolidateClassesForFrameworks(final List frameworks) throws Throwable {
- System.out.println("--2-- Resolving duplicate classes:");
- final Map> allClasses = new HashMap>();
-
- for (final Framework framework : frameworks) {
- for (final Clazz clazz : framework.classes) {
- final List existingClazzList = allClasses.get(clazz.name);
- if(existingClazzList != null)
- existingClazzList.add(clazz);
- else
- allClasses.put(clazz.name, new ArrayList(Arrays.asList(clazz)));
- }
- }
-
- final Map filteredClasses = new HashMap();
- final List> dreggs = new ArrayList>();
-
- final Collection> clazzLists = allClasses.values();
- for (final List clazzList : clazzLists) {
- if (clazzList.size() > 1) {
- // add to the list for later analysis
- dreggs.add(clazzList);
- continue;
- }
-
- // if there is only one class definition, go with it!
- final Clazz clazz = clazzList.get(0);
- filteredClasses.put(clazz.name, clazz);
- }
-
- // figure out which class is the real class, and convert the rest to categories
- for (final List dreg : dreggs)
- deriveCategoriesFrom(dreg, filteredClasses);
-
- // patch up the inheritance hierarchy
- System.out.println("Determining super classes:");
- for (final Framework framework : frameworks)
- framework.resolveSuperClasses(filteredClasses);
- }
-
- private static void deriveCategoriesFrom(final List clazzes, final Map filteredClasses) {
- final List clazzesToDerive = new ArrayList(clazzes);
-
- for (final String preferredFrameworkName : PREFERRED_FRAMEWORKS) {
- for (final Clazz clazz : clazzesToDerive) {
- if (!preferredFrameworkName.equals(clazz.parent.name)) continue;
-
- System.out.print("\t" + clazz.parent.name + " owns \"" + clazz.name + "\", ");
- addCategoriesAndPatchClasses(clazzes, clazz);
- filteredClasses.put(clazz.name, clazz);
- return;
- }
- }
-
- final List frameworkNameList = new ArrayList(clazzes.size());
- for (final Clazz clazz : clazzes) frameworkNameList.add(clazz.parent.name);
- throw new RuntimeException("Could not derived a preferred framework for: " + clazzes.get(0).name + ", from (" + Utils.joinWComma(frameworkNameList) + ")");
- }
-
- private static void addCategoriesAndPatchClasses(final List clazzes, final Clazz clazz) {
- final List fwNames = new ArrayList(clazzes.size());
-
- for (final Clazz cls : clazzes) {
- if (cls == clazz) continue;
- fwNames.add(cls.parent.name);
- cls.parent.classes.remove(cls);
- cls.parent.categories.add(new Category(cls, clazz));
- }
-
- System.out.println("creating categories in: " + Utils.joinWComma(fwNames));
- }
-}
diff --git a/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/ClassGenerator.java b/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/ClassGenerator.java
deleted file mode 100644
index 8953fa306c0..00000000000
--- a/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/ClassGenerator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.internal.jobjc.generator;
-
-import java.util.*;
-
-import com.apple.internal.jobjc.generator.classes.*;
-import com.apple.internal.jobjc.generator.model.Framework;
-
-public class ClassGenerator {
- public static final String JOBJC_PACKAGE = "com.apple.jobjc";
-
- public static List generateClasses(final List frameworks) {
- final List generatedClassFiles = new ArrayList();
-
- generatedClassFiles.add(new RootJObjCClass(frameworks));
- for (final Framework f : frameworks) {
- f.generateClasses(generatedClassFiles);
- }
-
- return generatedClassFiles;
- }
-}
diff --git a/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/FileCopier.java b/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/FileCopier.java
deleted file mode 100644
index bcaf5bcb8c7..00000000000
--- a/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/FileCopier.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.internal.jobjc.generator;
-
-import java.io.File;
-import java.util.*;
-
-import com.apple.internal.jobjc.generator.classes.*;
-
-public class FileCopier {
- public static List addSourceFilesFrom(final String srcPath) {
- final List outputFileList = new ArrayList();
-
- final List fileList = getFileList(srcPath);
- for (final File file : fileList) {
- outputFileList.add(new CopiedFile(file, ClassGenerator.JOBJC_PACKAGE, file.getName().replace("\\.java", "")));
- }
-
- return outputFileList;
- }
-
- private static List getFileList(final String srcPath) {
- final File srcRoot = new File(srcPath);
- if (!srcRoot.exists()) throw new RuntimeException("Source root " + srcRoot + " does not exist. Nowhere to copy base runtime objects from.");
-
- final File targetDir = new File(srcRoot, ClassGenerator.JOBJC_PACKAGE.replaceAll("\\.", "\\/"));
- if (!targetDir.exists() || !targetDir.isDirectory()) throw new RuntimeException("Base runtime object source directory " + targetDir + " does not exist. No runtime class files to copy.");
-
- final List fileList = new ArrayList();
- final File[] targetDirFileList = targetDir.listFiles();
- for (final File file : targetDirFileList) {
- if (!file.isFile()) continue;
- if (!file.getName().endsWith(".java")) continue;
- fileList.add(file);
- }
-
- return fileList;
- }
-}
diff --git a/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/FrameworkGenerator.java b/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/FrameworkGenerator.java
deleted file mode 100644
index 1f11ed9038b..00000000000
--- a/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/FrameworkGenerator.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.internal.jobjc.generator;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import com.apple.internal.jobjc.generator.model.Framework;
-import com.apple.internal.jobjc.generator.model.Framework.FrameworkDependency;
-import com.apple.internal.jobjc.generator.utils.Fp;
-import com.apple.internal.jobjc.generator.utils.StructOffsetResolverBigBang;
-import com.apple.jobjc.JObjCRuntime;
-
-public class FrameworkGenerator {
- private static final String BRIDGESUPPORT_FILE_EXTENSION = "Full.bridgesupport";
- private static final String FRAMEWORK_MATCH = "^.*Full\\.bridgesupport$";
- private static final String FRAMEWORK_PRUNE = "^.*(PyObjC|/Versions|\\.lproj|/Headers|/PrivateHeaders).*$";
-
- static List findFrameworkFilesIn(final File file) throws IOException{
- final List bridgeSupportFiles = Utils.find(file, FRAMEWORK_MATCH, FRAMEWORK_PRUNE);
- System.out.println("found " + bridgeSupportFiles.size() + " frameworks");
- return bridgeSupportFiles;
- }
-
- static List parseFrameworksFrom(final List bridgeSupportFiles) {
- final List frameworks = new ArrayList();
-
- System.out.println("Parsing XML");
- for (final File file : bridgeSupportFiles){
- Framework f = new Framework(extractFrameworkNameFrom(file), file);
- try{
- f.load();
- frameworks.add(f);
- System.out.println("Generator@" + JObjCRuntime.ARCH + " loaded "
- + f.name + " (" + Fp.join(":", f.binaries) + ")");
- }
- catch(Exception x){
- System.out.println("!! Generator@" + JObjCRuntime.ARCH + " failed to load "
- + f.name + " (" + Fp.join(":", f.binaries) + "). SKIPPING");
- }
- }
-
- System.out.println("Parsing dependencies");
- for (final Framework f : frameworks) f.parseDependencies(frameworks);
-
- Set alreadyWarnedDependency = new HashSet();
- for(final Framework f : frameworks)
- for(final FrameworkDependency dep : f.dependencies)
- if(dep.object == null && !alreadyWarnedDependency.contains(dep.name)){
- System.out.println(String.format("Warning: unresolved dependency: %1$30s -> %2$s", f.name, dep.name));
- alreadyWarnedDependency.add(dep.name);
- }
- if(alreadyWarnedDependency.size() > 0)
- System.out.println("Unresolved dependencies lead to unresolved types.");
-
- Utils.topologicalSort(frameworks);
- List cycle = Utils.getDependencyCycle(frameworks);
- if(cycle != null)
- System.out.println("Warning: cycle found in framework dependencies: " + Fp.join(" -> ", cycle));
-
- System.out.println("Parsing types");
- for (final Framework f : frameworks){
- f.parseCFTypes();
- f.parseOpaques();
- }
- for (final Framework f : frameworks) f.parseStructs();
-
- new StructOffsetResolverBigBang().resolve(frameworks);
-
- System.out.println("Parsing classes");
- for (final Framework f : frameworks) f.parseClasses();
-
- System.out.println("Parsing constants");
- for (final Framework f : frameworks) f.parseConstants();
-
- System.out.println("Parsing functions");
- for (final Framework f : frameworks) f.parseFunctions();
-
- return frameworks;
- }
-
- private static String extractFrameworkNameFrom(final File file) {
- final String fileName = file.getName();
- return fileName.substring(0, fileName.lastIndexOf(BRIDGESUPPORT_FILE_EXTENSION));
- }
-}
diff --git a/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/FunctionGenerator.java b/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/FunctionGenerator.java
deleted file mode 100644
index 37f67aa39bd..00000000000
--- a/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/FunctionGenerator.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.internal.jobjc.generator;
-
-import java.io.PrintStream;
-import java.io.StringWriter;
-
-import com.apple.internal.jobjc.generator.model.Arg;
-import com.apple.internal.jobjc.generator.model.Function;
-import com.apple.internal.jobjc.generator.model.Method;
-import com.apple.internal.jobjc.generator.model.types.JType;
-import com.apple.internal.jobjc.generator.utils.JavaLang.JLCall;
-import com.apple.internal.jobjc.generator.utils.JavaLang.JLField;
-import com.apple.internal.jobjc.generator.utils.JavaLang.JLMethod;
-import com.apple.internal.jobjc.generator.utils.JavaLang.JLTertiary;
-import com.apple.jobjc.Coder;
-import com.apple.jobjc.Invoke;
-import com.apple.jobjc.Invoke.FunCall;
-import com.apple.jobjc.Invoke.MsgSend;
-
-public class FunctionGenerator {
- private final static String VARARGS_NAME = "varargs";
-
- private static String createFieldCache(final Class extends Invoke> type, final Function fxn) {
- final String identifier = makeInstanceName(fxn);
-
- JLField field = new JLField("private static", type.getCanonicalName(), identifier);
- // It's okay to make it static, because the getter isn't static, so the only way to access it is through an instance.
- JLMethod getter = new JLMethod("private final", type.getCanonicalName(), "get_" + identifier);
-
- JLCall createIt = new JLCall("new " + type.getCanonicalName());
- createIt.args.add(firstArg(fxn));
- createIt.args.add("\"" + fxn.name + "\"");
- createIt.args.add(fxn.returnValue.type.getJType().getCoderDescriptor().getCoderInstanceName());
- for (final Arg arg : fxn.args)
- createIt.args.add(arg.type.getJType().getCoderDescriptor().getCoderInstanceName());
-
- getter.body.add("return " + new JLTertiary(identifier + " != null", identifier, identifier + " = " + createIt) + ";");
-
- return field.toString() + getter.toString();
- }
-
- private static String createLocalForward(final Class extends Invoke> type, final Function fxn) {
- final String identifier = makeInstanceName(fxn);
- return new JLField("final", type.getCanonicalName(), identifier, new JLCall("get_" + identifier)).toString();
- }
-
- private static String createLocalNew(final Class extends Invoke> type, final Function fxn) {
- final String identifier = makeInstanceName(fxn);
- StringWriter out = new StringWriter();
-
- out.append(String.format("%3$s[] argCoders = new %3$s[%1$d + %2$s.length];\n", fxn.args.size(), VARARGS_NAME, Coder.class.getCanonicalName()));
-
- for(int i = 0; i < fxn.args.size(); i++)
- out.append(String.format("argCoders[%1$d] = %2$s;\n", i, fxn.args.get(0).type.getJType().getCoderDescriptor().getCoderInstanceName()));
-
- if(fxn.variadic){
- out.append(String.format("for(int i = %1$d; i < (%1$d + %2$s.length); i++)\n", fxn.args.size(), VARARGS_NAME));
- out.append(String.format("\targCoders[i] = %1$s.getCoderAtRuntime(%2$s[i - %3$s]);\n", Coder.class.getCanonicalName(), VARARGS_NAME, fxn.args.size()));
- }
-
- out.append("final " + type.getCanonicalName() + " " + identifier + " = new " + type.getCanonicalName() + "(" + firstArg(fxn) + ", \"" + fxn.name + "\", "
- + fxn.returnValue.type.getJType().getCoderDescriptor().getCoderInstanceName() + ", argCoders);");
-
- return out.toString();
- }
-
- private static final String CONTEXT_NAME = "nativeBuffer";
-
- public static void writeOutFunction(final PrintStream out, final Class extends Invoke> type, final Function fxn, final String initWithObj) {
- final String instName = makeInstanceName(fxn);
- final JType returnJavaType = fxn.returnValue.type.getJType();
-
- if(!fxn.variadic){
- out.print(createFieldCache(type, fxn));
- out.println();
- }
-
- JLMethod meth = new JLMethod("public", returnJavaType.getJavaReturnTypeName(), fxn.getJavaName());
-
- for(Arg arg : fxn.args)
- meth.args.add("final " + arg.type.getJType().getTypeNameAsParam() + " " + arg.javaName);
-
- if(fxn.variadic)
- meth.args.add("final Object... " + VARARGS_NAME);
-
- if(fxn instanceof Method && ((Method)fxn).ignore){
- String suggestion = ((Method)fxn).suggestion == null ? "" : (" Suggested work-around: " + ((Method)fxn).suggestion);
- meth.jdoc.add("@deprecated The framework recommends that this method be ignored. (It may be deprecated.)" + suggestion);
- meth.attrs.add("@Deprecated");
- }
-
- // type mismatch warning
- {
- {
- String retMsg = fxn.returnValue.type.getJType().getCoderDescriptor().mismatchMessage();
- if(retMsg != null){
- meth.jdoc.add("@deprecated Possible type mismatch: (return value) " + retMsg);
- meth.attrs.add("@Deprecated");
- }
- }
-
- for(int i = 0; i < fxn.args.size(); i++){
- final Arg arg = fxn.args.get(i);
- String argMsg = arg.type.getJType().getCoderDescriptor().mismatchMessage();
- if(argMsg != null){
- meth.jdoc.add("@deprecated Possible type mismatch: (arg" + i + ": " + arg.javaName + ") " + argMsg);
- meth.attrs.add("@Deprecated");
- }
- }
- }
-
- if(fxn.variadic)
- meth.body.add(createLocalNew(coreType(fxn), fxn));
- else
- meth.body.add(createLocalForward(coreType(fxn), fxn));
-
- meth.body.add(returnJavaType.createDeclareBuffer(CONTEXT_NAME));
- meth.body.add(returnJavaType.createInit(CONTEXT_NAME, instName, initWithObj));
-
- for(final Arg arg : fxn.args)
- meth.body.add(arg.type.getJType().getCoderDescriptor().getPushStatementFor(CONTEXT_NAME, arg.javaName));
-
- if(fxn.variadic){
- meth.body.add(String.format("for(int i = %1$d; i < (%1$d + %2$s.length); i++)", fxn.args.size(), VARARGS_NAME));
- meth.body.add(String.format("\targCoders[i].push(%1$s, %2$s[i - %3$d]);", CONTEXT_NAME, VARARGS_NAME, fxn.args.size()));
- }
-
- meth.body.add(returnJavaType.createInvoke(CONTEXT_NAME, instName));
- meth.body.add(returnJavaType.createPop(CONTEXT_NAME));
- meth.body.add(returnJavaType.createReturn());
-
- out.print(meth.toString());
- out.println();
- }
-
- private static Class extends Invoke> coreType(final Function fxn){
- return fxn instanceof Method ? MsgSend.class : FunCall.class;
- }
-
- private static String firstArg(Function fxn){
- return fxn instanceof Method ? "getRuntime()" : "this";
- }
-
- private static String makeInstanceName(Function fxn){
- String ext;
- if(fxn instanceof Method){
- if(((Method) fxn).isClassMethod) ext = "CMetInst";
- else ext = "IMetInst";
- }
- else
- ext = "FxnInst";
-
- return fxn.getJavaName() + "_" + ext;
- }
-}
diff --git a/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/Generator.java b/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/Generator.java
deleted file mode 100644
index f1411e83e7d..00000000000
--- a/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/Generator.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.internal.jobjc.generator;
-
-import java.io.File;
-import java.util.List;
-import java.util.Map;
-
-import com.apple.internal.jobjc.generator.classes.MixedPrimitiveCoderClassFile;
-import com.apple.internal.jobjc.generator.classes.OutputFile;
-import com.apple.internal.jobjc.generator.model.Framework;
-import com.apple.internal.jobjc.generator.model.coders.ComplexCoderDescriptor;
-import com.apple.internal.jobjc.generator.model.types.Type;
-import com.apple.internal.jobjc.generator.model.types.TypeCache;
-import com.apple.internal.jobjc.generator.utils.Fp.Pair;
-
-public class Generator {
- private static final String DEFAULT_FRAMEWORKS_PATH = "/System/Library/Frameworks";
- private static final String DEFAULT_OUTPUT_PATH = "/tmp/JObjC";
-
- public static void main(final String...args) throws Throwable {
- final Map argMap = Utils.getArgs(args);
-
- final String dst = get(argMap, "dst", DEFAULT_OUTPUT_PATH);
- System.out.println("Cleaning up: " + dst);
- final File dstLoc = new File(dst);
- Utils.recDelete(dstLoc);
- dstLoc.mkdirs();
- System.out.println("Outputting classes to: " + dst);
-
- final String frameworksPath = get(argMap, "frameworks", DEFAULT_FRAMEWORKS_PATH);
- System.out.println("Searching for bridged frameworks in: " + frameworksPath);
-
- final List bridgeSupportFiles = FrameworkGenerator.findFrameworkFilesIn(new File(frameworksPath));
- final List frameworks = FrameworkGenerator.parseFrameworksFrom(bridgeSupportFiles);
-
- System.out.println("--1-- Generator: consolidateClassesForFrameworks");
- ClassConsolidator.consolidateClassesForFrameworks(frameworks);
-
- System.out.println("--1-- Generator: TypeCache load");
- TypeCache.inst().load(frameworks);
-
- System.out.println("--1-- Generator: disambiguateMethodNames");
- MethodDisambiguator.disambiguateMethodNames();
-
- System.out.println("--1-- Generator: disambiguateFunctionsIn");
- MethodDisambiguator.disambiguateFunctionsIn(frameworks);
-
- System.out.println("--1-- Generator: generateClasses");
- final List sourceFiles = ClassGenerator.generateClasses(frameworks);
- sourceFiles.add(new MixedPrimitiveCoderClassFile(ComplexCoderDescriptor.getMixedEncoders()));
-
- System.out.println("--1-- Generator: writing " + sourceFiles.size() + " files");
- for (final OutputFile sourceFile : sourceFiles) sourceFile.write(dstLoc);
-
- System.out.println("I have " + TypeCache.inst().getUnknownTypes().size() + " unresolved types.");
- for (final Type type : TypeCache.inst().getUnknownTypes())
- System.out.println("[Warning] unknown type: " + type);
-
- for(Type type : TypeCache.inst().typesByNTypes.values()){
- if(!type.type32.getClass().equals(type.type64.getClass())){
- System.out.format("Type with differing NTypes: %1$15s: %2$s\n", type.name, new Pair(type.type32, type.type64));
- }
- }
- }
-
- private static String get(final Map defaults, final String key, final String defaultValue) {
- final String value = defaults.get(key);
- if (value != null) return value;
- return defaultValue;
- }
-}
diff --git a/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/MethodDisambiguator.java b/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/MethodDisambiguator.java
deleted file mode 100644
index 5b8bcb2ec79..00000000000
--- a/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/MethodDisambiguator.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.internal.jobjc.generator;
-
-import java.util.List;
-
-import com.apple.internal.jobjc.generator.model.Clazz;
-import com.apple.internal.jobjc.generator.model.Framework;
-import com.apple.internal.jobjc.generator.model.Function;
-import com.apple.internal.jobjc.generator.model.types.TypeCache;
-
-public class MethodDisambiguator {
- static void disambiguateMethodNames() {
- // link all subclassers off their parents
- for (final Clazz clazz : TypeCache.inst().getAllClasses()) {
- final Clazz superClazz = clazz.superClass;
- if (superClazz != null) superClazz.subClassers.add(clazz);
- }
-
- // recursively call all subclassers, starting from NSObject on down
- disambiguateMethodNamesFor(TypeCache.inst().getClassForName("NSObject"));
-
- // NSProxy does not appear to subclass from NSObject, but it is still a real full class...?
- disambiguateMethodNamesFor(TypeCache.inst().getClassForName("NSProxy"));
- }
-
- static void disambiguateMethodNamesFor(final Clazz clazz) {
- clazz.disambiguateMethods();
- for (final Clazz subClazz : clazz.subClassers) {
- disambiguateMethodNamesFor(subClazz);
- }
- }
-
- public static void disambiguateFunctionsIn(final List frameworks) {
- for (final Framework framework : frameworks) {
- disambiguateFunctionsInFramework(framework);
- }
- }
-
- static void disambiguateFunctionsInFramework(final Framework framework) {
- for (final Function fxn : framework.functions)
- fxn.disambiguateArgs();
- }
-}
diff --git a/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/RestrictedKeywords.java b/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/RestrictedKeywords.java
deleted file mode 100644
index aeaaeee548a..00000000000
--- a/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/RestrictedKeywords.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.internal.jobjc.generator;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-public class RestrictedKeywords {
- static final String[] JAVA_KEYWORD_CONFLICTS = {
- "wait", "null", "class", "new", "toString", "finalize", "boolean", "interface", "final", "static"
- };
-
- static final Set originalRestrictedSet = new HashSet(Arrays.asList(JAVA_KEYWORD_CONFLICTS));
-
- public static Set getNewRestrictedSet() {
- return new HashSet(originalRestrictedSet);
- }
-
- public static boolean isRestricted(String s){
- return originalRestrictedSet.contains(s);
- }
-}
diff --git a/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/Utils.java b/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/Utils.java
deleted file mode 100644
index 7a3459c2164..00000000000
--- a/jdk/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/Utils.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.apple.internal.jobjc.generator;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.regex.Pattern;
-
-import com.apple.internal.jobjc.generator.model.Framework;
-import com.apple.internal.jobjc.generator.model.Framework.FrameworkDependency;
-import com.apple.internal.jobjc.generator.utils.Fp;
-
-public class Utils {
- public static boolean isLeopard = System.getProperty("os.version").startsWith("10.5");
- public static boolean isSnowLeopard = System.getProperty("os.version").startsWith("10.6");
-
- @SuppressWarnings("unchecked")
- public static List list(final Object...args) {
- final ArrayList list = new ArrayList(args.length);
- for (final Object arg : args) list.add(arg);
- return (List)list;
- }
-
- /**
- * A small implementation of UNIX find.
- * @param matchRegex Only collect paths that match this regex.
- * @param pruneRegex Don't recurse down a path that matches this regex. May be null.
- * @throws IOException if File.getCanonicalPath() fails.
- */
- public static List