Skip to content

Commit a10af6b

Browse files
Force inlining of inline print[ln] methods
Add GCC __attribute__ ((__always_inline__)) to inlined methods in Print.h. This seems necessary since not doing so increases the executable size (probably because that would create several function definitions), even with LTO optimizations. This change combined with the inlining of print/printf methods seems to reduce the executable size for most applications by a fair amount. (Note that the `inline` keyword does not imply actual inlining.)
1 parent da0b943 commit a10af6b

File tree

1 file changed

+16
-12
lines changed

1 file changed

+16
-12
lines changed

cores/arduino/Print.h

+16-12
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
#endif
3535
#define BIN 2
3636

37+
#define _always_inline __attribute__ ((__always_inline__)) // undefined at end
38+
3739
class Print
3840
{
3941
private:
@@ -68,24 +70,26 @@ class Print
6870
size_t print(unsigned long, int = DEC);
6971
size_t print(double, int = 2);
7072

71-
size_t print(const char str[]) { return write(str); }
72-
size_t print(const char c) { return write(c); }
73-
size_t print(const Printable &x) { return x.printTo(*this); }
73+
_always_inline size_t print(const char str[]) { return write(str); }
74+
_always_inline size_t print(const char c) { return write(c); }
75+
_always_inline size_t print(const Printable &x) { return x.printTo(*this); }
7476

75-
size_t print( signed char n, int f = DEC) { return print(( signed long) n, f); }
76-
size_t print( signed short n, int f = DEC) { return print(( signed long) n, f); }
77-
size_t print( signed int n, int f = DEC) { return print(( signed long) n, f); }
78-
size_t print(unsigned char n, int f = DEC) { return print((unsigned long) n, f); }
79-
size_t print(unsigned short n, int f = DEC) { return print((unsigned long) n, f); }
80-
size_t print(unsigned int n, int f = DEC) { return print((unsigned long) n, f); }
81-
size_t print( float n, int f = 2 ) { return print(( double ) n, f); }
77+
_always_inline size_t print( signed char n, int f = DEC) { return print(( signed long) n, f); }
78+
_always_inline size_t print( signed short n, int f = DEC) { return print(( signed long) n, f); }
79+
_always_inline size_t print( signed int n, int f = DEC) { return print(( signed long) n, f); }
80+
_always_inline size_t print(unsigned char n, int f = DEC) { return print((unsigned long) n, f); }
81+
_always_inline size_t print(unsigned short n, int f = DEC) { return print((unsigned long) n, f); }
82+
_always_inline size_t print(unsigned int n, int f = DEC) { return print((unsigned long) n, f); }
83+
_always_inline size_t print( float n, int f = 2 ) { return print(( double ) n, f); }
8284

8385
size_t println(void);
8486

8587
virtual void flush() { /* Empty implementation for backward compatibility */ }
8688

87-
template<typename T> size_t println(const T &arg) { size_t t = print(arg); return t + println(); }
88-
template<typename T> size_t println(const T &n, int f) { size_t t = print(n, f); return t + println(); }
89+
template<typename T> _always_inline size_t println(const T &arg) { size_t t = print(arg); return t + println(); }
90+
template<typename T> _always_inline size_t println(const T &n, int f) { size_t t = print(n, f); return t + println(); }
8991
};
9092

93+
#undef _always_inline
94+
9195
#endif

0 commit comments

Comments
 (0)