< prev index next >

src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp

Print this page
8205199: more Linux clang compile failures
Contributed-by: <Arthur Eubanks> aeubanks@google.com, Thomas Stuefe <thomas.stuefe@gmail.com>
Reviewed-by: dholmes, kbarrett, stuefe


  79 # include <fpu_control.h>
  80 #endif
  81 
  82 #ifdef AMD64
  83 #define REG_SP REG_RSP
  84 #define REG_PC REG_RIP
  85 #define REG_FP REG_RBP
  86 #define SPELL_REG_SP "rsp"
  87 #define SPELL_REG_FP "rbp"
  88 #else
  89 #define REG_SP REG_UESP
  90 #define REG_PC REG_EIP
  91 #define REG_FP REG_EBP
  92 #define SPELL_REG_SP "esp"
  93 #define SPELL_REG_FP "ebp"
  94 #endif // AMD64
  95 
  96 address os::current_stack_pointer() {
  97 #ifdef SPARC_WORKS
  98   register void *esp;
  99   __asm__("mov %%"SPELL_REG_SP", %0":"=r"(esp));
 100   return (address) ((char*)esp + sizeof(long)*2);
 101 #elif defined(__clang__)
 102   intptr_t* esp;
 103   __asm__ __volatile__ ("mov %%"SPELL_REG_SP", %0":"=r"(esp):);
 104   return (address) esp;
 105 #else
 106   register void *esp __asm__ (SPELL_REG_SP);
 107   return (address) esp;
 108 #endif
 109 }
 110 
 111 char* os::non_memory_address_word() {
 112   // Must never look like an address returned by reserve_memory,
 113   // even in its subfields (as defined by the CPU immediate fields,
 114   // if the CPU splits constants across multiple instructions).
 115 
 116   return (char*) -1;
 117 }
 118 
 119 void os::initialize_thread(Thread* thr) {
 120 // Nothing to do.
 121 }
 122 
 123 address os::Linux::ucontext_get_pc(const ucontext_t * uc) {


 217       if (!fr->is_java_frame()) {
 218         assert(!fr->is_first_frame(), "Safety check");
 219         // See java_sender() comment above.
 220         *fr = fr->java_sender();
 221       }
 222     }
 223   }
 224   assert(fr->is_java_frame(), "Safety check");
 225   return true;
 226 }
 227 
 228 // By default, gcc always save frame pointer (%ebp/%rbp) on stack. It may get
 229 // turned off by -fomit-frame-pointer,
 230 frame os::get_sender_for_C_frame(frame* fr) {
 231   return frame(fr->sender_sp(), fr->link(), fr->sender_pc());
 232 }
 233 
 234 intptr_t* _get_previous_fp() {
 235 #ifdef SPARC_WORKS
 236   register intptr_t **ebp;
 237   __asm__("mov %%"SPELL_REG_FP", %0":"=r"(ebp));
 238 #elif defined(__clang__)
 239   intptr_t **ebp;
 240   __asm__ __volatile__ ("mov %%"SPELL_REG_FP", %0":"=r"(ebp):);
 241 #else
 242   register intptr_t **ebp __asm__ (SPELL_REG_FP);
 243 #endif
 244   // ebp is for this frame (_get_previous_fp). We want the ebp for the
 245   // caller of os::current_frame*(), so go up two frames. However, for
 246   // optimized builds, _get_previous_fp() will be inlined, so only go
 247   // up 1 frame in that case.
 248 #ifdef _NMT_NOINLINE_
 249   return **(intptr_t***)ebp;
 250 #else
 251   return *ebp;
 252 #endif
 253 }
 254 
 255 
 256 frame os::current_frame() {
 257   intptr_t* fp = _get_previous_fp();
 258   frame myframe((intptr_t*)os::current_stack_pointer(),
 259                 (intptr_t*)fp,
 260                 CAST_FROM_FN_PTR(address, os::current_frame));




  79 # include <fpu_control.h>
  80 #endif
  81 
  82 #ifdef AMD64
  83 #define REG_SP REG_RSP
  84 #define REG_PC REG_RIP
  85 #define REG_FP REG_RBP
  86 #define SPELL_REG_SP "rsp"
  87 #define SPELL_REG_FP "rbp"
  88 #else
  89 #define REG_SP REG_UESP
  90 #define REG_PC REG_EIP
  91 #define REG_FP REG_EBP
  92 #define SPELL_REG_SP "esp"
  93 #define SPELL_REG_FP "ebp"
  94 #endif // AMD64
  95 
  96 address os::current_stack_pointer() {
  97 #ifdef SPARC_WORKS
  98   register void *esp;
  99   __asm__("mov %%" SPELL_REG_SP ", %0":"=r"(esp));
 100   return (address) ((char*)esp + sizeof(long)*2);
 101 #elif defined(__clang__)
 102   intptr_t* esp;
 103   __asm__ __volatile__ ("mov %%" SPELL_REG_SP ", %0":"=r"(esp):);
 104   return (address) esp;
 105 #else
 106   register void *esp __asm__ (SPELL_REG_SP);
 107   return (address) esp;
 108 #endif
 109 }
 110 
 111 char* os::non_memory_address_word() {
 112   // Must never look like an address returned by reserve_memory,
 113   // even in its subfields (as defined by the CPU immediate fields,
 114   // if the CPU splits constants across multiple instructions).
 115 
 116   return (char*) -1;
 117 }
 118 
 119 void os::initialize_thread(Thread* thr) {
 120 // Nothing to do.
 121 }
 122 
 123 address os::Linux::ucontext_get_pc(const ucontext_t * uc) {


 217       if (!fr->is_java_frame()) {
 218         assert(!fr->is_first_frame(), "Safety check");
 219         // See java_sender() comment above.
 220         *fr = fr->java_sender();
 221       }
 222     }
 223   }
 224   assert(fr->is_java_frame(), "Safety check");
 225   return true;
 226 }
 227 
 228 // By default, gcc always save frame pointer (%ebp/%rbp) on stack. It may get
 229 // turned off by -fomit-frame-pointer,
 230 frame os::get_sender_for_C_frame(frame* fr) {
 231   return frame(fr->sender_sp(), fr->link(), fr->sender_pc());
 232 }
 233 
 234 intptr_t* _get_previous_fp() {
 235 #ifdef SPARC_WORKS
 236   register intptr_t **ebp;
 237   __asm__("mov %%" SPELL_REG_FP ", %0":"=r"(ebp));
 238 #elif defined(__clang__)
 239   intptr_t **ebp;
 240   __asm__ __volatile__ ("mov %%" SPELL_REG_FP ", %0":"=r"(ebp):);
 241 #else
 242   register intptr_t **ebp __asm__ (SPELL_REG_FP);
 243 #endif
 244   // ebp is for this frame (_get_previous_fp). We want the ebp for the
 245   // caller of os::current_frame*(), so go up two frames. However, for
 246   // optimized builds, _get_previous_fp() will be inlined, so only go
 247   // up 1 frame in that case.
 248 #ifdef _NMT_NOINLINE_
 249   return **(intptr_t***)ebp;
 250 #else
 251   return *ebp;
 252 #endif
 253 }
 254 
 255 
 256 frame os::current_frame() {
 257   intptr_t* fp = _get_previous_fp();
 258   frame myframe((intptr_t*)os::current_stack_pointer(),
 259                 (intptr_t*)fp,
 260                 CAST_FROM_FN_PTR(address, os::current_frame));


< prev index next >