Skip to content

Commit 7f191ad

Browse files
authored
Factor out hardcoded offsets to PROFILE_PLATFORM_SPECIFIC_DATA struct (#91595)
These offsets are now in asmconstants.h validated against the C struct with static asserts.
1 parent 30775c0 commit 7f191ad

16 files changed

+434
-291
lines changed

src/coreclr/vm/amd64/asmconstants.h

+75
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,81 @@ ASMCONSTANTS_C_ASSERT(CallCountingStubData__TargetForMethod == offsetof(CallCoun
576576
#define CallCountingStubData__TargetForThresholdReached 0x10
577577
ASMCONSTANTS_C_ASSERT(CallCountingStubData__TargetForThresholdReached == offsetof(CallCountingStubData, TargetForThresholdReached))
578578

579+
#ifdef PROFILING_SUPPORTED
580+
#define PROFILE_ENTER 0x1
581+
#define PROFILE_LEAVE 0x2
582+
#define PROFILE_TAILCALL 0x4
583+
584+
#define ASMCONSTANTS_C_ASSERT_OFFSET(type, field) \
585+
ASMCONSTANTS_C_ASSERT(type##__##field == offsetof(type, field))
586+
587+
#if defined(UNIX_AMD64_ABI)
588+
#define SIZEOF__PROFILE_PLATFORM_SPECIFIC_DATA__buffer 0x8*16
589+
ASMCONSTANTS_C_ASSERT(SIZEOF__PROFILE_PLATFORM_SPECIFIC_DATA__buffer ==
590+
sizeof((*(PROFILE_PLATFORM_SPECIFIC_DATA*)0).buffer))
591+
#define SIZEOF__PROFILE_PLATFORM_SPECIFIC_DATA 0x8*22 + SIZEOF__PROFILE_PLATFORM_SPECIFIC_DATA__buffer
592+
#else
593+
#define SIZEOF__PROFILE_PLATFORM_SPECIFIC_DATA__buffer 0
594+
#define SIZEOF__PROFILE_PLATFORM_SPECIFIC_DATA 0x8*12
595+
#endif // UNIX_AMD64_ABI
596+
ASMCONSTANT_SIZEOF_ASSERT(PROFILE_PLATFORM_SPECIFIC_DATA)
597+
598+
#define PROFILE_PLATFORM_SPECIFIC_DATA__functionId 0x0
599+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, functionId)
600+
#define PROFILE_PLATFORM_SPECIFIC_DATA__rbp 0x8
601+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, rbp)
602+
#define PROFILE_PLATFORM_SPECIFIC_DATA__probeRsp 0x10
603+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, probeRsp)
604+
#define PROFILE_PLATFORM_SPECIFIC_DATA__ip 0x18
605+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, ip)
606+
#define PROFILE_PLATFORM_SPECIFIC_DATA__profiledRsp 0x20
607+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, profiledRsp)
608+
#define PROFILE_PLATFORM_SPECIFIC_DATA__rax 0x28
609+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, rax)
610+
#define PROFILE_PLATFORM_SPECIFIC_DATA__hiddenArg 0x30
611+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, hiddenArg)
612+
#define PROFILE_PLATFORM_SPECIFIC_DATA__flt0 0x38
613+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, flt0)
614+
#define PROFILE_PLATFORM_SPECIFIC_DATA__flt1 0x40
615+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, flt1)
616+
#define PROFILE_PLATFORM_SPECIFIC_DATA__flt2 0x48
617+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, flt2)
618+
#define PROFILE_PLATFORM_SPECIFIC_DATA__flt3 0x50
619+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, flt3)
620+
#if defined(UNIX_AMD64_ABI)
621+
#define PROFILE_PLATFORM_SPECIFIC_DATA__flt4 0x58
622+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, flt4)
623+
#define PROFILE_PLATFORM_SPECIFIC_DATA__flt5 0x60
624+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, flt5)
625+
#define PROFILE_PLATFORM_SPECIFIC_DATA__flt6 0x68
626+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, flt6)
627+
#define PROFILE_PLATFORM_SPECIFIC_DATA__flt7 0x70
628+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, flt7)
629+
#define PROFILE_PLATFORM_SPECIFIC_DATA__rdi 0x78
630+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, rdi)
631+
#define PROFILE_PLATFORM_SPECIFIC_DATA__rsi 0x80
632+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, rsi)
633+
#define PROFILE_PLATFORM_SPECIFIC_DATA__rdx 0x88
634+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, rdx)
635+
#define PROFILE_PLATFORM_SPECIFIC_DATA__rcx 0x90
636+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, rcx)
637+
#define PROFILE_PLATFORM_SPECIFIC_DATA__r8 0x98
638+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, r8)
639+
#define PROFILE_PLATFORM_SPECIFIC_DATA__r9 0xa0
640+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, r9)
641+
#define PROFILE_PLATFORM_SPECIFIC_DATA__flags 0xa8
642+
#else // !UNIX_AMD64_ABI
643+
#define PROFILE_PLATFORM_SPECIFIC_DATA__flags 0x58
644+
#endif // UNIX_AMD64_ABI
645+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, flags)
646+
#if defined(UNIX_AMD64_ABI)
647+
#define PROFILE_PLATFORM_SPECIFIC_DATA__buffer 0xb0
648+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, buffer)
649+
#endif
650+
651+
#undef ASMCONSTANTS_C_ASSERT_OFFSET
652+
#endif // PROFILING_SUPPORTED
653+
579654
#undef ASMCONSTANTS_RUNTIME_ASSERT
580655
#undef ASMCONSTANTS_C_ASSERT
581656
#ifndef UNIX_AMD64_ABI

src/coreclr/vm/amd64/asmhelpers.S

+102-139
Large diffs are not rendered by default.

src/coreclr/vm/amd64/cgencpu.h

+40
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,47 @@ struct EHContext {
277277

278278
#include "stublinkeramd64.h"
279279

280+
//**********************************************************************
281+
// Profiling
282+
//**********************************************************************
283+
284+
#ifdef PROFILING_SUPPORTED
285+
286+
#define PROFILE_PLATFORM_SPECIFIC_DATA_BUFFER_SIZE 16
287+
288+
typedef struct _PROFILE_PLATFORM_SPECIFIC_DATA
289+
{
290+
FunctionID functionId;
291+
void *rbp;
292+
void *probeRsp;
293+
void *ip;
294+
void *profiledRsp;
295+
UINT64 rax;
296+
LPVOID hiddenArg;
297+
UINT64 flt0; // floats stored as doubles
298+
UINT64 flt1;
299+
UINT64 flt2;
300+
UINT64 flt3;
301+
#if defined(UNIX_AMD64_ABI)
302+
UINT64 flt4;
303+
UINT64 flt5;
304+
UINT64 flt6;
305+
UINT64 flt7;
306+
UINT64 rdi;
307+
UINT64 rsi;
308+
UINT64 rdx;
309+
UINT64 rcx;
310+
UINT64 r8;
311+
UINT64 r9;
312+
#endif
313+
UINT32 flags;
314+
#if defined(UNIX_AMD64_ABI)
315+
// A buffer to copy structs in to so they are sequential for GetFunctionEnter3Info.
316+
UINT64 buffer[PROFILE_PLATFORM_SPECIFIC_DATA_BUFFER_SIZE];
317+
#endif
318+
} PROFILE_PLATFORM_SPECIFIC_DATA, *PPROFILE_PLATFORM_SPECIFIC_DATA;
280319

320+
#endif // PROFILING_SUPPORTED
281321

282322
//**********************************************************************
283323
// Exception handling

src/coreclr/vm/amd64/profiler.cpp

+1-41
Original file line numberDiff line numberDiff line change
@@ -12,52 +12,12 @@
1212
#include "common.h"
1313

1414
#ifdef PROFILING_SUPPORTED
15+
#include "asmconstants.h"
1516
#include "proftoeeinterfaceimpl.h"
1617
#include "argdestination.h"
1718

1819
MethodDesc *FunctionIdToMethodDesc(FunctionID functionID);
1920

20-
// TODO: move these to some common.h file
21-
// FLAGS
22-
#define PROFILE_ENTER 0x1
23-
#define PROFILE_LEAVE 0x2
24-
#define PROFILE_TAILCALL 0x4
25-
26-
#define PROFILE_PLATFORM_SPECIFIC_DATA_BUFFER_SIZE 16
27-
28-
typedef struct _PROFILE_PLATFORM_SPECIFIC_DATA
29-
{
30-
FunctionID functionId;
31-
void *rbp;
32-
void *probeRsp;
33-
void *ip;
34-
void *profiledRsp;
35-
UINT64 rax;
36-
LPVOID hiddenArg;
37-
UINT64 flt0; // floats stored as doubles
38-
UINT64 flt1;
39-
UINT64 flt2;
40-
UINT64 flt3;
41-
#if defined(UNIX_AMD64_ABI)
42-
UINT64 flt4;
43-
UINT64 flt5;
44-
UINT64 flt6;
45-
UINT64 flt7;
46-
UINT64 rdi;
47-
UINT64 rsi;
48-
UINT64 rdx;
49-
UINT64 rcx;
50-
UINT64 r8;
51-
UINT64 r9;
52-
#endif
53-
UINT32 flags;
54-
#if defined(UNIX_AMD64_ABI)
55-
// A buffer to copy structs in to so they are sequential for GetFunctionEnter3Info.
56-
UINT64 buffer[PROFILE_PLATFORM_SPECIFIC_DATA_BUFFER_SIZE];
57-
#endif
58-
} PROFILE_PLATFORM_SPECIFIC_DATA, *PPROFILE_PLATFORM_SPECIFIC_DATA;
59-
60-
6121
/*
6222
* ProfileGetIPFromPlatformSpecificHandle
6323
*

src/coreclr/vm/arm/asmconstants.h

+25
Original file line numberDiff line numberDiff line change
@@ -235,5 +235,30 @@ ASMCONSTANTS_C_ASSERT(CallCountingStubData__TargetForMethod == offsetof(CallCoun
235235
#define CallCountingStubData__TargetForThresholdReached 0x08
236236
ASMCONSTANTS_C_ASSERT(CallCountingStubData__TargetForThresholdReached == offsetof(CallCountingStubData, TargetForThresholdReached))
237237

238+
#ifdef PROFILING_SUPPORTED
239+
#define PROFILE_ENTER 0x1
240+
#define PROFILE_LEAVE 0x2
241+
#define PROFILE_TAILCALL 0x4
242+
243+
#define SIZEOF__PROFILE_PLATFORM_SPECIFIC_DATA 104
244+
ASMCONSTANTS_C_ASSERT(SIZEOF__PROFILE_PLATFORM_SPECIFIC_DATA == sizeof(PROFILE_PLATFORM_SPECIFIC_DATA))
245+
246+
#define ASMCONSTANTS_C_ASSERT_OFFSET(type, field) \
247+
ASMCONSTANTS_C_ASSERT(type##__##field == offsetof(type, field))
248+
249+
#define PROFILE_PLATFORM_SPECIFIC_DATA__functionId 80
250+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, functionId)
251+
#define PROFILE_PLATFORM_SPECIFIC_DATA__probeSp 84
252+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, probeSp)
253+
#define PROFILE_PLATFORM_SPECIFIC_DATA__profiledSp 88
254+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, profiledSp)
255+
#define PROFILE_PLATFORM_SPECIFIC_DATA__hiddenArg 92
256+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, hiddenArg)
257+
#define PROFILE_PLATFORM_SPECIFIC_DATA__flags 96
258+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, flags)
259+
260+
#undef ASMCONSTANTS_C_ASSERT_OFFSET
261+
#endif // PROFILING_SUPPORTED
262+
238263
#undef ASMCONSTANTS_RUNTIME_ASSERT
239264
#undef ASMCONSTANTS_C_ASSERT

src/coreclr/vm/arm/asmhelpers.S

+7-10
Original file line numberDiff line numberDiff line change
@@ -342,11 +342,8 @@ LEAF_ENTRY JIT_ProfilerEnterLeaveTailcallStub, _TEXT
342342
bx lr
343343
LEAF_END JIT_ProfilerEnterLeaveTailcallStub, _TEXT
344344

345-
#define PROFILE_ENTER 1
346-
#define PROFILE_LEAVE 2
347-
#define PROFILE_TAILCALL 4
348345
// size of profiler data structure plus alignment padding
349-
#define SIZEOF__PROFILE_PLATFORM_SPECIFIC_DATA 104+4
346+
#define PADDED_SIZEOF__PROFILE_PLATFORM_SPECIFIC_DATA SIZEOF__PROFILE_PLATFORM_SPECIFIC_DATA+4
350347

351348
// typedef struct _PROFILE_PLATFORM_SPECIFIC_DATA
352349
// {
@@ -385,23 +382,23 @@ NESTED_ENTRY \helper\()Naked, _TEXT, NoHandler
385382
CHECK_STACK_ALIGNMENT
386383

387384
// set the other args, starting with functionID
388-
str r0, [sp, #80]
385+
str r0, [sp, PROFILE_PLATFORM_SPECIFIC_DATA__functionId]
389386

390387
// probeSp is the original sp when this stub was called
391-
add r2, sp, SIZEOF__PROFILE_PLATFORM_SPECIFIC_DATA+20
392-
str r2, [sp, #84]
388+
add r2, sp, PADDED_SIZEOF__PROFILE_PLATFORM_SPECIFIC_DATA+20
389+
str r2, [sp, PROFILE_PLATFORM_SPECIFIC_DATA__probeSp]
393390

394391
// get the address of the arguments from the frame pointer, store in profiledSp
395392
add r2, r11, #8
396-
str r2, [sp, #88]
393+
str r2, [sp, PROFILE_PLATFORM_SPECIFIC_DATA__profiledSp]
397394

398395
// clear hiddenArg
399396
movw r2, #0
400-
str r2, [sp, #92]
397+
str r2, [sp, PROFILE_PLATFORM_SPECIFIC_DATA__hiddenArg]
401398
402399
// set the flag to indicate what hook this is
403400
movw r2, \flags
404-
str r2, [sp, #96]
401+
str r2, [sp, PROFILE_PLATFORM_SPECIFIC_DATA__flags]
405402

406403
// sp is the address of PROFILE_PLATFORM_SPECIFIC_DATA, then call to C++
407404
mov r1, sp

src/coreclr/vm/arm/cgencpu.h

+27
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,33 @@ struct EHContext {
174174

175175
#define ARGUMENTREGISTERS_SIZE sizeof(ArgumentRegisters)
176176

177+
178+
//**********************************************************************
179+
// Profiling
180+
//**********************************************************************
181+
182+
#ifdef PROFILING_SUPPORTED
183+
184+
typedef struct _PROFILE_PLATFORM_SPECIFIC_DATA
185+
{
186+
UINT32 r0; // Keep r0 & r1 contiguous to make returning 64-bit results easier
187+
UINT32 r1;
188+
void *R11;
189+
void *Pc;
190+
union // Float arg registers as 32-bit (s0-s15) and 64-bit (d0-d7)
191+
{
192+
UINT32 s[16];
193+
UINT64 d[8];
194+
};
195+
FunctionID functionId;
196+
void *probeSp; // stack pointer of managed function
197+
void *profiledSp; // location of arguments on stack
198+
LPVOID hiddenArg;
199+
UINT32 flags;
200+
} PROFILE_PLATFORM_SPECIFIC_DATA, *PPROFILE_PLATFORM_SPECIFIC_DATA;
201+
202+
#endif // PROFILING_SUPPORTED
203+
177204
//**********************************************************************
178205
// Exception handling
179206
//**********************************************************************

src/coreclr/vm/arm/profiler.cpp

+1-25
Original file line numberDiff line numberDiff line change
@@ -13,34 +13,10 @@
1313

1414
#ifdef PROFILING_SUPPORTED
1515
#include "proftoeeinterfaceimpl.h"
16+
#include "asmconstants.h"
1617

1718
MethodDesc *FunctionIdToMethodDesc(FunctionID functionID);
1819

19-
// TODO: move these to some common.h file
20-
// FLAGS
21-
#define PROFILE_ENTER 0x1
22-
#define PROFILE_LEAVE 0x2
23-
#define PROFILE_TAILCALL 0x4
24-
25-
typedef struct _PROFILE_PLATFORM_SPECIFIC_DATA
26-
{
27-
UINT32 r0; // Keep r0 & r1 contiguous to make returning 64-bit results easier
28-
UINT32 r1;
29-
void *R11;
30-
void *Pc;
31-
union // Float arg registers as 32-bit (s0-s15) and 64-bit (d0-d7)
32-
{
33-
UINT32 s[16];
34-
UINT64 d[8];
35-
};
36-
FunctionID functionId;
37-
void *probeSp; // stack pointer of managed function
38-
void *profiledSp; // location of arguments on stack
39-
LPVOID hiddenArg;
40-
UINT32 flags;
41-
} PROFILE_PLATFORM_SPECIFIC_DATA, *PPROFILE_PLATFORM_SPECIFIC_DATA;
42-
43-
4420
/*
4521
* ProfileGetIPFromPlatformSpecificHandle
4622
*

src/coreclr/vm/arm64/asmconstants.h

+39
Original file line numberDiff line numberDiff line change
@@ -233,5 +233,44 @@ ASMCONSTANTS_C_ASSERT(CallCountingStubData__TargetForMethod == offsetof(CallCoun
233233
#define CallCountingStubData__TargetForThresholdReached 0x10
234234
ASMCONSTANTS_C_ASSERT(CallCountingStubData__TargetForThresholdReached == offsetof(CallCountingStubData, TargetForThresholdReached))
235235

236+
#ifdef PROFILING_SUPPORTED
237+
#define PROFILE_ENTER 0x1
238+
#define PROFILE_LEAVE 0x2
239+
#define PROFILE_TAILCALL 0x4
240+
241+
#define SIZEOF__PROFILE_PLATFORM_SPECIFIC_DATA 320
242+
ASMCONSTANTS_C_ASSERT(SIZEOF__PROFILE_PLATFORM_SPECIFIC_DATA == sizeof(PROFILE_PLATFORM_SPECIFIC_DATA))
243+
244+
#define ASMCONSTANTS_C_ASSERT_OFFSET(type, field) \
245+
ASMCONSTANTS_C_ASSERT(type##__##field == offsetof(type, field))
246+
247+
#define PROFILE_PLATFORM_SPECIFIC_DATA__Fp 0
248+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, Fp)
249+
#define PROFILE_PLATFORM_SPECIFIC_DATA__Pc 8
250+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, Pc)
251+
#define PROFILE_PLATFORM_SPECIFIC_DATA__x8 16
252+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, x8)
253+
#define PROFILE_PLATFORM_SPECIFIC_DATA__argumentRegisters 24
254+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, argumentRegisters)
255+
#define PROFILE_PLATFORM_SPECIFIC_DATA__functionId 88
256+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, functionId)
257+
#define PROFILE_PLATFORM_SPECIFIC_DATA__floatArgumentRegisters 96
258+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, floatArgumentRegisters)
259+
#define PROFILE_PLATFORM_SPECIFIC_DATA__probeSp 224
260+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, probeSp)
261+
#define PROFILE_PLATFORM_SPECIFIC_DATA__profiledSp 232
262+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, profiledSp)
263+
#define PROFILE_PLATFORM_SPECIFIC_DATA__hiddenArg 240
264+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, hiddenArg)
265+
#define PROFILE_PLATFORM_SPECIFIC_DATA__flags 248
266+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, flags)
267+
#define PROFILE_PLATFORM_SPECIFIC_DATA__unused 252
268+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, unused)
269+
#define PROFILE_PLATFORM_SPECIFIC_DATA__buffer 256
270+
ASMCONSTANTS_C_ASSERT_OFFSET(PROFILE_PLATFORM_SPECIFIC_DATA, buffer)
271+
272+
#undef ASMCONSTANTS_C_ASSERT_OFFSET
273+
#endif // PROFILING_SUPPORTED
274+
236275
#undef ASMCONSTANTS_RUNTIME_ASSERT
237276
#undef ASMCONSTANTS_C_ASSERT

0 commit comments

Comments
 (0)