MSVC always_inline and noinline __attributes__ translation
authorElizabeth Smith <elizabeths@fb.com>
Wed, 16 Apr 2014 20:45:37 +0000 (13:45 -0700)
committerSara Golemon <sgolemon@fb.com>
Fri, 18 Apr 2014 19:04:15 +0000 (12:04 -0700)
Summary:
Provide translations for gcc always_inline and noinline attribute

Change to using a macro from portability.h for attributes for using always_inline and noinline for cross platform support

Test Plan: fbmake runtests

Reviewed By: delong.j@fb.com

FB internal diff: D1279652

folly/Portability.h
folly/detail/MemoryIdler.cpp
folly/experimental/exception_tracer/ExceptionTracerLib.cpp
folly/experimental/symbolizer/SignalHandler.cpp
folly/experimental/symbolizer/Symbolizer.h
folly/experimental/symbolizer/test/StackTraceTest.cpp
folly/experimental/symbolizer/test/SymbolizerTest.cpp

index ab41ef4ce2a77a37e02e8cc97fd4b2d49a66eee1..d7ef09bdf7f45ee11c143f987a05d53bea9cc14a 100644 (file)
@@ -50,6 +50,23 @@ struct MaxAlign { char c; } __attribute__((aligned));
 # define FOLLY_NORETURN
 #endif
 
+// noinline
+#ifdef _MSC_VER
+# define FOLLY_NOINLINE __declspec(noinline)
+#elif defined(__clang__) || defined(__GNUC__)
+# define FOLLY_NOINLINE __attribute__((noinline))
+#else
+# define FOLLY_NOINLINE
+#endif
+
+// always inline
+#ifdef _MSC_VER
+# define FOLLY_ALWAYS_INLINE __forceinline
+#elif defined(__clang__) || defined(__GNUC__)
+# define FOLLY_ALWAYS_INLINE inline __attribute__((always_inline))
+#else
+# define FOLLY_ALWAYS_INLINE
+#endif
 
 // portable version check
 #ifndef __GNUC_PREREQ
index 680a7562545405c7ee1429dfefe93f593e799aa7..2d026e4806480c00f17462adb74a5c1f67ac39d3 100644 (file)
@@ -130,7 +130,7 @@ static void fetchStackLimits() {
   assert((tls_stackLimit & (s_pageSize - 1)) == 0);
 }
 
-static __attribute__((noinline)) uintptr_t getStackPtr() {
+FOLLY_NOINLINE static uintptr_t getStackPtr() {
   char marker;
   auto rv = uintptr_t(&marker);
   return rv;
index 61803e7ddd8493ac96558736d2996cadad6b57c4..b04983bc03c106f73467bf700cb1c6d5ce85da6a 100644 (file)
@@ -96,7 +96,7 @@ extern "C" StackTraceStack* getExceptionStackTraceStack() {
 namespace {
 
 // Make sure we're counting stack frames correctly, don't inline.
-void addActiveException() __attribute__((noinline));
+FOLLY_NOINLINE void addActiveException();
 
 void addActiveException() {
   pthread_once(&initialized, initialize);
index 79f17f98e8f41bf195c4c06c6c78c164a5479825..f8e03a7bd622a253a2263ee19cfff9a9dfb3fe01 100644 (file)
@@ -198,7 +198,7 @@ constexpr size_t kDefaultCapacity = 500;
 auto gSignalSafeElfCache = new SignalSafeElfCache(kDefaultCapacity);
 }  // namespace
 
-void dumpStackTrace(bool symbolize) __attribute__((noinline));
+FOLLY_NOINLINE void dumpStackTrace(bool symbolize);
 
 void dumpStackTrace(bool symbolize) {
   SCOPE_EXIT { fsyncNoInt(STDERR_FILENO); };
index b4e9690203e713c45442835825f512366ab4689a..0000614114431f85c8ad87d53a03ee473efa2b95 100644 (file)
@@ -91,14 +91,14 @@ bool fixFrameArray(FrameArray<N>& fa, ssize_t n) {
 // Always inline these functions; they don't do much, and unittests rely
 // on them never showing up in a stack trace.
 template <size_t N>
-inline bool getStackTrace(FrameArray<N>& fa) __attribute__((always_inline));
+FOLLY_ALWAYS_INLINE bool getStackTrace(FrameArray<N>& fa);
 
 template <size_t N>
 inline bool getStackTrace(FrameArray<N>& fa) {
   return detail::fixFrameArray(fa, getStackTrace(fa.addresses, N));
 }
 template <size_t N>
-inline bool getStackTraceSafe(FrameArray<N>& fa) __attribute__((always_inline));
+FOLLY_ALWAYS_INLINE bool getStackTraceSafe(FrameArray<N>& fa);
 
 template <size_t N>
 inline bool getStackTraceSafe(FrameArray<N>& fa) {
index a7241256444970c3c867ca887a0daf56150540d1..7bd19df9ce947882b9e455908f99f627c19d01f4 100644 (file)
@@ -23,8 +23,8 @@
 using namespace folly;
 using namespace folly::symbolizer;
 
-void foo1() __attribute__((noinline));
-void foo2() __attribute__((noinline));
+FOLLY_NOINLINE void foo1();
+FOLLY_NOINLINE void foo2();
 
 void verifyStackTraces() {
   constexpr size_t kMaxAddresses = 100;
index cd2ab95b9372553d5e47201cc9a2ef95fc630e65..d283dc823f171224219949ef50ebdaa54f746be1 100644 (file)
@@ -55,7 +55,7 @@ int comparator(const void* ap, const void* bp) {
 }
 
 // Test stack frames...
-void bar() __attribute__((noinline));
+FOLLY_NOINLINE void bar();
 
 void bar() {
   int a[2] = {1, 2};