@@ -17,31 +17,32 @@ extern "C" {
1717
1818// Macros to burn global values in custom sections so out-of-process 
1919// profilers can locate them easily. 
20- 
21- #define  GENERATE_DEBUG_SECTION (name , declaration ) \
22-     _GENERATE_DEBUG_SECTION_WINDOWS(name)         \
23-     _GENERATE_DEBUG_SECTION_APPLE(name)           \
24-     declaration                                   \
25-     _GENERATE_DEBUG_SECTION_LINUX(name)
20+ #define  GENERATE_DEBUG_SECTION (name , declaration )     \
21+    _GENERATE_DEBUG_SECTION_WINDOWS(name)            \
22+    _GENERATE_DEBUG_SECTION_APPLE(name)              \
23+    declaration                                      \
24+    _GENERATE_DEBUG_SECTION_LINUX(name)
2625
2726#if  defined(MS_WINDOWS )
2827#define  _GENERATE_DEBUG_SECTION_WINDOWS (name )                       \
29-      _Pragma(Py_STRINGIFY(section(Py_STRINGIFY(name), read, write))) \
30-      __declspec(allocate(Py_STRINGIFY(name)))
28+    _Pragma(Py_STRINGIFY(section(Py_STRINGIFY(name), read, write))) \
29+    __declspec(allocate(Py_STRINGIFY(name)))
3130#else 
3231#define  _GENERATE_DEBUG_SECTION_WINDOWS (name )
3332#endif 
3433
3534#if  defined(__APPLE__ )
3635#define  _GENERATE_DEBUG_SECTION_APPLE (name ) \
37-     __attribute__((section(SEG_DATA "," Py_STRINGIFY(name))))
36+    __attribute__((section(SEG_DATA "," Py_STRINGIFY(name))))      \
37+    __attribute__((used))
3838#else 
3939#define  _GENERATE_DEBUG_SECTION_APPLE (name )
4040#endif 
4141
4242#if  defined(__linux__ ) &&  (defined(__GNUC__ ) ||  defined(__clang__ ))
4343#define  _GENERATE_DEBUG_SECTION_LINUX (name ) \
44-     __attribute__((section("." Py_STRINGIFY(name))))
44+    __attribute__((section("." Py_STRINGIFY(name))))               \
45+    __attribute__((used))
4546#else 
4647#define  _GENERATE_DEBUG_SECTION_LINUX (name )
4748#endif 
@@ -327,6 +328,29 @@ typedef struct _Py_DebugOffsets {
327328    }, \
328329}
329330
331+ // Collection of extern declarations for debug offset symbols in extension 
332+ // modules. These declarations are here to ensure the compiler marks them 
333+ // as external symbols. Unfortunately there isn't a cross platform way to 
334+ // do this elegantly withing the compilation unit itself as different compilers 
335+ // complain in different ways. 
336+ 
337+ typedef  struct  _Py_AsyncioModuleDebugOffsets  {
338+     struct  _asyncio_task_object  {
339+         uint64_t  size ;
340+         uint64_t  task_name ;
341+         uint64_t  task_awaited_by ;
342+         uint64_t  task_is_task ;
343+         uint64_t  task_awaited_by_is_set ;
344+         uint64_t  task_coro ;
345+     } asyncio_task_object ;
346+     struct  _asyncio_thread_state  {
347+         uint64_t  size ;
348+         uint64_t  asyncio_running_loop ;
349+         uint64_t  asyncio_running_task ;
350+     } asyncio_thread_state ;
351+ } Py_AsyncioModuleDebugOffsets ;
352+ PyAPI_DATA (Py_AsyncioModuleDebugOffsets ) AsyncioDebug ;
353+ 
330354
331355#ifdef  __cplusplus 
332356}
0 commit comments