[PATCH] D17676: Add some minimal portability code paths for PS4.

Sean Silva via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 26 23:53:22 PST 2016

silvas created this revision.
silvas added reviewers: davidxl, MaggieYi, phillip.power, filcab.
silvas added subscribers: llvm-commits, probinson, slingn, simon.f.whittaker.

Hi David, SCE folks,

What is implemented in this patch is enough for the upstream libprofile to
work for PGO with the PS4 game codebase I tested ("game7" for you SCE
folks; this is with a standalone build of compiler-rt).

The first change, which is simple, is to stub out gethostname. PS4
doesn't have a simple analog for this that doesn't bring in extra
OS libraries, so for now we do not support `%h` expansion.
This is consistent with internal B#136272.

The second change implies future work, but is a simple change at present.
PS4 does not have `getenv`, so for now we will introduce a shim.
This obviously makes it impossible for many of the tests to be run since
they require setting `LLVM_PROFILE_FILE=`.

I see two paths forward:

1. In the tests we are already wrapping execution with `%run` and so by
   setting a PS4-specific expansion for `%run` we can pass the information
   in another way We can adapt the getenv shim as appropriate.
   We will need to experiment with this internally.
   Maggie, Phillip, Filipe? Any ideas? Maybe ping me internally since we
   may need to get into some PS4 vagaries. I'm thinking a fake getenv
   library that uses some side channel for communication.

2. Another possibility which is more verbose is to use a separate clang
   invocation with `-profile-generate=<filename>` to set the filename in
   each test.
   This might require redundant clang invocations though which may be
   undesirable for upstream. David, thoughts?
   Also, this is a fairly libprofile-specific workaround, so it e.g.
   doesn't help Filipe's ASan work.
   Overall, this approach sounds like a bit of a hack to me.

Small detail:
InstrProfilingPort.h seems like the natural place for the getenv shim,
but GCDAProfiling.c needs it as well. InstrProfilingUtil.h is currently
the only header common between InstrProfilingFile.c and GCDAProfiling.c.
I can move the shim to InstrProfilingPort.h and add an include to
GCDAProfiling.c as per your preference David.



Index: lib/profile/InstrProfilingUtil.h
--- lib/profile/InstrProfilingUtil.h
+++ lib/profile/InstrProfilingUtil.h
@@ -13,4 +13,9 @@
 /*! \brief Create a directory tree. */
 void __llvm_profile_recursive_mkdir(char *Pathname);
+/* PS4 doesn't have getenv. Define a shim. */
+#if __PS4__
+static inline char *getenv(const char *name) { return 0; }
+#endif /* #if __PS4__ */
Index: lib/profile/InstrProfilingPort.h
--- lib/profile/InstrProfilingPort.h
+++ lib/profile/InstrProfilingPort.h
@@ -25,6 +25,8 @@
 #ifdef _MSC_VER
 #define COMPILER_RT_GETHOSTNAME(Name, Len) gethostname(Name, Len)
+#elif defined(__PS4__)
+#define COMPILER_RT_GETHOSTNAME(Name, Len) (-1)
 #define COMPILER_RT_GETHOSTNAME(Name, Len) GetHostName(Name, Len)

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D17676.49288.patch
Type: text/x-patch
Size: 989 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160227/1d76213d/attachment.bin>

More information about the llvm-commits mailing list