[compiler-rt] r259272 - [profile] Support hostname expansion in LLVM_PROFILE_FILE
Xinliang David Li via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 23 20:30:47 PDT 2016
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?
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/22bdfe30/attachment.html>
More information about the llvm-commits
mailing list