entry_windows.odin 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. //+private
  2. //+build windows
  3. package runtime
  4. import "core:intrinsics"
  5. when ODIN_BUILD_MODE == .Dynamic {
  6. @(link_name="DllMain", linkage="strong", require)
  7. DllMain :: proc "stdcall" (hinstDLL: rawptr, fdwReason: u32, lpReserved: rawptr) -> b32 {
  8. context = default_context()
  9. // Populate Windows DLL-specific global
  10. dll_forward_reason = DLL_Forward_Reason(fdwReason)
  11. switch dll_forward_reason {
  12. case .Process_Attach:
  13. #force_no_inline _startup_runtime()
  14. intrinsics.__entry_point()
  15. case .Process_Detach:
  16. #force_no_inline _cleanup_runtime()
  17. case .Thread_Attach:
  18. break
  19. case .Thread_Detach:
  20. break
  21. }
  22. return true
  23. }
  24. } else when !ODIN_TEST && !ODIN_NO_ENTRY_POINT {
  25. when ODIN_ARCH == .i386 || ODIN_NO_CRT {
  26. @(link_name="mainCRTStartup", linkage="strong", require)
  27. mainCRTStartup :: proc "stdcall" () -> i32 {
  28. context = default_context()
  29. #force_no_inline _startup_runtime()
  30. intrinsics.__entry_point()
  31. #force_no_inline _cleanup_runtime()
  32. return 0
  33. }
  34. } else {
  35. @(link_name="main", linkage="strong", require)
  36. main :: proc "c" (argc: i32, argv: [^]cstring) -> i32 {
  37. args__ = argv[:argc]
  38. context = default_context()
  39. #force_no_inline _startup_runtime()
  40. intrinsics.__entry_point()
  41. #force_no_inline _cleanup_runtime()
  42. return 0
  43. }
  44. }
  45. }