AVR.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. //===--- AVR.cpp - Implement AVR target feature support -------------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file implements AVR TargetInfo objects.
  10. //
  11. //===----------------------------------------------------------------------===//
  12. #include "AVR.h"
  13. #include "clang/Basic/MacroBuilder.h"
  14. #include "llvm/ADT/StringSwitch.h"
  15. using namespace clang;
  16. using namespace clang::targets;
  17. namespace clang {
  18. namespace targets {
  19. /// Information about a specific microcontroller.
  20. struct LLVM_LIBRARY_VISIBILITY MCUInfo {
  21. const char *Name;
  22. const char *DefineName;
  23. };
  24. // This list should be kept up-to-date with AVRDevices.td in LLVM.
  25. static MCUInfo AVRMcus[] = {
  26. {"at90s1200", "__AVR_AT90S1200__"},
  27. {"attiny11", "__AVR_ATtiny11__"},
  28. {"attiny12", "__AVR_ATtiny12__"},
  29. {"attiny15", "__AVR_ATtiny15__"},
  30. {"attiny28", "__AVR_ATtiny28__"},
  31. {"at90s2313", "__AVR_AT90S2313__"},
  32. {"at90s2323", "__AVR_AT90S2323__"},
  33. {"at90s2333", "__AVR_AT90S2333__"},
  34. {"at90s2343", "__AVR_AT90S2343__"},
  35. {"attiny22", "__AVR_ATtiny22__"},
  36. {"attiny26", "__AVR_ATtiny26__"},
  37. {"at86rf401", "__AVR_AT86RF401__"},
  38. {"at90s4414", "__AVR_AT90S4414__"},
  39. {"at90s4433", "__AVR_AT90S4433__"},
  40. {"at90s4434", "__AVR_AT90S4434__"},
  41. {"at90s8515", "__AVR_AT90S8515__"},
  42. {"at90c8534", "__AVR_AT90c8534__"},
  43. {"at90s8535", "__AVR_AT90S8535__"},
  44. {"ata5272", "__AVR_ATA5272__"},
  45. {"attiny13", "__AVR_ATtiny13__"},
  46. {"attiny13a", "__AVR_ATtiny13A__"},
  47. {"attiny2313", "__AVR_ATtiny2313__"},
  48. {"attiny2313a", "__AVR_ATtiny2313A__"},
  49. {"attiny24", "__AVR_ATtiny24__"},
  50. {"attiny24a", "__AVR_ATtiny24A__"},
  51. {"attiny4313", "__AVR_ATtiny4313__"},
  52. {"attiny44", "__AVR_ATtiny44__"},
  53. {"attiny44a", "__AVR_ATtiny44A__"},
  54. {"attiny84", "__AVR_ATtiny84__"},
  55. {"attiny84a", "__AVR_ATtiny84A__"},
  56. {"attiny25", "__AVR_ATtiny25__"},
  57. {"attiny45", "__AVR_ATtiny45__"},
  58. {"attiny85", "__AVR_ATtiny85__"},
  59. {"attiny261", "__AVR_ATtiny261__"},
  60. {"attiny261a", "__AVR_ATtiny261A__"},
  61. {"attiny461", "__AVR_ATtiny461__"},
  62. {"attiny461a", "__AVR_ATtiny461A__"},
  63. {"attiny861", "__AVR_ATtiny861__"},
  64. {"attiny861a", "__AVR_ATtiny861A__"},
  65. {"attiny87", "__AVR_ATtiny87__"},
  66. {"attiny43u", "__AVR_ATtiny43U__"},
  67. {"attiny48", "__AVR_ATtiny48__"},
  68. {"attiny88", "__AVR_ATtiny88__"},
  69. {"attiny828", "__AVR_ATtiny828__"},
  70. {"at43usb355", "__AVR_AT43USB355__"},
  71. {"at76c711", "__AVR_AT76C711__"},
  72. {"atmega103", "__AVR_ATmega103__"},
  73. {"at43usb320", "__AVR_AT43USB320__"},
  74. {"attiny167", "__AVR_ATtiny167__"},
  75. {"at90usb82", "__AVR_AT90USB82__"},
  76. {"at90usb162", "__AVR_AT90USB162__"},
  77. {"ata5505", "__AVR_ATA5505__"},
  78. {"atmega8u2", "__AVR_ATmega8U2__"},
  79. {"atmega16u2", "__AVR_ATmega16U2__"},
  80. {"atmega32u2", "__AVR_ATmega32U2__"},
  81. {"attiny1634", "__AVR_ATtiny1634__"},
  82. {"atmega8", "__AVR_ATmega8__"},
  83. {"ata6289", "__AVR_ATA6289__"},
  84. {"atmega8a", "__AVR_ATmega8A__"},
  85. {"ata6285", "__AVR_ATA6285__"},
  86. {"ata6286", "__AVR_ATA6286__"},
  87. {"atmega48", "__AVR_ATmega48__"},
  88. {"atmega48a", "__AVR_ATmega48A__"},
  89. {"atmega48pa", "__AVR_ATmega48PA__"},
  90. {"atmega48p", "__AVR_ATmega48P__"},
  91. {"atmega88", "__AVR_ATmega88__"},
  92. {"atmega88a", "__AVR_ATmega88A__"},
  93. {"atmega88p", "__AVR_ATmega88P__"},
  94. {"atmega88pa", "__AVR_ATmega88PA__"},
  95. {"atmega8515", "__AVR_ATmega8515__"},
  96. {"atmega8535", "__AVR_ATmega8535__"},
  97. {"atmega8hva", "__AVR_ATmega8HVA__"},
  98. {"at90pwm1", "__AVR_AT90PWM1__"},
  99. {"at90pwm2", "__AVR_AT90PWM2__"},
  100. {"at90pwm2b", "__AVR_AT90PWM2B__"},
  101. {"at90pwm3", "__AVR_AT90PWM3__"},
  102. {"at90pwm3b", "__AVR_AT90PWM3B__"},
  103. {"at90pwm81", "__AVR_AT90PWM81__"},
  104. {"ata5790", "__AVR_ATA5790__"},
  105. {"ata5795", "__AVR_ATA5795__"},
  106. {"atmega16", "__AVR_ATmega16__"},
  107. {"atmega16a", "__AVR_ATmega16A__"},
  108. {"atmega161", "__AVR_ATmega161__"},
  109. {"atmega162", "__AVR_ATmega162__"},
  110. {"atmega163", "__AVR_ATmega163__"},
  111. {"atmega164a", "__AVR_ATmega164A__"},
  112. {"atmega164p", "__AVR_ATmega164P__"},
  113. {"atmega164pa", "__AVR_ATmega164PA__"},
  114. {"atmega165", "__AVR_ATmega165__"},
  115. {"atmega165a", "__AVR_ATmega165A__"},
  116. {"atmega165p", "__AVR_ATmega165P__"},
  117. {"atmega165pa", "__AVR_ATmega165PA__"},
  118. {"atmega168", "__AVR_ATmega168__"},
  119. {"atmega168a", "__AVR_ATmega168A__"},
  120. {"atmega168p", "__AVR_ATmega168P__"},
  121. {"atmega168pa", "__AVR_ATmega168PA__"},
  122. {"atmega169", "__AVR_ATmega169__"},
  123. {"atmega169a", "__AVR_ATmega169A__"},
  124. {"atmega169p", "__AVR_ATmega169P__"},
  125. {"atmega169pa", "__AVR_ATmega169PA__"},
  126. {"atmega32", "__AVR_ATmega32__"},
  127. {"atmega32a", "__AVR_ATmega32A__"},
  128. {"atmega323", "__AVR_ATmega323__"},
  129. {"atmega324a", "__AVR_ATmega324A__"},
  130. {"atmega324p", "__AVR_ATmega324P__"},
  131. {"atmega324pa", "__AVR_ATmega324PA__"},
  132. {"atmega325", "__AVR_ATmega325__"},
  133. {"atmega325a", "__AVR_ATmega325A__"},
  134. {"atmega325p", "__AVR_ATmega325P__"},
  135. {"atmega325pa", "__AVR_ATmega325PA__"},
  136. {"atmega3250", "__AVR_ATmega3250__"},
  137. {"atmega3250a", "__AVR_ATmega3250A__"},
  138. {"atmega3250p", "__AVR_ATmega3250P__"},
  139. {"atmega3250pa", "__AVR_ATmega3250PA__"},
  140. {"atmega328", "__AVR_ATmega328__"},
  141. {"atmega328p", "__AVR_ATmega328P__"},
  142. {"atmega329", "__AVR_ATmega329__"},
  143. {"atmega329a", "__AVR_ATmega329A__"},
  144. {"atmega329p", "__AVR_ATmega329P__"},
  145. {"atmega329pa", "__AVR_ATmega329PA__"},
  146. {"atmega3290", "__AVR_ATmega3290__"},
  147. {"atmega3290a", "__AVR_ATmega3290A__"},
  148. {"atmega3290p", "__AVR_ATmega3290P__"},
  149. {"atmega3290pa", "__AVR_ATmega3290PA__"},
  150. {"atmega406", "__AVR_ATmega406__"},
  151. {"atmega64", "__AVR_ATmega64__"},
  152. {"atmega64a", "__AVR_ATmega64A__"},
  153. {"atmega640", "__AVR_ATmega640__"},
  154. {"atmega644", "__AVR_ATmega644__"},
  155. {"atmega644a", "__AVR_ATmega644A__"},
  156. {"atmega644p", "__AVR_ATmega644P__"},
  157. {"atmega644pa", "__AVR_ATmega644PA__"},
  158. {"atmega645", "__AVR_ATmega645__"},
  159. {"atmega645a", "__AVR_ATmega645A__"},
  160. {"atmega645p", "__AVR_ATmega645P__"},
  161. {"atmega649", "__AVR_ATmega649__"},
  162. {"atmega649a", "__AVR_ATmega649A__"},
  163. {"atmega649p", "__AVR_ATmega649P__"},
  164. {"atmega6450", "__AVR_ATmega6450__"},
  165. {"atmega6450a", "__AVR_ATmega6450A__"},
  166. {"atmega6450p", "__AVR_ATmega6450P__"},
  167. {"atmega6490", "__AVR_ATmega6490__"},
  168. {"atmega6490a", "__AVR_ATmega6490A__"},
  169. {"atmega6490p", "__AVR_ATmega6490P__"},
  170. {"atmega64rfr2", "__AVR_ATmega64RFR2__"},
  171. {"atmega644rfr2", "__AVR_ATmega644RFR2__"},
  172. {"atmega16hva", "__AVR_ATmega16HVA__"},
  173. {"atmega16hva2", "__AVR_ATmega16HVA2__"},
  174. {"atmega16hvb", "__AVR_ATmega16HVB__"},
  175. {"atmega16hvbrevb", "__AVR_ATmega16HVBREVB__"},
  176. {"atmega32hvb", "__AVR_ATmega32HVB__"},
  177. {"atmega32hvbrevb", "__AVR_ATmega32HVBREVB__"},
  178. {"atmega64hve", "__AVR_ATmega64HVE__"},
  179. {"at90can32", "__AVR_AT90CAN32__"},
  180. {"at90can64", "__AVR_AT90CAN64__"},
  181. {"at90pwm161", "__AVR_AT90PWM161__"},
  182. {"at90pwm216", "__AVR_AT90PWM216__"},
  183. {"at90pwm316", "__AVR_AT90PWM316__"},
  184. {"atmega32c1", "__AVR_ATmega32C1__"},
  185. {"atmega64c1", "__AVR_ATmega64C1__"},
  186. {"atmega16m1", "__AVR_ATmega16M1__"},
  187. {"atmega32m1", "__AVR_ATmega32M1__"},
  188. {"atmega64m1", "__AVR_ATmega64M1__"},
  189. {"atmega16u4", "__AVR_ATmega16U4__"},
  190. {"atmega32u4", "__AVR_ATmega32U4__"},
  191. {"atmega32u6", "__AVR_ATmega32U6__"},
  192. {"at90usb646", "__AVR_AT90USB646__"},
  193. {"at90usb647", "__AVR_AT90USB647__"},
  194. {"at90scr100", "__AVR_AT90SCR100__"},
  195. {"at94k", "__AVR_AT94K__"},
  196. {"m3000", "__AVR_AT000__"},
  197. {"atmega128", "__AVR_ATmega128__"},
  198. {"atmega128a", "__AVR_ATmega128A__"},
  199. {"atmega1280", "__AVR_ATmega1280__"},
  200. {"atmega1281", "__AVR_ATmega1281__"},
  201. {"atmega1284", "__AVR_ATmega1284__"},
  202. {"atmega1284p", "__AVR_ATmega1284P__"},
  203. {"atmega128rfa1", "__AVR_ATmega128RFA1__"},
  204. {"atmega128rfr2", "__AVR_ATmega128RFR2__"},
  205. {"atmega1284rfr2", "__AVR_ATmega1284RFR2__"},
  206. {"at90can128", "__AVR_AT90CAN128__"},
  207. {"at90usb1286", "__AVR_AT90USB1286__"},
  208. {"at90usb1287", "__AVR_AT90USB1287__"},
  209. {"atmega2560", "__AVR_ATmega2560__"},
  210. {"atmega2561", "__AVR_ATmega2561__"},
  211. {"atmega256rfr2", "__AVR_ATmega256RFR2__"},
  212. {"atmega2564rfr2", "__AVR_ATmega2564RFR2__"},
  213. {"atxmega16a4", "__AVR_ATxmega16A4__"},
  214. {"atxmega16a4u", "__AVR_ATxmega16a4U__"},
  215. {"atxmega16c4", "__AVR_ATxmega16C4__"},
  216. {"atxmega16d4", "__AVR_ATxmega16D4__"},
  217. {"atxmega32a4", "__AVR_ATxmega32A4__"},
  218. {"atxmega32a4u", "__AVR_ATxmega32A4U__"},
  219. {"atxmega32c4", "__AVR_ATxmega32C4__"},
  220. {"atxmega32d4", "__AVR_ATxmega32D4__"},
  221. {"atxmega32e5", "__AVR_ATxmega32E5__"},
  222. {"atxmega16e5", "__AVR_ATxmega16E5__"},
  223. {"atxmega8e5", "__AVR_ATxmega8E5__"},
  224. {"atxmega32x1", "__AVR_ATxmega32X1__"},
  225. {"atxmega64a3", "__AVR_ATxmega64A3__"},
  226. {"atxmega64a3u", "__AVR_ATxmega64A3U__"},
  227. {"atxmega64a4u", "__AVR_ATxmega64A4U__"},
  228. {"atxmega64b1", "__AVR_ATxmega64B1__"},
  229. {"atxmega64b3", "__AVR_ATxmega64B3__"},
  230. {"atxmega64c3", "__AVR_ATxmega64C3__"},
  231. {"atxmega64d3", "__AVR_ATxmega64D3__"},
  232. {"atxmega64d4", "__AVR_ATxmega64D4__"},
  233. {"atxmega64a1", "__AVR_ATxmega64A1__"},
  234. {"atxmega64a1u", "__AVR_ATxmega64A1U__"},
  235. {"atxmega128a3", "__AVR_ATxmega128A3__"},
  236. {"atxmega128a3u", "__AVR_ATxmega128A3U__"},
  237. {"atxmega128b1", "__AVR_ATxmega128B1__"},
  238. {"atxmega128b3", "__AVR_ATxmega128B3__"},
  239. {"atxmega128c3", "__AVR_ATxmega128C3__"},
  240. {"atxmega128d3", "__AVR_ATxmega128D3__"},
  241. {"atxmega128d4", "__AVR_ATxmega128D4__"},
  242. {"atxmega192a3", "__AVR_ATxmega192A3__"},
  243. {"atxmega192a3u", "__AVR_ATxmega192A3U__"},
  244. {"atxmega192c3", "__AVR_ATxmega192C3__"},
  245. {"atxmega192d3", "__AVR_ATxmega192D3__"},
  246. {"atxmega256a3", "__AVR_ATxmega256A3__"},
  247. {"atxmega256a3u", "__AVR_ATxmega256A3U__"},
  248. {"atxmega256a3b", "__AVR_ATxmega256A3B__"},
  249. {"atxmega256a3bu", "__AVR_ATxmega256A3BU__"},
  250. {"atxmega256c3", "__AVR_ATxmega256C3__"},
  251. {"atxmega256d3", "__AVR_ATxmega256D3__"},
  252. {"atxmega384c3", "__AVR_ATxmega384C3__"},
  253. {"atxmega384d3", "__AVR_ATxmega384D3__"},
  254. {"atxmega128a1", "__AVR_ATxmega128A1__"},
  255. {"atxmega128a1u", "__AVR_ATxmega128A1U__"},
  256. {"atxmega128a4u", "__AVR_ATxmega128a4U__"},
  257. {"attiny4", "__AVR_ATtiny4__"},
  258. {"attiny5", "__AVR_ATtiny5__"},
  259. {"attiny9", "__AVR_ATtiny9__"},
  260. {"attiny10", "__AVR_ATtiny10__"},
  261. {"attiny20", "__AVR_ATtiny20__"},
  262. {"attiny40", "__AVR_ATtiny40__"},
  263. {"attiny102", "__AVR_ATtiny102__"},
  264. {"attiny104", "__AVR_ATtiny104__"},
  265. };
  266. } // namespace targets
  267. } // namespace clang
  268. static constexpr llvm::StringLiteral ValidFamilyNames[] = {
  269. "avr1", "avr2", "avr25", "avr3", "avr31",
  270. "avr35", "avr4", "avr5", "avr51", "avr6",
  271. "avrxmega1", "avrxmega2", "avrxmega3", "avrxmega4", "avrxmega5",
  272. "avrxmega6", "avrxmega7", "avrtiny"};
  273. bool AVRTargetInfo::isValidCPUName(StringRef Name) const {
  274. bool IsFamily =
  275. llvm::find(ValidFamilyNames, Name) != std::end(ValidFamilyNames);
  276. bool IsMCU =
  277. llvm::find_if(AVRMcus, [&](const MCUInfo &Info) {
  278. return Info.Name == Name;
  279. }) != std::end(AVRMcus);
  280. return IsFamily || IsMCU;
  281. }
  282. void AVRTargetInfo::fillValidCPUList(SmallVectorImpl<StringRef> &Values) const {
  283. Values.append(std::begin(ValidFamilyNames), std::end(ValidFamilyNames));
  284. for (const MCUInfo &Info : AVRMcus)
  285. Values.push_back(Info.Name);
  286. }
  287. void AVRTargetInfo::getTargetDefines(const LangOptions &Opts,
  288. MacroBuilder &Builder) const {
  289. Builder.defineMacro("AVR");
  290. Builder.defineMacro("__AVR");
  291. Builder.defineMacro("__AVR__");
  292. if (!this->CPU.empty()) {
  293. auto It = llvm::find_if(
  294. AVRMcus, [&](const MCUInfo &Info) { return Info.Name == this->CPU; });
  295. if (It != std::end(AVRMcus))
  296. Builder.defineMacro(It->DefineName);
  297. }
  298. }