< prev index next >
src/share/vm/code/relocInfo.hpp
Print this page
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, 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.
@@ -208,10 +208,15 @@
// This stub becomes the target of a static call which must be upgraded
// to a virtual call (because the callee is interpreted).
// See [About Offsets] below.
// //%note reloc_2
//
+// relocInfo::poll_[return_]type -- a safepoint poll
+// Value: none
+// Instruction types: memory load or test
+// Data: none
+//
// For example:
//
// INSTRUCTIONS RELOC: TYPE PREFIX DATA
// ------------ ---- -----------
// sethi %hi(myObject), R oop_type [n(myObject)]
@@ -441,10 +446,15 @@
offset_mask = (1<<offset_width) - 1,
format_mask = (1<<format_width) - 1
};
public:
enum {
+#ifdef _LP64
+ // for use in format
+ // format_width must be at least 1 on _LP64
+ narrow_oop_in_const = 1,
+#endif
// Conservatively large estimate of maximum length (in shorts)
// of any relocation record.
// Extended format is length prefix, data words, and tag/offset suffix.
length_limit = 1 + 1 + (3*BytesPerWord/BytesPerShort) + 1,
have_format = format_width > 0
@@ -760,10 +770,13 @@
x1 = relocInfo::jint_data_at(2, dp, dlen);
}
}
protected:
+ // platform-independent utility for patching constant section
+ void const_set_data_value (address x);
+ void const_verify_data_value (address x);
// platform-dependent utilities for decoding and patching instructions
void pd_set_data_value (address x, intptr_t off, bool verify_only = false); // a set or mem-ref
void pd_verify_data_value (address x, intptr_t off) { pd_set_data_value(x, off, true); }
address pd_call_destination (address orig_addr = NULL);
void pd_set_call_destination (address x);
@@ -870,17 +883,17 @@
virtual int offset() { return 0; }
address value() = 0;
void set_value(address x) { set_value(x, offset()); }
void set_value(address x, intptr_t o) {
if (addr_in_const())
- *(address*)addr() = x;
+ const_set_data_value(x);
else
pd_set_data_value(x, o);
}
void verify_value(address x) {
if (addr_in_const())
- assert(*(address*)addr() == x, "must agree");
+ const_verify_data_value(x);
else
pd_verify_data_value(x, offset());
}
// The "o" (displacement) argument is relevant only to split relocations
@@ -1316,14 +1329,12 @@
bool is_data() { return true; }
relocInfo::relocType type() { return relocInfo::poll_type; }
void fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dest);
};
-class poll_return_Relocation : public Relocation {
- bool is_data() { return true; }
+class poll_return_Relocation : public poll_Relocation {
relocInfo::relocType type() { return relocInfo::poll_return_type; }
- void fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dest);
};
// We know all the xxx_Relocation classes, so now we can define these:
#define EACH_CASE(name) \
inline name##_Relocation* RelocIterator::name##_reloc() { \
< prev index next >