aykevl created this revision. aykevl added reviewers: benshi001, dylanmckay. Herald added a subscriber: Jim. Herald added a project: All. aykevl requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
These macros are defined in avr-gcc and are useful when working with assembly. For example, startup code needs to copy the contents of .data from flash to RAM, but should use elpm (instead of lpm) on devices with more than 64kB flash. Without `__AVR_HAVE_ELPM__`, there is no way to know whether the elpm instruction is supported. Depends on D137521 <https://reviews.llvm.org/D137521>. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D137572 Files: clang/lib/Basic/Targets/AVR.cpp clang/test/Preprocessor/avr-atmega328p.c clang/test/Preprocessor/avr-attiny104.c
Index: clang/test/Preprocessor/avr-attiny104.c =================================================================== --- clang/test/Preprocessor/avr-attiny104.c +++ clang/test/Preprocessor/avr-attiny104.c @@ -4,5 +4,6 @@ // CHECK: #define __AVR 1 // CHECK: #define __AVR_ARCH__ 100 // CHECK: #define __AVR_ATtiny104__ 1 +// CHECK-NOT: #define __AVR_HAVE_MUL__ 1 // CHECK: #define __AVR__ 1 // CHECK: #define __ELF__ 1 Index: clang/test/Preprocessor/avr-atmega328p.c =================================================================== --- clang/test/Preprocessor/avr-atmega328p.c +++ clang/test/Preprocessor/avr-atmega328p.c @@ -4,5 +4,9 @@ // CHECK: #define __AVR 1 // CHECK: #define __AVR_ARCH__ 5 // CHECK: #define __AVR_ATmega328P__ 1 +// CHECK-NOT: #define __AVR_HAVE_EIJMP_EICALL__ +// CHECK: #define __AVR_HAVE_LPMX__ 1 +// CHECK: #define __AVR_HAVE_MOVW__ 1 +// CHECK: #define __AVR_HAVE_MUL__ 1 // CHECK: #define __AVR__ 1 // CHECK: #define __ELF__ 1 Index: clang/lib/Basic/Targets/AVR.cpp =================================================================== --- clang/lib/Basic/Targets/AVR.cpp +++ clang/lib/Basic/Targets/AVR.cpp @@ -12,6 +12,7 @@ #include "AVR.h" #include "clang/Basic/MacroBuilder.h" +#include "llvm/ADT/StringSwitch.h" using namespace clang; using namespace clang::targets; @@ -348,6 +349,53 @@ } // namespace targets } // namespace clang +static bool ArchHasELPM(StringRef Arch) { + return llvm::StringSwitch<bool>(Arch) + .Cases("31", "51", "6", true) + .Cases("104", "105", "106", "107", true) + .Default(false); +} + +static bool ArchHasELPMX(StringRef Arch) { + return llvm::StringSwitch<bool>(Arch) + .Cases("51", "6", true) + .Cases("104", "105", "106", "107", true) + .Default(false); +} + +static bool ArchHasMOVW(StringRef Arch) { + return llvm::StringSwitch<bool>(Arch) + .Cases("25", "35", "4", "5", "51", "6", true) + .Cases("102", "103", "104", "105", "106", "107", true) + .Default(false); +} + +static bool ArchHasLPMX(StringRef Arch) { + return ArchHasMOVW(Arch); // same architectures +} + +static bool ArchHasMUL(StringRef Arch) { + return llvm::StringSwitch<bool>(Arch) + .Cases("4", "5", "51", "6", true) + .Cases("102", "103", "104", "105", "106", "107", true) + .Default(false); +} + +static bool ArchHasJMPCALL(StringRef Arch) { + return llvm::StringSwitch<bool>(Arch) + .Cases("3", "31", "35", "5", "51", "6", true) + .Cases("102", "103", "104", "105", "106", "107", true) + .Default(false); +} + +static bool ArchHas3BytePC(StringRef Arch) { + // These devices have more than 128kB of program memory. + return llvm::StringSwitch<bool>(Arch) + .Case("6", true) + .Cases("106", "107", true) + .Default(false); +} + bool AVRTargetInfo::isValidCPUName(StringRef Name) const { return llvm::any_of( AVRMcus, [&](const MCUInfo &Info) { return Info.Name == Name; }); @@ -390,6 +438,25 @@ Builder.defineMacro("__AVR_ARCH__", Arch); + if (ArchHasELPM(Arch)) + Builder.defineMacro("__AVR_HAVE_ELPM__"); + if (ArchHasELPMX(Arch)) + Builder.defineMacro("__AVR_HAVE_ELPMX__"); + if (ArchHasMOVW(Arch)) + Builder.defineMacro("__AVR_HAVE_MOVW__"); + if (ArchHasLPMX(Arch)) + Builder.defineMacro("__AVR_HAVE_LPMX__"); + if (ArchHasMUL(Arch)) + Builder.defineMacro("__AVR_HAVE_MUL__"); + if (ArchHasJMPCALL(Arch)) + Builder.defineMacro("__AVR_HAVE_JMP_CALL__"); + if (ArchHas3BytePC(Arch)) { + Builder.defineMacro("__AVR_HAVE_EIJMP_EICALL__"); + Builder.defineMacro("__AVR_3_BYTE_PC__"); + } else { + Builder.defineMacro("__AVR_2_BYTE_PC__"); + } + if (NumFlashBanks >= 1) Builder.defineMacro("__flash", "__attribute__((address_space(1)))"); if (NumFlashBanks >= 2)
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits