[PATCH] D20148: Idea for avoiding memory allocation calls.

Sean Silva via llvm-commits llvm-commits at lists.llvm.org
Tue May 10 23:14:29 PDT 2016


silvas created this revision.
silvas added reviewers: davidxl, xur, vsk.
silvas added a subscriber: llvm-commits.
silvas set the repository for this revision to rL LLVM.

On PS4 we ideally will make no calls into malloc/calloc/free. Currently value profiling is the only source of such calls in libprofile, but even when the compiler emits no value profiling instrumentation we still end up making memory allocation calls.

What do you guys think about adding a check like this? It is conceptually similar to the check for `VPDataGatherer` which effectively is bailing out early for a somewhat related reason (in that case, it is more generally that some hooks will be null because they aren't present, rather than just "we shouldn't call them").

I've run tests on my Mac laptop and everything passes. I'll do some more thorough checking on PS4 when I'm back in the office on Thu (currently I'm at a conference and don't have easy access to my workstation / devkits).

Does this make sense? As far as testing I was thinking of something like using LD_PRELOAD (and whatever the mac one is) to interpose malloc/calloc/free and verify there are no calls to them.

[1] We'll need to have a separate discussion of controlling VP instrumentation (probably a decision at clang driver based on triple). On PS4 we need to have it off (at least by default) to avoid interacting with a game's dynamic memory allocation.

Repository:
  rL LLVM

http://reviews.llvm.org/D20148

Files:
  lib/profile/InstrProfilingWriter.c

Index: lib/profile/InstrProfilingWriter.c
===================================================================
--- lib/profile/InstrProfilingWriter.c
+++ lib/profile/InstrProfilingWriter.c
@@ -91,6 +91,15 @@
   return 0;
 }
 
+static int hasNoValueSites(const __llvm_profile_data *DataBegin,
+                           const __llvm_profile_data *DataEnd) {
+  for (; DataBegin != DataEnd; ++DataBegin)
+    for (int I = 0; I <= IPVK_Last; I++)
+      if (DataBegin->NumValueSites[I] != 0)
+        return 0;
+  return 1;
+}
+
 #define VP_BUFFER_SIZE 8 * 1024
 static int writeValueProfData(WriterCallback Writer, void *WriterCtx,
                               VPGatherHookType VPDataGatherer,
@@ -100,7 +109,10 @@
   uint32_t BufferSz;
   const __llvm_profile_data *DI = 0;
 
-  if (!VPDataGatherer)
+  /* Bail out early so that we don't attempt to call any memory allocation
+   * functions.
+   */
+  if (!VPDataGatherer || hasNoValueSites(DataBegin, DataEnd))
     return 0;
 
   BufferSz = VPBufferSize ? VPBufferSize : VP_BUFFER_SIZE;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D20148.56852.patch
Type: text/x-patch
Size: 1041 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160511/5d78730f/attachment.bin>


More information about the llvm-commits mailing list