AVR.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582
  1. //===--- AVR.cpp - AVR ToolChain Implementations ----------------*- C++ -*-===//
  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. #include "AVR.h"
  9. #include "CommonArgs.h"
  10. #include "clang/Driver/Compilation.h"
  11. #include "clang/Driver/DriverDiagnostic.h"
  12. #include "clang/Driver/InputInfo.h"
  13. #include "clang/Driver/Options.h"
  14. #include "llvm/ADT/StringExtras.h"
  15. #include "llvm/MC/MCSubtargetInfo.h"
  16. #include "llvm/MC/SubtargetFeature.h"
  17. #include "llvm/Option/ArgList.h"
  18. #include "llvm/Support/FileSystem.h"
  19. #include "llvm/Support/Path.h"
  20. using namespace clang::driver;
  21. using namespace clang::driver::toolchains;
  22. using namespace clang::driver::tools;
  23. using namespace clang;
  24. using namespace llvm::opt;
  25. namespace {
  26. // NOTE: This list has been synchronized with gcc-avr 7.3.0 and avr-libc 2.0.0.
  27. constexpr struct {
  28. StringRef Name;
  29. StringRef SubPath;
  30. StringRef Family;
  31. unsigned DataAddr;
  32. } MCUInfo[] = {
  33. {"at90s1200", "", "avr1", 0},
  34. {"attiny11", "", "avr1", 0},
  35. {"attiny12", "", "avr1", 0},
  36. {"attiny15", "", "avr1", 0},
  37. {"attiny28", "", "avr1", 0},
  38. {"at90s2313", "tiny-stack", "avr2", 0x800060},
  39. {"at90s2323", "tiny-stack", "avr2", 0x800060},
  40. {"at90s2333", "tiny-stack", "avr2", 0x800060},
  41. {"at90s2343", "tiny-stack", "avr2", 0x800060},
  42. {"at90s4433", "tiny-stack", "avr2", 0x800060},
  43. {"attiny22", "tiny-stack", "avr2", 0x800060},
  44. {"attiny26", "tiny-stack", "avr2", 0x800060},
  45. {"at90s4414", "", "avr2", 0x800060},
  46. {"at90s4434", "", "avr2", 0x800060},
  47. {"at90s8515", "", "avr2", 0x800060},
  48. {"at90c8534", "", "avr2", 0x800060},
  49. {"at90s8535", "", "avr2", 0x800060},
  50. {"attiny13", "avr25/tiny-stack", "avr25", 0x800060},
  51. {"attiny13a", "avr25/tiny-stack", "avr25", 0x800060},
  52. {"attiny2313", "avr25/tiny-stack", "avr25", 0x800060},
  53. {"attiny2313a", "avr25/tiny-stack", "avr25", 0x800060},
  54. {"attiny24", "avr25/tiny-stack", "avr25", 0x800060},
  55. {"attiny24a", "avr25/tiny-stack", "avr25", 0x800060},
  56. {"attiny25", "avr25/tiny-stack", "avr25", 0x800060},
  57. {"attiny261", "avr25/tiny-stack", "avr25", 0x800060},
  58. {"attiny261a", "avr25/tiny-stack", "avr25", 0x800060},
  59. {"at86rf401", "avr25", "avr25", 0x800060},
  60. {"ata5272", "avr25", "avr25", 0x800100},
  61. {"ata6616c", "avr25", "avr25", 0x800100},
  62. {"attiny4313", "avr25", "avr25", 0x800060},
  63. {"attiny44", "avr25", "avr25", 0x800060},
  64. {"attiny44a", "avr25", "avr25", 0x800060},
  65. {"attiny84", "avr25", "avr25", 0x800060},
  66. {"attiny84a", "avr25", "avr25", 0x800060},
  67. {"attiny45", "avr25", "avr25", 0x800060},
  68. {"attiny85", "avr25", "avr25", 0x800060},
  69. {"attiny441", "avr25", "avr25", 0x800100},
  70. {"attiny461", "avr25", "avr25", 0x800060},
  71. {"attiny461a", "avr25", "avr25", 0x800060},
  72. {"attiny841", "avr25", "avr25", 0x800100},
  73. {"attiny861", "avr25", "avr25", 0x800060},
  74. {"attiny861a", "avr25", "avr25", 0x800060},
  75. {"attiny87", "avr25", "avr25", 0x800100},
  76. {"attiny43u", "avr25", "avr25", 0x800060},
  77. {"attiny48", "avr25", "avr25", 0x800100},
  78. {"attiny88", "avr25", "avr25", 0x800100},
  79. {"attiny828", "avr25", "avr25", 0x800100},
  80. {"at43usb355", "avr3", "avr3", 0x800100},
  81. {"at76c711", "avr3", "avr3", 0x800060},
  82. {"atmega103", "avr31", "avr31", 0x800060},
  83. {"at43usb320", "avr31", "avr31", 0x800060},
  84. {"attiny167", "avr35", "avr35", 0x800100},
  85. {"at90usb82", "avr35", "avr35", 0x800100},
  86. {"at90usb162", "avr35", "avr35", 0x800100},
  87. {"ata5505", "avr35", "avr35", 0x800100},
  88. {"ata6617c", "avr35", "avr35", 0x800100},
  89. {"ata664251", "avr35", "avr35", 0x800100},
  90. {"atmega8u2", "avr35", "avr35", 0x800100},
  91. {"atmega16u2", "avr35", "avr35", 0x800100},
  92. {"atmega32u2", "avr35", "avr35", 0x800100},
  93. {"attiny1634", "avr35", "avr35", 0x800100},
  94. {"atmega8", "avr4", "avr4", 0x800060},
  95. {"ata6289", "avr4", "avr4", 0x800100},
  96. {"atmega8a", "avr4", "avr4", 0x800060},
  97. {"ata6285", "avr4", "avr4", 0x800100},
  98. {"ata6286", "avr4", "avr4", 0x800100},
  99. {"ata6612c", "avr4", "avr4", 0x800100},
  100. {"atmega48", "avr4", "avr4", 0x800100},
  101. {"atmega48a", "avr4", "avr4", 0x800100},
  102. {"atmega48pa", "avr4", "avr4", 0x800100},
  103. {"atmega48pb", "avr4", "avr4", 0x800100},
  104. {"atmega48p", "avr4", "avr4", 0x800100},
  105. {"atmega88", "avr4", "avr4", 0x800100},
  106. {"atmega88a", "avr4", "avr4", 0x800100},
  107. {"atmega88p", "avr4", "avr4", 0x800100},
  108. {"atmega88pa", "avr4", "avr4", 0x800100},
  109. {"atmega88pb", "avr4", "avr4", 0x800100},
  110. {"atmega8515", "avr4", "avr4", 0x800060},
  111. {"atmega8535", "avr4", "avr4", 0x800060},
  112. {"atmega8hva", "avr4", "avr4", 0x800100},
  113. {"at90pwm1", "avr4", "avr4", 0x800100},
  114. {"at90pwm2", "avr4", "avr4", 0x800100},
  115. {"at90pwm2b", "avr4", "avr4", 0x800100},
  116. {"at90pwm3", "avr4", "avr4", 0x800100},
  117. {"at90pwm3b", "avr4", "avr4", 0x800100},
  118. {"at90pwm81", "avr4", "avr4", 0x800100},
  119. {"ata5702m322", "avr5", "avr5", 0x800200},
  120. {"ata5782", "avr5", "avr5", 0x800200},
  121. {"ata5790", "avr5", "avr5", 0x800100},
  122. {"ata5790n", "avr5", "avr5", 0x800100},
  123. {"ata5791", "avr5", "avr5", 0x800100},
  124. {"ata5795", "avr5", "avr5", 0x800100},
  125. {"ata5831", "avr5", "avr5", 0x800200},
  126. {"ata6613c", "avr5", "avr5", 0x800100},
  127. {"ata6614q", "avr5", "avr5", 0x800100},
  128. {"ata8210", "avr5", "avr5", 0x800200},
  129. {"ata8510", "avr5", "avr5", 0x800200},
  130. {"atmega16", "avr5", "avr5", 0x800060},
  131. {"atmega16a", "avr5", "avr5", 0x800060},
  132. {"atmega161", "avr5", "avr5", 0x800060},
  133. {"atmega162", "avr5", "avr5", 0x800100},
  134. {"atmega163", "avr5", "avr5", 0x800060},
  135. {"atmega164a", "avr5", "avr5", 0x800100},
  136. {"atmega164p", "avr5", "avr5", 0x800100},
  137. {"atmega164pa", "avr5", "avr5", 0x800100},
  138. {"atmega165", "avr5", "avr5", 0x800100},
  139. {"atmega165a", "avr5", "avr5", 0x800100},
  140. {"atmega165p", "avr5", "avr5", 0x800100},
  141. {"atmega165pa", "avr5", "avr5", 0x800100},
  142. {"atmega168", "avr5", "avr5", 0x800100},
  143. {"atmega168a", "avr5", "avr5", 0x800100},
  144. {"atmega168p", "avr5", "avr5", 0x800100},
  145. {"atmega168pa", "avr5", "avr5", 0x800100},
  146. {"atmega168pb", "avr5", "avr5", 0x800100},
  147. {"atmega169", "avr5", "avr5", 0x800100},
  148. {"atmega169a", "avr5", "avr5", 0x800100},
  149. {"atmega169p", "avr5", "avr5", 0x800100},
  150. {"atmega169pa", "avr5", "avr5", 0x800100},
  151. {"atmega32", "avr5", "avr5", 0x800060},
  152. {"atmega32a", "avr5", "avr5", 0x800060},
  153. {"atmega323", "avr5", "avr5", 0x800060},
  154. {"atmega324a", "avr5", "avr5", 0x800100},
  155. {"atmega324p", "avr5", "avr5", 0x800100},
  156. {"atmega324pa", "avr5", "avr5", 0x800100},
  157. {"atmega324pb", "avr5", "avr5", 0x800100},
  158. {"atmega325", "avr5", "avr5", 0x800100},
  159. {"atmega325a", "avr5", "avr5", 0x800100},
  160. {"atmega325p", "avr5", "avr5", 0x800100},
  161. {"atmega325pa", "avr5", "avr5", 0x800100},
  162. {"atmega3250", "avr5", "avr5", 0x800100},
  163. {"atmega3250a", "avr5", "avr5", 0x800100},
  164. {"atmega3250p", "avr5", "avr5", 0x800100},
  165. {"atmega3250pa", "avr5", "avr5", 0x800100},
  166. {"atmega328", "avr5", "avr5", 0x800100},
  167. {"atmega328p", "avr5", "avr5", 0x800100},
  168. {"atmega328pb", "avr5", "avr5", 0x800100},
  169. {"atmega329", "avr5", "avr5", 0x800100},
  170. {"atmega329a", "avr5", "avr5", 0x800100},
  171. {"atmega329p", "avr5", "avr5", 0x800100},
  172. {"atmega329pa", "avr5", "avr5", 0x800100},
  173. {"atmega3290", "avr5", "avr5", 0x800100},
  174. {"atmega3290a", "avr5", "avr5", 0x800100},
  175. {"atmega3290p", "avr5", "avr5", 0x800100},
  176. {"atmega3290pa", "avr5", "avr5", 0x800100},
  177. {"atmega406", "avr5", "avr5", 0x800100},
  178. {"atmega64", "avr5", "avr5", 0x800100},
  179. {"atmega64a", "avr5", "avr5", 0x800100},
  180. {"atmega640", "avr5", "avr5", 0x800200},
  181. {"atmega644", "avr5", "avr5", 0x800100},
  182. {"atmega644a", "avr5", "avr5", 0x800100},
  183. {"atmega644p", "avr5", "avr5", 0x800100},
  184. {"atmega644pa", "avr5", "avr5", 0x800100},
  185. {"atmega645", "avr5", "avr5", 0x800100},
  186. {"atmega645a", "avr5", "avr5", 0x800100},
  187. {"atmega645p", "avr5", "avr5", 0x800100},
  188. {"atmega649", "avr5", "avr5", 0x800100},
  189. {"atmega649a", "avr5", "avr5", 0x800100},
  190. {"atmega649p", "avr5", "avr5", 0x800100},
  191. {"atmega6450", "avr5", "avr5", 0x800100},
  192. {"atmega6450a", "avr5", "avr5", 0x800100},
  193. {"atmega6450p", "avr5", "avr5", 0x800100},
  194. {"atmega6490", "avr5", "avr5", 0x800100},
  195. {"atmega6490a", "avr5", "avr5", 0x800100},
  196. {"atmega6490p", "avr5", "avr5", 0x800100},
  197. {"atmega64rfr2", "avr5", "avr5", 0x800200},
  198. {"atmega644rfr2", "avr5", "avr5", 0x800200},
  199. {"atmega16hva", "avr5", "avr5", 0x800100},
  200. {"atmega16hva2", "avr5", "avr5", 0x800100},
  201. {"atmega16hvb", "avr5", "avr5", 0x800100},
  202. {"atmega16hvbrevb", "avr5", "avr5", 0x800100},
  203. {"atmega32hvb", "avr5", "avr5", 0x800100},
  204. {"atmega32hvbrevb", "avr5", "avr5", 0x800100},
  205. {"atmega64hve", "avr5", "avr5", 0x800100},
  206. {"atmega64hve2", "avr5", "avr5", 0x800100},
  207. {"at90can32", "avr5", "avr5", 0x800100},
  208. {"at90can64", "avr5", "avr5", 0x800100},
  209. {"at90pwm161", "avr5", "avr5", 0x800100},
  210. {"at90pwm216", "avr5", "avr5", 0x800100},
  211. {"at90pwm316", "avr5", "avr5", 0x800100},
  212. {"atmega32c1", "avr5", "avr5", 0x800100},
  213. {"atmega64c1", "avr5", "avr5", 0x800100},
  214. {"atmega16m1", "avr5", "avr5", 0x800100},
  215. {"atmega32m1", "avr5", "avr5", 0x800100},
  216. {"atmega64m1", "avr5", "avr5", 0x800100},
  217. {"atmega16u4", "avr5", "avr5", 0x800100},
  218. {"atmega32u4", "avr5", "avr5", 0x800100},
  219. {"atmega32u6", "avr5", "avr5", 0x800100},
  220. {"at90usb646", "avr5", "avr5", 0x800100},
  221. {"at90usb647", "avr5", "avr5", 0x800100},
  222. {"at90scr100", "avr5", "avr5", 0x800100},
  223. {"at94k", "avr5", "avr5", 0x800060},
  224. {"m3000", "avr5", "avr5", 0x800060},
  225. {"atmega128", "avr51", "avr51", 0x800100},
  226. {"atmega128a", "avr51", "avr51", 0x800100},
  227. {"atmega1280", "avr51", "avr51", 0x800200},
  228. {"atmega1281", "avr51", "avr51", 0x800200},
  229. {"atmega1284", "avr51", "avr51", 0x800100},
  230. {"atmega1284p", "avr51", "avr51", 0x800100},
  231. {"atmega128rfa1", "avr51", "avr51", 0x800200},
  232. {"atmega128rfr2", "avr51", "avr51", 0x800200},
  233. {"atmega1284rfr2", "avr51", "avr51", 0x800200},
  234. {"at90can128", "avr51", "avr51", 0x800200},
  235. {"at90usb1286", "avr51", "avr51", 0x800200},
  236. {"at90usb1287", "avr51", "avr51", 0x800200},
  237. {"atmega2560", "avr6", "avr6", 0x800200},
  238. {"atmega2561", "avr6", "avr6", 0x800200},
  239. {"atmega256rfr2", "avr6", "avr6", 0x800200},
  240. {"atmega2564rfr2", "avr6", "avr6", 0x800200},
  241. {"attiny4", "avrtiny", "avrtiny", 0x800040},
  242. {"attiny5", "avrtiny", "avrtiny", 0x800040},
  243. {"attiny9", "avrtiny", "avrtiny", 0x800040},
  244. {"attiny10", "avrtiny", "avrtiny", 0x800040},
  245. {"attiny20", "avrtiny", "avrtiny", 0x800040},
  246. {"attiny40", "avrtiny", "avrtiny", 0x800040},
  247. {"attiny102", "avrtiny", "avrtiny", 0x800040},
  248. {"attiny104", "avrtiny", "avrtiny", 0x800040},
  249. {"atxmega16a4", "avrxmega2", "avrxmega2", 0x802000},
  250. {"atxmega16a4u", "avrxmega2", "avrxmega2", 0x802000},
  251. {"atxmega16c4", "avrxmega2", "avrxmega2", 0x802000},
  252. {"atxmega16d4", "avrxmega2", "avrxmega2", 0x802000},
  253. {"atxmega32a4", "avrxmega2", "avrxmega2", 0x802000},
  254. {"atxmega32a4u", "avrxmega2", "avrxmega2", 0x802000},
  255. {"atxmega32c3", "avrxmega2", "avrxmega2", 0x802000},
  256. {"atxmega32c4", "avrxmega2", "avrxmega2", 0x802000},
  257. {"atxmega32d3", "avrxmega2", "avrxmega2", 0x802000},
  258. {"atxmega32d4", "avrxmega2", "avrxmega2", 0x802000},
  259. {"atxmega32e5", "avrxmega2", "avrxmega2", 0x802000},
  260. {"atxmega16e5", "avrxmega2", "avrxmega2", 0x802000},
  261. {"atxmega8e5", "avrxmega2", "avrxmega2", 0x802000},
  262. {"atxmega64a3", "avrxmega4", "avrxmega4", 0x802000},
  263. {"atxmega64a3u", "avrxmega4", "avrxmega4", 0x802000},
  264. {"atxmega64a4u", "avrxmega4", "avrxmega4", 0x802000},
  265. {"atxmega64b1", "avrxmega4", "avrxmega4", 0x802000},
  266. {"atxmega64b3", "avrxmega4", "avrxmega4", 0x802000},
  267. {"atxmega64c3", "avrxmega4", "avrxmega4", 0x802000},
  268. {"atxmega64d3", "avrxmega4", "avrxmega4", 0x802000},
  269. {"atxmega64d4", "avrxmega4", "avrxmega4", 0x802000},
  270. {"atxmega64a1", "avrxmega5", "avrxmega5", 0x802000},
  271. {"atxmega64a1u", "avrxmega5", "avrxmega5", 0x802000},
  272. {"atxmega128a3", "avrxmega6", "avrxmega6", 0x802000},
  273. {"atxmega128a3u", "avrxmega6", "avrxmega6", 0x802000},
  274. {"atxmega128b1", "avrxmega6", "avrxmega6", 0x802000},
  275. {"atxmega128b3", "avrxmega6", "avrxmega6", 0x802000},
  276. {"atxmega128c3", "avrxmega6", "avrxmega6", 0x802000},
  277. {"atxmega128d3", "avrxmega6", "avrxmega6", 0x802000},
  278. {"atxmega128d4", "avrxmega6", "avrxmega6", 0x802000},
  279. {"atxmega192a3", "avrxmega6", "avrxmega6", 0x802000},
  280. {"atxmega192a3u", "avrxmega6", "avrxmega6", 0x802000},
  281. {"atxmega192c3", "avrxmega6", "avrxmega6", 0x802000},
  282. {"atxmega192d3", "avrxmega6", "avrxmega6", 0x802000},
  283. {"atxmega256a3", "avrxmega6", "avrxmega6", 0x802000},
  284. {"atxmega256a3u", "avrxmega6", "avrxmega6", 0x802000},
  285. {"atxmega256a3b", "avrxmega6", "avrxmega6", 0x802000},
  286. {"atxmega256a3bu", "avrxmega6", "avrxmega6", 0x802000},
  287. {"atxmega256c3", "avrxmega6", "avrxmega6", 0x802000},
  288. {"atxmega256d3", "avrxmega6", "avrxmega6", 0x802000},
  289. {"atxmega384c3", "avrxmega6", "avrxmega6", 0x802000},
  290. {"atxmega384d3", "avrxmega6", "avrxmega6", 0x802000},
  291. {"atxmega128a1", "avrxmega7", "avrxmega7", 0x802000},
  292. {"atxmega128a1u", "avrxmega7", "avrxmega7", 0x802000},
  293. {"atxmega128a4u", "avrxmega7", "avrxmega7", 0x802000},
  294. {"attiny202", "avrxmega3/short-calls", "avrxmega3", 0x803F80},
  295. {"attiny204", "avrxmega3/short-calls", "avrxmega3", 0x803F80},
  296. {"attiny212", "avrxmega3/short-calls", "avrxmega3", 0x803F80},
  297. {"attiny214", "avrxmega3/short-calls", "avrxmega3", 0x803F80},
  298. {"attiny402", "avrxmega3/short-calls", "avrxmega3", 0x803F00},
  299. {"attiny404", "avrxmega3/short-calls", "avrxmega3", 0x803F00},
  300. {"attiny406", "avrxmega3/short-calls", "avrxmega3", 0x803F00},
  301. {"attiny412", "avrxmega3/short-calls", "avrxmega3", 0x803F00},
  302. {"attiny414", "avrxmega3/short-calls", "avrxmega3", 0x803F00},
  303. {"attiny416", "avrxmega3/short-calls", "avrxmega3", 0x803F00},
  304. {"attiny417", "avrxmega3/short-calls", "avrxmega3", 0x803F00},
  305. {"attiny804", "avrxmega3/short-calls", "avrxmega3", 0x803E00},
  306. {"attiny806", "avrxmega3/short-calls", "avrxmega3", 0x803E00},
  307. {"attiny807", "avrxmega3/short-calls", "avrxmega3", 0x803E00},
  308. {"attiny814", "avrxmega3/short-calls", "avrxmega3", 0x803E00},
  309. {"attiny816", "avrxmega3/short-calls", "avrxmega3", 0x803E00},
  310. {"attiny817", "avrxmega3/short-calls", "avrxmega3", 0x803E00},
  311. {"atmega808", "avrxmega3/short-calls", "avrxmega3", 0x803C00},
  312. {"atmega809", "avrxmega3/short-calls", "avrxmega3", 0x803C00},
  313. {"atmega1608", "avrxmega3", "avrxmega3", 0x803800},
  314. {"atmega1609", "avrxmega3", "avrxmega3", 0x803800},
  315. {"atmega3208", "avrxmega3", "avrxmega3", 0x803000},
  316. {"atmega3209", "avrxmega3", "avrxmega3", 0x803000},
  317. {"atmega4808", "avrxmega3", "avrxmega3", 0x802800},
  318. {"atmega4809", "avrxmega3", "avrxmega3", 0x802800},
  319. {"attiny1604", "avrxmega3", "avrxmega3", 0x803C00},
  320. {"attiny1606", "avrxmega3", "avrxmega3", 0x803C00},
  321. {"attiny1607", "avrxmega3", "avrxmega3", 0x803C00},
  322. {"attiny1614", "avrxmega3", "avrxmega3", 0x803800},
  323. {"attiny1616", "avrxmega3", "avrxmega3", 0x803800},
  324. {"attiny1617", "avrxmega3", "avrxmega3", 0x803800},
  325. {"attiny1624", "avrxmega3", "avrxmega3", 0x803800},
  326. {"attiny1626", "avrxmega3", "avrxmega3", 0x803800},
  327. {"attiny1627", "avrxmega3", "avrxmega3", 0x803800},
  328. {"attiny3216", "avrxmega3", "avrxmega3", 0x803800},
  329. {"attiny3217", "avrxmega3", "avrxmega3", 0x803800},
  330. };
  331. std::string GetMCUSubPath(StringRef MCUName) {
  332. for (const auto &MCU : MCUInfo)
  333. if (MCU.Name == MCUName)
  334. return std::string(MCU.SubPath);
  335. return "";
  336. }
  337. std::optional<StringRef> GetMCUFamilyName(StringRef MCUName) {
  338. for (const auto &MCU : MCUInfo)
  339. if (MCU.Name == MCUName)
  340. return std::optional<StringRef>(MCU.Family);
  341. return std::nullopt;
  342. }
  343. std::optional<unsigned> GetMCUSectionAddressData(StringRef MCUName) {
  344. for (const auto &MCU : MCUInfo)
  345. if (MCU.Name == MCUName && MCU.DataAddr > 0)
  346. return std::optional<unsigned>(MCU.DataAddr);
  347. return std::nullopt;
  348. }
  349. const StringRef PossibleAVRLibcLocations[] = {
  350. "/avr",
  351. "/usr/avr",
  352. "/usr/lib/avr",
  353. };
  354. } // end anonymous namespace
  355. /// AVR Toolchain
  356. AVRToolChain::AVRToolChain(const Driver &D, const llvm::Triple &Triple,
  357. const ArgList &Args)
  358. : Generic_ELF(D, Triple, Args) {
  359. GCCInstallation.init(Triple, Args);
  360. if (getCPUName(D, Args, Triple).empty())
  361. D.Diag(diag::warn_drv_avr_mcu_not_specified);
  362. // Only add default libraries if the user hasn't explicitly opted out.
  363. if (!Args.hasArg(options::OPT_nostdlib) &&
  364. !Args.hasArg(options::OPT_nodefaultlibs) && GCCInstallation.isValid()) {
  365. GCCInstallPath = GCCInstallation.getInstallPath();
  366. std::string GCCParentPath(GCCInstallation.getParentLibPath());
  367. getProgramPaths().push_back(GCCParentPath + "/../bin");
  368. }
  369. }
  370. void AVRToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
  371. ArgStringList &CC1Args) const {
  372. if (DriverArgs.hasArg(options::OPT_nostdinc) ||
  373. DriverArgs.hasArg(options::OPT_nostdlibinc))
  374. return;
  375. // Omit if there is no avr-libc installed.
  376. std::optional<std::string> AVRLibcRoot = findAVRLibcInstallation();
  377. if (!AVRLibcRoot)
  378. return;
  379. // Add 'avr-libc/include' to clang system include paths if applicable.
  380. std::string AVRInc = *AVRLibcRoot + "/include";
  381. if (llvm::sys::fs::is_directory(AVRInc))
  382. addSystemInclude(DriverArgs, CC1Args, AVRInc);
  383. }
  384. void AVRToolChain::addClangTargetOptions(
  385. const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
  386. Action::OffloadKind DeviceOffloadKind) const {
  387. // By default, use `.ctors` (not `.init_array`), as required by libgcc, which
  388. // runs constructors/destructors on AVR.
  389. if (!DriverArgs.hasFlag(options::OPT_fuse_init_array,
  390. options::OPT_fno_use_init_array, false))
  391. CC1Args.push_back("-fno-use-init-array");
  392. // Use `-fno-use-cxa-atexit` as default, since avr-libc does not support
  393. // `__cxa_atexit()`.
  394. if (!DriverArgs.hasFlag(options::OPT_fuse_cxa_atexit,
  395. options::OPT_fno_use_cxa_atexit, false))
  396. CC1Args.push_back("-fno-use-cxa-atexit");
  397. }
  398. Tool *AVRToolChain::buildLinker() const {
  399. return new tools::AVR::Linker(getTriple(), *this);
  400. }
  401. std::string
  402. AVRToolChain::getCompilerRT(const llvm::opt::ArgList &Args, StringRef Component,
  403. FileType Type = ToolChain::FT_Static) const {
  404. assert(Type == ToolChain::FT_Static && "AVR only supports static libraries");
  405. // Since AVR can never be a host environment, its compiler-rt library files
  406. // should always have ".a" suffix, even on windows.
  407. SmallString<32> File("/libclang_rt.");
  408. File += Component.str();
  409. File += ".a";
  410. // Return the default compiler-rt path appended with
  411. // "avr/libclang_rt.$COMPONENT.a".
  412. SmallString<256> Path(ToolChain::getCompilerRTPath());
  413. llvm::sys::path::append(Path, "avr");
  414. llvm::sys::path::append(Path, File.str());
  415. return std::string(Path.str());
  416. }
  417. void AVR::Linker::ConstructJob(Compilation &C, const JobAction &JA,
  418. const InputInfo &Output,
  419. const InputInfoList &Inputs, const ArgList &Args,
  420. const char *LinkingOutput) const {
  421. const auto &TC = static_cast<const AVRToolChain &>(getToolChain());
  422. const Driver &D = getToolChain().getDriver();
  423. // Compute information about the target AVR.
  424. std::string CPU = getCPUName(D, Args, getToolChain().getTriple());
  425. std::optional<StringRef> FamilyName = GetMCUFamilyName(CPU);
  426. std::optional<std::string> AVRLibcRoot = TC.findAVRLibcInstallation();
  427. std::optional<unsigned> SectionAddressData = GetMCUSectionAddressData(CPU);
  428. // Compute the linker program path, and use GNU "avr-ld" as default.
  429. const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ);
  430. std::string Linker = A ? getToolChain().GetLinkerPath(nullptr)
  431. : getToolChain().GetProgramPath(getShortName());
  432. ArgStringList CmdArgs;
  433. CmdArgs.push_back("-o");
  434. CmdArgs.push_back(Output.getFilename());
  435. // Enable garbage collection of unused sections.
  436. CmdArgs.push_back("--gc-sections");
  437. // Add library search paths before we specify libraries.
  438. Args.AddAllArgs(CmdArgs, options::OPT_L);
  439. getToolChain().AddFilePathLibArgs(Args, CmdArgs);
  440. // Currently we only support libgcc and compiler-rt.
  441. auto RtLib = TC.GetRuntimeLibType(Args);
  442. assert(
  443. (RtLib == ToolChain::RLT_Libgcc || RtLib == ToolChain::RLT_CompilerRT) &&
  444. "unknown runtime library");
  445. // Only add default libraries if the user hasn't explicitly opted out.
  446. bool LinkStdlib = false;
  447. if (!Args.hasArg(options::OPT_nostdlib) &&
  448. !Args.hasArg(options::OPT_nodefaultlibs)) {
  449. if (!CPU.empty()) {
  450. if (!FamilyName) {
  451. // We do not have an entry for this CPU in the family
  452. // mapping table yet.
  453. D.Diag(diag::warn_drv_avr_family_linking_stdlibs_not_implemented)
  454. << CPU;
  455. } else if (!AVRLibcRoot) {
  456. // No avr-libc found and so no runtime linked.
  457. D.Diag(diag::warn_drv_avr_libc_not_found);
  458. } else {
  459. std::string SubPath = GetMCUSubPath(CPU);
  460. // Add path of avr-libc.
  461. CmdArgs.push_back(
  462. Args.MakeArgString(Twine("-L") + *AVRLibcRoot + "/lib/" + SubPath));
  463. if (RtLib == ToolChain::RLT_Libgcc)
  464. CmdArgs.push_back(Args.MakeArgString("-L" + TC.getGCCInstallPath() +
  465. "/" + SubPath));
  466. LinkStdlib = true;
  467. }
  468. }
  469. if (!LinkStdlib)
  470. D.Diag(diag::warn_drv_avr_stdlib_not_linked);
  471. }
  472. if (SectionAddressData) {
  473. CmdArgs.push_back(Args.MakeArgString(
  474. "-Tdata=0x" + Twine::utohexstr(*SectionAddressData)));
  475. } else {
  476. // We do not have an entry for this CPU in the address mapping table yet.
  477. D.Diag(diag::warn_drv_avr_linker_section_addresses_not_implemented) << CPU;
  478. }
  479. // If the family name is known, we can link with the device-specific libgcc.
  480. // Without it, libgcc will simply not be linked. This matches avr-gcc
  481. // behavior.
  482. if (LinkStdlib) {
  483. assert(!CPU.empty() && "CPU name must be known in order to link stdlibs");
  484. CmdArgs.push_back("--start-group");
  485. // Add the object file for the CRT.
  486. std::string CrtFileName = std::string("-l:crt") + CPU + std::string(".o");
  487. CmdArgs.push_back(Args.MakeArgString(CrtFileName));
  488. // Link to libgcc.
  489. if (RtLib == ToolChain::RLT_Libgcc)
  490. CmdArgs.push_back("-lgcc");
  491. // Link to generic libraries of avr-libc.
  492. CmdArgs.push_back("-lm");
  493. CmdArgs.push_back("-lc");
  494. // Add the link library specific to the MCU.
  495. CmdArgs.push_back(Args.MakeArgString(std::string("-l") + CPU));
  496. // Add the relocatable inputs.
  497. AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs, JA);
  498. // We directly use libclang_rt.builtins.a as input file, instead of using
  499. // '-lclang_rt.builtins'.
  500. if (RtLib == ToolChain::RLT_CompilerRT) {
  501. std::string RtLib =
  502. getToolChain().getCompilerRT(Args, "builtins", ToolChain::FT_Static);
  503. if (llvm::sys::fs::exists(RtLib))
  504. CmdArgs.push_back(Args.MakeArgString(RtLib));
  505. }
  506. CmdArgs.push_back("--end-group");
  507. // Add user specified linker script.
  508. Args.AddAllArgs(CmdArgs, options::OPT_T);
  509. // Specify the family name as the emulation mode to use.
  510. // This is almost always required because otherwise avr-ld
  511. // will assume 'avr2' and warn about the program being larger
  512. // than the bare minimum supports.
  513. if (Linker.find("avr-ld") != std::string::npos)
  514. CmdArgs.push_back(Args.MakeArgString(std::string("-m") + *FamilyName));
  515. } else {
  516. AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs, JA);
  517. }
  518. C.addCommand(std::make_unique<Command>(
  519. JA, *this, ResponseFileSupport::AtFileCurCP(), Args.MakeArgString(Linker),
  520. CmdArgs, Inputs, Output));
  521. }
  522. std::optional<std::string> AVRToolChain::findAVRLibcInstallation() const {
  523. // Search avr-libc installation according to avr-gcc installation.
  524. std::string GCCParent(GCCInstallation.getParentLibPath());
  525. std::string Path(GCCParent + "/avr");
  526. if (llvm::sys::fs::is_directory(Path))
  527. return Path;
  528. Path = GCCParent + "/../avr";
  529. if (llvm::sys::fs::is_directory(Path))
  530. return Path;
  531. // Search avr-libc installation from possible locations, and return the first
  532. // one that exists, if there is no avr-gcc installed.
  533. for (StringRef PossiblePath : PossibleAVRLibcLocations) {
  534. std::string Path = getDriver().SysRoot + PossiblePath.str();
  535. if (llvm::sys::fs::is_directory(Path))
  536. return Path;
  537. }
  538. return std::nullopt;
  539. }