From 8336eb31ed54bcd73eadd993a15f488bdeb96de8 Mon Sep 17 00:00:00 2001
From: Tudor Bosman <tudorb@fb.com>
Date: Wed, 15 Jan 2014 19:14:30 -0800
Subject: [PATCH] stack_trace_test was broken in debug mode

Summary: A function was getting inlined in opt mode but not in debug mode.

Test Plan: ran test

Reviewed By: philipp@fb.com

FB internal diff: D1130949

@override-unit-failures
test fix only
---
 folly/experimental/symbolizer/Symbolizer.h        | 11 +++++++++--
 .../symbolizer/test/StackTraceTest.cpp            | 15 ++++++++++++++-
 2 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/folly/experimental/symbolizer/Symbolizer.h b/folly/experimental/symbolizer/Symbolizer.h
index 0c87ed77..c9341f4f 100644
--- a/folly/experimental/symbolizer/Symbolizer.h
+++ b/folly/experimental/symbolizer/Symbolizer.h
@@ -74,13 +74,20 @@ bool fixFrameArray(FrameArray<N>& fa, ssize_t n) {
 }
 }  // namespace detail
 
+// 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>
-bool getStackTrace(FrameArray<N>& fa) {
+inline bool getStackTrace(FrameArray<N>& fa) __attribute__((always_inline));
+
+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));
 
 template <size_t N>
-bool getStackTraceSafe(FrameArray<N>& fa) {
+inline bool getStackTraceSafe(FrameArray<N>& fa) {
   return detail::fixFrameArray(fa, getStackTraceSafe(fa.addresses, N));
 }
 
diff --git a/folly/experimental/symbolizer/test/StackTraceTest.cpp b/folly/experimental/symbolizer/test/StackTraceTest.cpp
index 730e68ea..a7241256 100644
--- a/folly/experimental/symbolizer/test/StackTraceTest.cpp
+++ b/folly/experimental/symbolizer/test/StackTraceTest.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Facebook, Inc.
+ * Copyright 2014 Facebook, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -36,6 +36,19 @@ void verifyStackTraces() {
 
   CHECK_EQ(fa.frameCount, faSafe.frameCount);
 
+  if (VLOG_IS_ON(1)) {
+    Symbolizer symbolizer;
+    OStreamSymbolizePrinter printer(std::cerr, SymbolizePrinter::COLOR_IF_TTY);
+
+    symbolizer.symbolize(fa);
+    VLOG(1) << "getStackTrace\n";
+    printer.println(fa);
+
+    symbolizer.symbolize(faSafe);
+    VLOG(1) << "getStackTraceSafe\n";
+    printer.println(faSafe);
+  }
+
   // Other than the top 2 frames (this one and getStackTrace /
   // getStackTraceSafe), the stack traces should be identical
   for (size_t i = 2; i < fa.frameCount; ++i) {
-- 
2.34.1