narmutil.pas 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. {
  2. Copyright (c) 2019 by Florian Klämpfl
  3. ARM version of some node tree helper routines
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 2 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. ****************************************************************************
  16. }
  17. unit narmutil;
  18. {$i fpcdefs.inc}
  19. interface
  20. uses
  21. ngenutil;
  22. type
  23. tarmnodeutils = class(tnodeutils)
  24. class procedure InsertObjectInfo; override;
  25. end;
  26. implementation
  27. uses
  28. verbose,
  29. systems,
  30. globals,
  31. cpuinfo,
  32. aasmdata,aasmtai;
  33. const
  34. Tag_File = 1;
  35. Tag_Section = 2;
  36. Tag_Symbol = 3;
  37. Tag_CPU_raw_name = 4;
  38. Tag_CPU_name = 5;
  39. Tag_CPU_arch = 6;
  40. Tag_CPU_arch_profile = 7;
  41. Tag_ARM_ISA_use = 8;
  42. Tag_THUMB_ISA_use = 9;
  43. Tag_FP_Arch = 10;
  44. Tag_WMMX_arch = 11;
  45. Tag_Advanced_SIMD_arch = 12;
  46. Tag_PCS_config = 13;
  47. Tag_ABI_PCS_R9_use = 14;
  48. Tag_ABI_PCS_RW_data = 15;
  49. Tag_ABI_PCS_RO_data = 16;
  50. Tag_ABI_PCS_GOT_use = 17;
  51. Tag_ABI_PCS_wchar_t = 18;
  52. Tag_ABI_FP_rounding = 19;
  53. Tag_ABI_FP_denormal = 20;
  54. Tag_ABI_FP_exceptions = 21;
  55. Tag_ABI_FP_user_exceptions = 22;
  56. Tag_ABI_FP_number_model = 23;
  57. Tag_ABI_align_needed = 24;
  58. Tag_ABI_align8_preserved = 25;
  59. Tag_ABI_enum_size = 26;
  60. Tag_ABI_HardFP_use = 27;
  61. Tag_ABI_VFP_args = 28;
  62. Tag_ABI_WMMX_args = 29;
  63. Tag_ABI_optimization_goals = 30;
  64. Tag_ABI_FP_optimization_goals = 31;
  65. Tag_compatiblity = 32;
  66. Tag_CPU_unaligned_access = 34;
  67. Tag_FP_HP_extension = 36;
  68. Tag_ABI_FP_16bit_format = 38;
  69. Tag_MPextension_use = 42;
  70. Tag_DIV_use = 44;
  71. Tag_nodefaults = 64;
  72. Tag_also_compatible_with = 65;
  73. Tag_conformance = 67;
  74. Tag_T2EE_use = 66;
  75. Tag_Virtualization_use = 68;
  76. class procedure tarmnodeutils.InsertObjectInfo;
  77. begin
  78. inherited InsertObjectInfo;
  79. { write eabi attributes to object file? }
  80. if (target_info.system in [system_arm_linux]) and (target_info.abi in [abi_eabihf,abi_eabi]) then
  81. begin
  82. case current_settings.cputype of
  83. cpu_armv3:
  84. begin
  85. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch,0));
  86. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch_profile,0));
  87. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_name,''));
  88. end;
  89. cpu_armv4:
  90. begin
  91. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch,1));
  92. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch_profile,0));
  93. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_name,'4'));
  94. end;
  95. cpu_armv4t:
  96. begin
  97. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch,2));
  98. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch_profile,0));
  99. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_name,'4T'));
  100. end;
  101. cpu_armv5t:
  102. begin
  103. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch,3));
  104. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch_profile,0));
  105. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_name,'5T'));
  106. end;
  107. cpu_armv5te:
  108. begin
  109. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch,4));
  110. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch_profile,0));
  111. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_name,'5TE'));
  112. end;
  113. cpu_armv5tej:
  114. begin
  115. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch,5));
  116. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch_profile,0));
  117. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_name,'5TEJ'));
  118. end;
  119. cpu_armv6:
  120. begin
  121. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch,6));
  122. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch_profile,0));
  123. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_name,'6'));
  124. end;
  125. cpu_armv6k:
  126. begin
  127. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch,9));
  128. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch_profile,0));
  129. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_name,'6K'));
  130. end;
  131. cpu_armv6t2:
  132. begin
  133. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch,8));
  134. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch_profile,0));
  135. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_name,'T2'));
  136. end;
  137. cpu_armv6z:
  138. begin
  139. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch,7));
  140. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch_profile,0));
  141. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_name,'6Z'));
  142. end;
  143. cpu_armv6m:
  144. begin
  145. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch,11));
  146. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch_profile,0));
  147. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_name,'6-M'));
  148. end;
  149. cpu_armv7:
  150. begin
  151. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch,10));
  152. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch_profile,0));
  153. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_name,'7'));
  154. end;
  155. cpu_armv7a:
  156. begin
  157. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch,10));
  158. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch_profile,$41));
  159. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_name,'7-A'));
  160. end;
  161. cpu_armv7r:
  162. begin
  163. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch,10));
  164. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch_profile,$52));
  165. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_name,'7-R'));
  166. end;
  167. cpu_armv7m:
  168. begin
  169. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch,10));
  170. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch_profile,$4D));
  171. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_name,'7-M'));
  172. end;
  173. cpu_armv7em:
  174. begin
  175. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch,13));
  176. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_arch_profile,$4D));
  177. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_CPU_name,'7E-M'));
  178. end;
  179. else
  180. Internalerror(2019100602);
  181. end;
  182. case current_settings.fputype of
  183. fpu_soft,
  184. fpu_libgcc:
  185. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_FP_Arch,0));
  186. fpu_vfpv2:
  187. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_FP_Arch,2));
  188. fpu_vfpv3,
  189. fpu_neon_vfpv3:
  190. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_FP_Arch,3));
  191. fpu_vfpv3_d16:
  192. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_FP_Arch,4));
  193. fpu_fpv4_s16:
  194. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_FP_Arch,6));
  195. fpu_vfpv4,
  196. fpu_neon_vfpv4:
  197. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_FP_Arch,5));
  198. else
  199. Internalerror(2019100603);
  200. end;
  201. if FPUARM_HAS_FMA in fpu_capabilities[current_settings.fputype] then
  202. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_Advanced_SIMD_arch,2))
  203. else if FPUARM_HAS_NEON in fpu_capabilities[current_settings.fputype] then
  204. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_Advanced_SIMD_arch,1))
  205. else
  206. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_Advanced_SIMD_arch,0));
  207. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_ARM_ISA_use,1));
  208. if CPUARM_HAS_THUMB2 in cpu_capabilities[current_settings.cputype] then
  209. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_THUMB_ISA_use,2))
  210. else
  211. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_THUMB_ISA_use,1));
  212. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_ABI_VFP_args,1));
  213. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_ABI_FP_denormal,1));
  214. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_ABI_FP_exceptions,1));
  215. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_ABI_FP_number_model,3));
  216. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_ABI_align_needed,0));
  217. current_asmdata.asmlists[al_start].Concat(tai_eabi_attribute.create(Tag_ABI_align8_preserved,1));
  218. { gcc typically writes more like enum size, wchar size, optimization goal, however, this
  219. is normally not module global in FPC }
  220. end;
  221. end;
  222. begin
  223. cnodeutils:=tarmnodeutils;
  224. end.