[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 20:51:13 PDT 2016
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/14713b81/attachment.html>
More information about the llvm-commits
mailing list