crtnone.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698
  1. /*
  2. * Copyright 2010-2018 Branimir Karadzic. All rights reserved.
  3. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
  4. */
  5. #include "bx_p.h"
  6. #include <bx/debug.h>
  7. #include <bx/file.h>
  8. #include <bx/math.h>
  9. #include <bx/sort.h>
  10. #include <bx/timer.h>
  11. #if BX_CRT_NONE
  12. #include "crt0.h"
  13. #define NOT_IMPLEMENTED() \
  14. { bx::debugPrintf("crtnone: %s not implemented\n", BX_FUNCTION); abort(); }
  15. extern "C" void* memcpy(void* _dst, const void* _src, size_t _numBytes)
  16. {
  17. bx::memCopy(_dst, _src, _numBytes);
  18. return _dst;
  19. }
  20. extern "C" void* memmove(void* _dst, const void* _src, size_t _numBytes)
  21. {
  22. bx::memMove(_dst, _src, _numBytes);
  23. return _dst;
  24. }
  25. extern "C" void* memset(void* _dst, int _ch, size_t _numBytes)
  26. {
  27. bx::memSet(_dst, uint8_t(_ch), _numBytes);
  28. return _dst;
  29. }
  30. #if !BX_PLATFORM_NONE
  31. typedef int64_t off64_t;
  32. typedef int32_t pid_t;
  33. extern "C" int32_t memcmp(const void* _lhs, const void* _rhs, size_t _numBytes)
  34. {
  35. return bx::memCmp(_lhs, _rhs, _numBytes);
  36. }
  37. extern "C" size_t strlen(const char* _str)
  38. {
  39. return bx::strLen(_str);
  40. }
  41. extern "C" size_t strnlen(const char* _str, size_t _max)
  42. {
  43. return bx::strLen(_str, _max);
  44. }
  45. extern "C" void* strcpy(char* _dst, const char* _src)
  46. {
  47. bx::strCopy(_dst, INT32_MAX, _src, INT32_MAX);
  48. return _dst;
  49. }
  50. extern "C" void* strncpy(char* _dst, const char* _src, size_t _num)
  51. {
  52. bx::strCopy(_dst, INT32_MAX, _src, _num);
  53. return _dst;
  54. }
  55. extern "C" char* strcat(char* _dst, const char* _src)
  56. {
  57. bx::strCat(_dst, INT32_MAX, _src, INT32_MAX);
  58. return _dst;
  59. }
  60. extern "C" const char* strchr(const char* _str, int _ch)
  61. {
  62. return bx::strFind(_str, _ch);
  63. }
  64. extern "C" int32_t strcmp(const char* _lhs, const char* _rhs)
  65. {
  66. return bx::strCmp(_lhs, _rhs);
  67. }
  68. extern "C" int32_t strncmp(const char* _lhs, const char* _rhs, size_t _max)
  69. {
  70. return bx::strCmp(_lhs, _rhs, _max);
  71. }
  72. extern "C" int32_t strcasecmp(const char* _lhs, const char* _rhs)
  73. {
  74. return bx::strCmpI(_lhs, _rhs);
  75. }
  76. extern "C" const char* strstr(const char* _str, const char* _find)
  77. {
  78. return bx::strFind(_str, _find);
  79. }
  80. extern "C" void qsort(void* _base, size_t _num, size_t _size, bx::ComparisonFn _fn)
  81. {
  82. BX_CHECK(_num <= UINT32_MAX && _size <= UINT32_MAX, "");
  83. return bx::quickSort(_base, _num, _size, _fn);
  84. }
  85. extern "C" int isprint(int _ch)
  86. {
  87. return bx::isPrint(_ch);
  88. }
  89. extern "C" int toupper (int _ch)
  90. {
  91. return bx::toUpper(_ch);
  92. }
  93. extern "C" size_t mbstowcs(wchar_t* _dst, const char* _src, size_t _max)
  94. {
  95. BX_UNUSED(_dst, _src, _max);
  96. return 0;
  97. }
  98. extern "C" char* strdup(const char* _src)
  99. {
  100. uint32_t size = bx::strLen(_src);
  101. return (char*)malloc(size);
  102. }
  103. extern "C" long int strtol(const char* _str, char** _end, int _base)
  104. {
  105. BX_UNUSED(_str, _end, _base);
  106. NOT_IMPLEMENTED();
  107. return -1;
  108. }
  109. extern "C" int abs(int _value)
  110. {
  111. return _value >= 0 ? _value : -_value;
  112. }
  113. extern "C" float fabsf(float _x)
  114. {
  115. return bx::abs(_x);
  116. }
  117. extern "C" double fabs(double _x)
  118. {
  119. return bx::abs(_x);
  120. }
  121. extern "C" double ldexp(double _x, int _exp)
  122. {
  123. return bx::ldexp(float(_x), _exp);
  124. }
  125. extern "C" float expf(float _x)
  126. {
  127. return bx::exp(_x);
  128. }
  129. extern "C" float logf(float _x)
  130. {
  131. return bx::log(_x);
  132. }
  133. extern "C" float log10f(float _x)
  134. {
  135. BX_UNUSED(_x);
  136. return 0.0f;
  137. }
  138. extern "C" float powf(float _x, float _y)
  139. {
  140. return bx::pow(_x, _y);
  141. }
  142. extern "C" double pow(double _x, float _y)
  143. {
  144. return bx::pow(_x, _y);
  145. }
  146. extern "C" float sinf(float _x)
  147. {
  148. return bx::sin(_x);
  149. }
  150. extern "C" float cosf(float _x)
  151. {
  152. return bx::cos(_x);
  153. }
  154. extern "C" float tanf(float _x)
  155. {
  156. return bx::tan(_x);
  157. }
  158. extern "C" float atan2f(float _y, float _x)
  159. {
  160. return bx::atan2(_y, _x);
  161. }
  162. extern "C" float sqrtf(float _x)
  163. {
  164. return bx::sqrt(_x);
  165. }
  166. extern "C" double sqrt(double _x)
  167. {
  168. return bx::sqrt(_x);
  169. }
  170. extern "C" float ceilf(float _x)
  171. {
  172. return bx::ceil(_x);
  173. }
  174. extern "C" double ceil(double _x)
  175. {
  176. return bx::ceil(_x);
  177. }
  178. extern "C" float floorf(float _x)
  179. {
  180. return bx::floor(_x);
  181. }
  182. extern "C" double floor(double _x)
  183. {
  184. return bx::floor(_x);
  185. }
  186. extern "C" float acosf(float _x)
  187. {
  188. return bx::acos(_x);
  189. }
  190. extern "C" float fmodf(float _numer, float _denom)
  191. {
  192. return bx::mod(_numer, _denom);
  193. }
  194. extern "C" int atoi(const char* _str)
  195. {
  196. int32_t result = 0;
  197. bx::fromString(&result, _str);
  198. return result;
  199. }
  200. extern "C" double atof(const char* _str)
  201. {
  202. double result = 0.0;
  203. bx::fromString(&result, _str);
  204. return result;
  205. }
  206. extern "C" struct DIR* opendir(const char* _dirname)
  207. {
  208. BX_UNUSED(_dirname);
  209. // NOT_IMPLEMENTED();
  210. return NULL;
  211. }
  212. extern "C" struct dirent* readdir(struct DIR* _dirp)
  213. {
  214. BX_UNUSED(_dirp);
  215. NOT_IMPLEMENTED();
  216. return NULL;
  217. }
  218. extern "C" int closedir(struct DIR* _dirp)
  219. {
  220. BX_UNUSED(_dirp);
  221. NOT_IMPLEMENTED();
  222. return 0;
  223. }
  224. extern "C" int vsnprintf(char* _out, size_t _max, const char* _format, va_list _argList)
  225. {
  226. return bx::vsnprintf(_out, _max, _format, _argList);
  227. }
  228. extern "C" int sprintf(char* _out, const char* _format, ...)
  229. {
  230. va_list argList;
  231. va_start(argList, _format);
  232. int32_t len = bx::vsnprintf(_out, INT32_MAX, _format, argList);
  233. va_end(argList);
  234. return len;
  235. }
  236. extern "C" int snprintf(char* _out, size_t _max, const char* _format, ...)
  237. {
  238. va_list argList;
  239. va_start(argList, _format);
  240. int32_t len = bx::vsnprintf(_out, _max, _format, argList);
  241. va_end(argList);
  242. return len;
  243. }
  244. extern "C" int printf(const char* _format, ...)
  245. {
  246. va_list argList;
  247. va_start(argList, _format);
  248. bx::WriterI* writer = bx::getStdOut();
  249. int32_t len = bx::writePrintfVargs(writer, _format, argList);
  250. va_end(argList);
  251. return len;
  252. }
  253. struct FILE
  254. {
  255. };
  256. extern "C" int fprintf(FILE* _stream, const char* _format, ...)
  257. {
  258. BX_UNUSED(_stream, _format);
  259. return -1;
  260. }
  261. extern "C" int vfprintf(FILE* _stream, const char* _format, va_list _argList)
  262. {
  263. BX_UNUSED(_stream, _format, _argList);
  264. return -1;
  265. }
  266. extern "C" int sscanf(const char* _str, const char* _format, ...)
  267. {
  268. BX_UNUSED(_str, _format);
  269. return -1;
  270. }
  271. extern "C" int fscanf(FILE* _stream, const char* _format, ...)
  272. {
  273. BX_UNUSED(_stream, _format);
  274. return -1;
  275. }
  276. FILE * stdout;
  277. extern "C" FILE* fopen(const char* _filename, const char* _mode)
  278. {
  279. BX_UNUSED(_filename, _mode);
  280. bx::debugPrintf("fopen(\"%s\", \"%s\");\n", _filename, _mode);
  281. // NOT_IMPLEMENTED();
  282. return NULL;
  283. }
  284. extern "C" int fclose(FILE* _stream)
  285. {
  286. BX_UNUSED(_stream);
  287. bx::debugPrintf("fclose(%p);\n", _stream);
  288. // NOT_IMPLEMENTED();
  289. return 0;
  290. }
  291. extern "C" size_t fread(void* _ptr, size_t _size, size_t _count, FILE* _stream)
  292. {
  293. BX_UNUSED(_ptr, _size, _count, _stream);
  294. NOT_IMPLEMENTED();
  295. return -1;
  296. }
  297. extern "C" size_t fwrite(const void* _ptr, size_t _size, size_t _count, FILE* _stream)
  298. {
  299. BX_UNUSED(_ptr, _size, _count, _stream);
  300. NOT_IMPLEMENTED();
  301. return -1;
  302. }
  303. extern "C" int fseek(FILE* _stream, long int _offset, int _origin)
  304. {
  305. BX_UNUSED(_stream, _offset, _origin);
  306. NOT_IMPLEMENTED();
  307. return -1;
  308. }
  309. extern "C" int fseeko64(FILE* _stream, off64_t _offset, int _whence)
  310. {
  311. BX_UNUSED(_stream, _offset, _whence);
  312. NOT_IMPLEMENTED();
  313. return -1;
  314. }
  315. extern "C" long int ftell(FILE* _stream)
  316. {
  317. BX_UNUSED(_stream);
  318. NOT_IMPLEMENTED();
  319. return -1;
  320. }
  321. extern "C" off64_t ftello64(FILE* _stream)
  322. {
  323. BX_UNUSED(_stream);
  324. NOT_IMPLEMENTED();
  325. return -1;
  326. }
  327. extern "C" int feof(FILE* _stream)
  328. {
  329. BX_UNUSED(_stream);
  330. NOT_IMPLEMENTED();
  331. return -1;
  332. }
  333. extern "C" int ferror(FILE* _stream)
  334. {
  335. BX_UNUSED(_stream);
  336. NOT_IMPLEMENTED();
  337. return -1;
  338. }
  339. extern "C" FILE* popen(const char* _command, const char* _type)
  340. {
  341. BX_UNUSED(_command, _type);
  342. NOT_IMPLEMENTED();
  343. return NULL;
  344. }
  345. extern "C" int pclose(FILE* _stream)
  346. {
  347. BX_UNUSED(_stream);
  348. NOT_IMPLEMENTED();
  349. return -1;
  350. }
  351. extern "C" int execvp(const char* _file, char* const _argv[])
  352. {
  353. BX_UNUSED(_file, _argv);
  354. NOT_IMPLEMENTED();
  355. return -1;
  356. }
  357. typedef int32_t clockid_t;
  358. inline void toTimespecNs(timespec& _ts, int64_t _nsecs)
  359. {
  360. _ts.tv_sec = _nsecs/INT64_C(1000000000);
  361. _ts.tv_nsec = _nsecs%INT64_C(1000000000);
  362. }
  363. extern "C" int clock_gettime(clockid_t _clock, struct timespec* _ts)
  364. {
  365. BX_UNUSED(_clock);
  366. int64_t now = crt0::getHPCounter();
  367. toTimespecNs(*_ts, now);
  368. return 0;
  369. }
  370. extern "C" long syscall(long _num, ...)
  371. {
  372. va_list argList;
  373. va_start(argList, _num);
  374. long result = -1;
  375. switch (_num)
  376. {
  377. case 39:
  378. result = crt0::processGetId();
  379. break;
  380. case 228:
  381. {
  382. clockid_t arg0 = va_arg(argList, clockid_t);
  383. timespec* arg1 = va_arg(argList, timespec*);
  384. result = clock_gettime(arg0, arg1);
  385. }
  386. break;
  387. default:
  388. bx::debugPrintf("? syscall %d\n", _num);
  389. break;
  390. }
  391. va_end(argList);
  392. return result;
  393. }
  394. extern "C" long sysconf(int name)
  395. {
  396. BX_UNUSED(name);
  397. NOT_IMPLEMENTED();
  398. return -1;
  399. }
  400. extern "C" pid_t fork(void)
  401. {
  402. NOT_IMPLEMENTED();
  403. return -1;
  404. }
  405. extern "C" int sched_yield(void)
  406. {
  407. NOT_IMPLEMENTED();
  408. return -1;
  409. }
  410. extern "C" int prctl(int _option, unsigned long _arg2, unsigned long _arg3, unsigned long _arg4, unsigned long _arg5)
  411. {
  412. BX_UNUSED(_option, _arg2, _arg3, _arg4, _arg5);
  413. NOT_IMPLEMENTED();
  414. return -1;
  415. }
  416. extern "C" int chdir(const char* _path)
  417. {
  418. BX_UNUSED(_path);
  419. bx::debugPrintf("chdir(%s) not implemented!\n", _path);
  420. return -1;
  421. }
  422. extern "C" char* getcwd(char* _buf, size_t _size)
  423. {
  424. BX_UNUSED(_buf, _size);
  425. NOT_IMPLEMENTED();
  426. return NULL;
  427. }
  428. extern "C" char* getenv(const char* _name)
  429. {
  430. return const_cast<char*>(crt0::getEnv(_name) );
  431. }
  432. extern "C" int setenv(const char* _name, const char* _value, int _overwrite)
  433. {
  434. BX_UNUSED(_name, _value, _overwrite);
  435. bx::debugPrintf("setenv(%s, %s, %d) not implemented!\n", _name, _value, _overwrite);
  436. return -1;
  437. }
  438. extern "C" int unsetenv(const char* _name)
  439. {
  440. BX_UNUSED(_name);
  441. bx::debugPrintf("unsetenv(%s) not implemented!\n", _name);
  442. return -1;
  443. }
  444. #if 0
  445. struct timeval
  446. {
  447. time_t tv_sec;
  448. suseconds_t tv_usec;
  449. };
  450. struct timespec
  451. {
  452. time_t tv_sec;
  453. long tv_nsec;
  454. };
  455. #endif //
  456. extern "C" int gettimeofday(struct timeval* _tv, struct timezone* _tz)
  457. {
  458. BX_UNUSED(_tz);
  459. timespec ts;
  460. if (NULL == _tv)
  461. {
  462. return 0;
  463. }
  464. clock_gettime(0 /*CLOCK_REALTIME*/, &ts);
  465. _tv->tv_sec = ts.tv_sec;
  466. _tv->tv_usec = (int)ts.tv_nsec / 1000;
  467. return 0;
  468. }
  469. typedef int64_t time_t;
  470. extern "C" time_t time(time_t* _arg)
  471. {
  472. timespec ts;
  473. clock_gettime(0 /*CLOCK_REALTIME*/, &ts);
  474. time_t result = ts.tv_sec;
  475. if (NULL != _arg)
  476. {
  477. *_arg = result;
  478. }
  479. return result;
  480. }
  481. extern "C" void* realloc(void* _ptr, size_t _size)
  482. {
  483. return crt0::realloc(_ptr, _size);
  484. }
  485. extern "C" void* malloc(size_t _size)
  486. {
  487. return crt0::realloc(NULL, _size);
  488. }
  489. extern "C" void free(void* _ptr)
  490. {
  491. crt0::realloc(_ptr, 0);
  492. }
  493. #endif // BX_PLATFORM_*
  494. extern "C" void abort(void)
  495. {
  496. bx::debugPrintf("crtnone: abort called!\n");
  497. crt0::exit(bx::kExitFailure);
  498. }
  499. extern "C" void __assert_fail(const char* _assertion, const char* _file, uint32_t _line, const char* _function)
  500. {
  501. BX_UNUSED(_assertion, _file, _line, _function);
  502. abort();
  503. }
  504. void* __dso_handle = (void*)&__dso_handle;
  505. void operator delete(void*)
  506. {
  507. }
  508. extern "C" void __cxa_pure_virtual(void)
  509. {
  510. }
  511. extern "C" int __cxa_atexit(void (*_dtorFn)(void*), void* _arg, void* _dsoHandle)
  512. {
  513. BX_UNUSED(_dtorFn, _arg, _dsoHandle);
  514. return 0;
  515. }
  516. extern "C" void __gxx_personality_v0(void)
  517. {
  518. }
  519. extern "C" void _Unwind_Resume(void*)
  520. {
  521. }
  522. extern "C" int __gcc_personality_v0(int _version, ...)
  523. {
  524. BX_UNUSED(_version);
  525. return 0;
  526. }
  527. namespace __cxxabiv1
  528. {
  529. class __class_type_info
  530. {
  531. public:
  532. virtual ~__class_type_info();
  533. const char* m_name;
  534. };
  535. __class_type_info::~__class_type_info()
  536. {
  537. }
  538. class __si_class_type_info : public __class_type_info
  539. {
  540. public:
  541. virtual ~__si_class_type_info();
  542. };
  543. __si_class_type_info::~__si_class_type_info()
  544. {
  545. }
  546. class __vmi_class_type_info : public __class_type_info
  547. {
  548. public:
  549. virtual ~__vmi_class_type_info();
  550. };
  551. __vmi_class_type_info::~__vmi_class_type_info()
  552. {
  553. }
  554. __extension__ typedef int __guard __attribute__( (mode(__DI__) ) );
  555. extern "C" int __cxa_guard_acquire(__guard* _g)
  556. {
  557. return !*(char*)(_g);
  558. }
  559. extern "C" void __cxa_guard_release(__guard* _g)
  560. {
  561. *(char*)_g = 1;
  562. }
  563. extern "C" void __cxa_guard_abort(__guard* _g)
  564. {
  565. BX_UNUSED(_g);
  566. }
  567. } // namespace __cxxabiv1
  568. #endif // BX_CRT_NONE