jvmti_agent.c (209045adc2bbdb2b315fa5539cec54d01cd3e7db) | jvmti_agent.c (598b7c6919c7bbcc1243009721a01bc12275ff3e) |
---|---|
1/* 2 * jvmti_agent.c: JVMTI agent interface 3 * 4 * Adapted from the Oprofile code in opagent.c: 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public 7 * License as published by the Free Software Foundation; either 8 * version 2.1 of the License, or (at your option) any later version. --- 360 unchanged lines hidden (view full) --- 369 370 ret = 0; 371 372 return ret; 373} 374 375int 376jvmti_write_debug_info(void *agent, uint64_t code, const char *file, | 1/* 2 * jvmti_agent.c: JVMTI agent interface 3 * 4 * Adapted from the Oprofile code in opagent.c: 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public 7 * License as published by the Free Software Foundation; either 8 * version 2.1 of the License, or (at your option) any later version. --- 360 unchanged lines hidden (view full) --- 369 370 ret = 0; 371 372 return ret; 373} 374 375int 376jvmti_write_debug_info(void *agent, uint64_t code, const char *file, |
377 jvmtiAddrLocationMap const *map, 378 jvmtiLineNumberEntry *li, jint num) | 377 jvmti_line_info_t *li, int nr_lines) |
379{ | 378{ |
380 static const char *prev_str = "\xff"; | |
381 struct jr_code_debug_info rec; 382 size_t sret, len, size, flen; 383 size_t padding_count; | 379 struct jr_code_debug_info rec; 380 size_t sret, len, size, flen; 381 size_t padding_count; |
382 uint64_t addr; 383 const char *fn = file; |
|
384 FILE *fp = agent; 385 int i; 386 387 /* 388 * no entry to write 389 */ | 384 FILE *fp = agent; 385 int i; 386 387 /* 388 * no entry to write 389 */ |
390 if (!num) | 390 if (!nr_lines) |
391 return 0; 392 393 if (!fp) { 394 warnx("jvmti: invalid fd in write_debug_info"); 395 return -1; 396 } 397 398 flen = strlen(file) + 1; 399 400 rec.p.id = JIT_CODE_DEBUG_INFO; 401 size = sizeof(rec); 402 rec.p.timestamp = perf_get_timestamp(); 403 rec.code_addr = (uint64_t)(uintptr_t)code; | 391 return 0; 392 393 if (!fp) { 394 warnx("jvmti: invalid fd in write_debug_info"); 395 return -1; 396 } 397 398 flen = strlen(file) + 1; 399 400 rec.p.id = JIT_CODE_DEBUG_INFO; 401 size = sizeof(rec); 402 rec.p.timestamp = perf_get_timestamp(); 403 rec.code_addr = (uint64_t)(uintptr_t)code; |
404 rec.nr_entry = num; | 404 rec.nr_entry = nr_lines; |
405 406 /* 407 * on disk source line info layout: 408 * uint64_t : addr 409 * int : line number | 405 406 /* 407 * on disk source line info layout: 408 * uint64_t : addr 409 * int : line number |
410 * int : column discriminator |
|
410 * file[] : source file name 411 * padding : pad to multiple of 8 bytes 412 */ | 411 * file[] : source file name 412 * padding : pad to multiple of 8 bytes 413 */ |
413 size += num * (sizeof(uint64_t) + sizeof(int)); 414 size += flen + (num - 1) * 2; | 414 size += nr_lines * sizeof(struct debug_entry); 415 size += flen * nr_lines; |
415 /* 416 * pad to 8 bytes 417 */ 418 padding_count = PADDING_8ALIGNED(size); 419 420 rec.p.total_size = size + padding_count; 421 422 /* 423 * If JVM is multi-threaded, nultiple concurrent calls to agent 424 * may be possible, so protect file writes 425 */ 426 flockfile(fp); 427 428 sret = fwrite_unlocked(&rec, sizeof(rec), 1, fp); 429 if (sret != 1) 430 goto error; 431 | 416 /* 417 * pad to 8 bytes 418 */ 419 padding_count = PADDING_8ALIGNED(size); 420 421 rec.p.total_size = size + padding_count; 422 423 /* 424 * If JVM is multi-threaded, nultiple concurrent calls to agent 425 * may be possible, so protect file writes 426 */ 427 flockfile(fp); 428 429 sret = fwrite_unlocked(&rec, sizeof(rec), 1, fp); 430 if (sret != 1) 431 goto error; 432 |
432 for (i = 0; i < num; i++) { 433 uint64_t addr; | 433 for (i = 0; i < nr_lines; i++) { |
434 | 434 |
435 addr = (uint64_t)map[i].start_address; | 435 addr = (uint64_t)li[i].pc; |
436 len = sizeof(addr); 437 sret = fwrite_unlocked(&addr, len, 1, fp); 438 if (sret != 1) 439 goto error; 440 | 436 len = sizeof(addr); 437 sret = fwrite_unlocked(&addr, len, 1, fp); 438 if (sret != 1) 439 goto error; 440 |
441 len = sizeof(int); | 441 len = sizeof(li[0].line_number); |
442 sret = fwrite_unlocked(&li[i].line_number, len, 1, fp); 443 if (sret != 1) 444 goto error; 445 | 442 sret = fwrite_unlocked(&li[i].line_number, len, 1, fp); 443 if (sret != 1) 444 goto error; 445 |
446 if (i == 0) { 447 sret = fwrite_unlocked(file, flen, 1, fp); 448 } else { 449 sret = fwrite_unlocked(prev_str, 2, 1, fp); 450 } | 446 len = sizeof(li[0].discrim); 447 sret = fwrite_unlocked(&li[i].discrim, len, 1, fp); |
451 if (sret != 1) 452 goto error; 453 | 448 if (sret != 1) 449 goto error; 450 |
451 sret = fwrite_unlocked(fn, flen, 1, fp); 452 if (sret != 1) 453 goto error; |
|
454 } 455 if (padding_count) 456 sret = fwrite_unlocked(pad_bytes, padding_count, 1, fp); 457 if (sret != 1) 458 goto error; 459 460 funlockfile(fp); 461 return 0; 462error: 463 funlockfile(fp); 464 return -1; 465} | 454 } 455 if (padding_count) 456 sret = fwrite_unlocked(pad_bytes, padding_count, 1, fp); 457 if (sret != 1) 458 goto error; 459 460 funlockfile(fp); 461 return 0; 462error: 463 funlockfile(fp); 464 return -1; 465} |