[compiler-rt] r259272 - [profile] Support hostname expansion in LLVM_PROFILE_FILE

Sean Silva via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 23 22:28:16 PDT 2016


On Thu, Jun 23, 2016 at 10:20 PM, Xinliang David Li <xinliangli at gmail.com>
wrote:

> Another choice is to explicitly call gethostname or equivalent in main --
> but looks like this is not available for PS4 either?
>

It is available, but requires bringing in a heavyweight dependency. Since
we don't want that dependency for libprofile, we don't support %h; hence we
XFAIL this test regardless. So basically, I guess just don't worry about
PS4 for this one :)

-- Sean Silva


>
> David
>
> On Thu, Jun 23, 2016 at 10:00 PM, Sean Silva <chisophugis at gmail.com>
> wrote:
>
>>
>>
>> On Thu, Jun 23, 2016 at 9:15 PM, Xinliang David Li <xinliangli at gmail.com>
>> wrote:
>>
>>> Does the patch look fine?
>>>
>>> David
>>>
>>> Index: instrprof-hostname.c
>>> ===================================================================
>>> --- instrprof-hostname.c (revision 273505)
>>> +++ instrprof-hostname.c (working copy)
>>> @@ -1,6 +1,7 @@
>>>  // RUN: %clang_profgen -o %t -O3 %s
>>>  // RUN: env LLVM_PROFILE_FILE=%h.%t-%h.profraw_%h %run %t
>>> -// RUN: llvm-profdata merge -o %t.profdata `uname -n`.%t-`uname
>>> -n`.profraw_`uname -n`
>>> +// RUN: %run uname -n > %t.n
>>> +// RUN: llvm-profdata merge -o %t.profdata `cat %t.n`.%t-`cat
>>> %t.n`.profraw_`cat %t.n`
>>>  // RUN: %clang_profuse=%t.profdata -o - -S -emit-llvm %s | FileCheck %s
>>>  // REQUIRES: shell
>>>
>>
>> This LGTM for general UNIX-y target devices (nice solution!).
>> Unfortunately PS4 does not have any of the standard UNIX utilities
>> available for running on the target. In fact, there is no shell on the PS4
>> target, no /bin, no /usr/bin, etc. :(
>>
>> -- Sean Silva
>>
>>
>>>
>>>
>>> On Thu, Jun 23, 2016 at 8:51 PM, Sean Silva <chisophugis at gmail.com>
>>> wrote:
>>>
>>>>
>>>>
>>>> On Thu, Jun 23, 2016 at 8:30 PM, Xinliang David Li <
>>>> xinliangli at gmail.com> wrote:
>>>>
>>>>> The test case can be modified to dump hostname to a file. At the host
>>>>> side, re-create the file name and make sure it exists. Does that work?
>>>>>
>>>>
>>>> That would work I think; I don't have an environment where I can
>>>> effectively fix/test it though. On PS4 we don't support %h expansion (it
>>>> would bring in a heavyweight dependency) so I have this XFAIL'd locally (it
>>>> is not urgent to fix for us).
>>>>
>>>> The `REQUIRES: shell` had been masking the issue for us until recently
>>>> and so I'm just now commenting on this patch.
>>>>
>>>> -- Sean Silva
>>>>
>>>>
>>>>>
>>>>> David
>>>>>
>>>>> On Thu, Jun 23, 2016 at 7:48 PM, Sean Silva via llvm-commits <
>>>>> llvm-commits at lists.llvm.org> wrote:
>>>>>
>>>>>> Hi Vedant, Daniel,
>>>>>>
>>>>>> The test case in this patch is fundamentally flawed: it runs `uname
>>>>>> -n` on the host, while `%h` expands on the target. No relation between them
>>>>>> can be assumed.
>>>>>>
>>>>>> Unfortunately, I don't really have a concrete suggestion for
>>>>>> improving the test case: we would have to have some sort of special
>>>>>> knowledge of what %run is actually configured to do in order to "verify"
>>>>>> anything about the filename.
>>>>>>
>>>>>> -- Sean Silva
>>>>>>
>>>>>> On Fri, Jan 29, 2016 at 3:52 PM, Vedant Kumar via llvm-commits <
>>>>>> llvm-commits at lists.llvm.org> wrote:
>>>>>>
>>>>>>> Author: vedantk
>>>>>>> Date: Fri Jan 29 17:52:11 2016
>>>>>>> New Revision: 259272
>>>>>>>
>>>>>>> URL: http://llvm.org/viewvc/llvm-project?rev=259272&view=rev
>>>>>>> Log:
>>>>>>> [profile] Support hostname expansion in LLVM_PROFILE_FILE
>>>>>>>
>>>>>>> This patch adds support for expanding "%h" out to the machine
>>>>>>> hostname
>>>>>>> in the LLVM_PROFILE_FILE environment variable.
>>>>>>>
>>>>>>> Patch by Daniel Waters!
>>>>>>>
>>>>>>> Differential Revision: http://reviews.llvm.org/D16371
>>>>>>>
>>>>>>> Added:
>>>>>>>     compiler-rt/trunk/test/profile/instrprof-hostname.c
>>>>>>> Modified:
>>>>>>>     compiler-rt/trunk/lib/profile/InstrProfilingFile.c
>>>>>>>     compiler-rt/trunk/lib/profile/InstrProfilingPort.h
>>>>>>>
>>>>>>> Modified: compiler-rt/trunk/lib/profile/InstrProfilingFile.c
>>>>>>> URL:
>>>>>>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfilingFile.c?rev=259272&r1=259271&r2=259272&view=diff
>>>>>>>
>>>>>>> ==============================================================================
>>>>>>> --- compiler-rt/trunk/lib/profile/InstrProfilingFile.c (original)
>>>>>>> +++ compiler-rt/trunk/lib/profile/InstrProfilingFile.c Fri Jan 29
>>>>>>> 17:52:11 2016
>>>>>>> @@ -14,9 +14,22 @@
>>>>>>>  #include <stdio.h>
>>>>>>>  #include <stdlib.h>
>>>>>>>  #include <string.h>
>>>>>>> +#ifdef COMPILER_RT_HAS_UNAME
>>>>>>> +#include <sys/utsname.h>
>>>>>>> +#endif
>>>>>>>
>>>>>>>  #define UNCONST(ptr) ((void *)(uintptr_t)(ptr))
>>>>>>>
>>>>>>> +#ifdef COMPILER_RT_HAS_UNAME
>>>>>>> +int GetHostName(char *Name, int Len) {
>>>>>>> +    struct utsname N;
>>>>>>> +    int R;
>>>>>>> +    if (!(R = uname(&N)))
>>>>>>> +      strncpy(Name, N.nodename, Len);
>>>>>>> +    return R;
>>>>>>> +}
>>>>>>> +#endif
>>>>>>> +
>>>>>>>  /* Return 1 if there is an error, otherwise return  0.  */
>>>>>>>  static uint32_t fileWriter(ProfDataIOVec *IOVecs, uint32_t
>>>>>>> NumIOVecs,
>>>>>>>                             void **WriterCtx) {
>>>>>>> @@ -114,9 +127,10 @@ int getpid(void);
>>>>>>>  static int setFilenamePossiblyWithPid(const char *Filename) {
>>>>>>>  #define MAX_PID_SIZE 16
>>>>>>>    char PidChars[MAX_PID_SIZE] = {0};
>>>>>>> -  int NumPids = 0, PidLength = 0;
>>>>>>> +  int NumPids = 0, PidLength = 0, NumHosts = 0, HostNameLength = 0;
>>>>>>>    char *Allocated;
>>>>>>>    int I, J;
>>>>>>> +  char Hostname[COMPILER_RT_MAX_HOSTLEN];
>>>>>>>
>>>>>>>    /* Reset filename on NULL, except with env var which is checked
>>>>>>> by caller. */
>>>>>>>    if (!Filename) {
>>>>>>> @@ -126,19 +140,29 @@ static int setFilenamePossiblyWithPid(co
>>>>>>>
>>>>>>>    /* Check the filename for "%p", which indicates a
>>>>>>> pid-substitution. */
>>>>>>>    for (I = 0; Filename[I]; ++I)
>>>>>>> -    if (Filename[I] == '%' && Filename[++I] == 'p')
>>>>>>> -      if (!NumPids++) {
>>>>>>> -        PidLength = snprintf(PidChars, MAX_PID_SIZE, "%d",
>>>>>>> getpid());
>>>>>>> -        if (PidLength <= 0)
>>>>>>> -          return -1;
>>>>>>> +    if (Filename[I] == '%') {
>>>>>>> +      if (Filename[++I] == 'p') {
>>>>>>> +        if (!NumPids++) {
>>>>>>> +          PidLength = snprintf(PidChars, MAX_PID_SIZE, "%d",
>>>>>>> getpid());
>>>>>>> +          if (PidLength <= 0)
>>>>>>> +            return -1;
>>>>>>> +        }
>>>>>>> +      } else if (Filename[I] == 'h') {
>>>>>>> +        if (!NumHosts++)
>>>>>>> +          if (COMPILER_RT_GETHOSTNAME(Hostname,
>>>>>>> COMPILER_RT_MAX_HOSTLEN))
>>>>>>> +            return -1;
>>>>>>> +          HostNameLength = strlen(Hostname);
>>>>>>>        }
>>>>>>> -  if (!NumPids) {
>>>>>>> +    }
>>>>>>> +
>>>>>>> +  if (!(NumPids || NumHosts)) {
>>>>>>>      setFilename(Filename, 0);
>>>>>>>      return 0;
>>>>>>>    }
>>>>>>>
>>>>>>>    /* Allocate enough space for the substituted filename. */
>>>>>>> -  Allocated = malloc(I + NumPids*(PidLength - 2) + 1);
>>>>>>> +  Allocated = malloc(I + NumPids*(PidLength - 2) +
>>>>>>> +                     NumHosts*(HostNameLength - 2) + 1);
>>>>>>>    if (!Allocated)
>>>>>>>      return -1;
>>>>>>>
>>>>>>> @@ -149,6 +173,10 @@ static int setFilenamePossiblyWithPid(co
>>>>>>>          memcpy(Allocated + J, PidChars, PidLength);
>>>>>>>          J += PidLength;
>>>>>>>        }
>>>>>>> +      else if (Filename[I] == 'h') {
>>>>>>> +        memcpy(Allocated + J, Hostname, HostNameLength);
>>>>>>> +        J += HostNameLength;
>>>>>>> +      }
>>>>>>>        /* Drop any unknown substitutions. */
>>>>>>>      } else
>>>>>>>        Allocated[J++] = Filename[I];
>>>>>>>
>>>>>>> Modified: compiler-rt/trunk/lib/profile/InstrProfilingPort.h
>>>>>>> URL:
>>>>>>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfilingPort.h?rev=259272&r1=259271&r2=259272&view=diff
>>>>>>>
>>>>>>> ==============================================================================
>>>>>>> --- compiler-rt/trunk/lib/profile/InstrProfilingPort.h (original)
>>>>>>> +++ compiler-rt/trunk/lib/profile/InstrProfilingPort.h Fri Jan 29
>>>>>>> 17:52:11 2016
>>>>>>> @@ -22,6 +22,14 @@
>>>>>>>
>>>>>>>  #define COMPILER_RT_SECTION(Sect) __attribute__((section(Sect)))
>>>>>>>
>>>>>>> +#define COMPILER_RT_MAX_HOSTLEN 128
>>>>>>> +#ifdef _MSC_VER
>>>>>>> +#define COMPILER_RT_GETHOSTNAME(Name, Len) gethostname(Name, Len)
>>>>>>> +#else
>>>>>>> +#define COMPILER_RT_GETHOSTNAME(Name, Len) GetHostName(Name, Len)
>>>>>>> +#define COMPILER_RT_HAS_UNAME 1
>>>>>>> +#endif
>>>>>>> +
>>>>>>>  #if COMPILER_RT_HAS_ATOMICS == 1
>>>>>>>  #ifdef _MSC_VER
>>>>>>>  #include <windows.h>
>>>>>>>
>>>>>>> Added: compiler-rt/trunk/test/profile/instrprof-hostname.c
>>>>>>> URL:
>>>>>>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/profile/instrprof-hostname.c?rev=259272&view=auto
>>>>>>>
>>>>>>> ==============================================================================
>>>>>>> --- compiler-rt/trunk/test/profile/instrprof-hostname.c (added)
>>>>>>> +++ compiler-rt/trunk/test/profile/instrprof-hostname.c Fri Jan 29
>>>>>>> 17:52:11 2016
>>>>>>> @@ -0,0 +1,13 @@
>>>>>>> +// RUN: %clang_profgen -o %t -O3 %s
>>>>>>> +// RUN: env LLVM_PROFILE_FILE=%h.%t-%h.profraw_%h %run %t
>>>>>>> +// RUN: llvm-profdata merge -o %t.profdata `uname -n`.%t-`uname
>>>>>>> -n`.profraw_`uname -n`
>>>>>>> +// RUN: %clang_profuse=%t.profdata -o - -S -emit-llvm %s |
>>>>>>> FileCheck %s
>>>>>>> +// REQUIRES: shell
>>>>>>> +
>>>>>>> +int main(int argc, const char *argv[]) {
>>>>>>> +  // CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}, !prof
>>>>>>> ![[PD1:[0-9]+]]
>>>>>>> +  if (argc > 2)
>>>>>>> +    return 1;
>>>>>>> +  return 0;
>>>>>>> +}
>>>>>>> +// CHECK: ![[PD1]] = !{!"branch_weights", i32 1, i32 2}
>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> llvm-commits mailing list
>>>>>>> llvm-commits at lists.llvm.org
>>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>>>>>
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> llvm-commits mailing list
>>>>>> llvm-commits at lists.llvm.org
>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160623/379037fd/attachment.html>


More information about the llvm-commits mailing list