1 #define PROGMEM __attribute__((progmem))
2 
3 #define PSTR(s)                                             \
4     (__extension__({                                        \
5             static const char __c[] PROGMEM = (s);          \
6             &__c[0];}))
7 
8 #ifdef __AVR_HAVE_LPMX__
9 #define pgm_read_char(addr)                                 \
10     (__extension__({                                        \
11             unsigned int __addr16 = (unsigned int)(addr);   \
12             char __result;                                  \
13             __asm__ ("lpm %0, %a1"                          \
14                      : "=r" (__result) : "z" (__addr16));   \
15             __result; }))
16 #elif defined (__AVR_TINY__)
17 /* PR71948 auto-adds 0x4000 as needed, hance just a plain read. */
18 #define pgm_read_char(addr)                                 \
19   (*(addr))
20 #else
21 #define pgm_read_char(addr)                                 \
22     (__extension__({                                        \
23             unsigned int __addr16 = (unsigned int)(addr);   \
24             char __result;                                  \
25             __asm__ ("lpm" "\n\t"                           \
26                      "mov %0, r0"                           \
27                      : "=r" (__result) : "z" (__addr16));   \
28             __result; }))
29 #endif
30