[llvm-commits] [compiler-rt] r163923 - in /compiler-rt/trunk: SDKs/darwin/usr/include/stdio.h lib/profile/GCDAProfiling.c
Benjamin Kramer
benny.kra at gmail.com
Mon Sep 17 03:25:31 PDT 2012
On 17.09.2012, at 11:22, Saša Tomić <tomic80 at gmail.com> wrote:
> This commit breaks the build on my machines (x86_64):
>
> /home/stomic/projects/llvm/projects/compiler-rt/lib/profile/GCDAProfiling.c:72:7: error: implicit declaration of function 'fread' is invalid in C99
> [-Werror,-Wimplicit-function-declaration]
> if (fread(&tmp, 1, 4, output_file) != 4)
> ^
> /home/stomic/projects/llvm/projects/compiler-rt/lib/profile/GCDAProfiling.c:232:9: error: implicit declaration of function 'ftell' is invalid in C99
> [-Werror,-Wimplicit-function-declaration]
> pos = ftell(output_file);
> ^
> COMPILE: clang_linux/asan-x86_64/x86_64: /home/stomic/projects/llvm/projects/compiler-rt/lib/asan/asan_allocator.cc
> /home/stomic/projects/llvm/projects/compiler-rt/lib/profile/GCDAProfiling.c:261:3: error: implicit declaration of function 'fseek' is invalid in C99
> [-Werror,-Wimplicit-function-declaration]
> fseek(output_file, pos, SEEK_SET);
> ^
> /home/stomic/projects/llvm/projects/compiler-rt/lib/profile/GCDAProfiling.c:261:27: error: use of undeclared identifier 'SEEK_SET'
> fseek(output_file, pos, SEEK_SET);
> ^
> 4 errors generated.
> /home/stomic/projects/llvm/projects/compiler-rt/lib/profile/GCDAProfiling.c:72:7: error: implicit declaration of function 'fread' is invalid in C99
> [-Werror,-Wimplicit-function-declaration]
> if (fread(&tmp, 1, 4, output_file) != 4)
> ^
> make[5]: *** [/home/stomic/projects/llvm/build/tools/clang/runtime/compiler-rt/clang_linux/profile-i386/i386/SubDir.lib__profile/GCDAProfiling.o] Error 1
> make[5]: *** Waiting for unfinished jobs....
> /home/stomic/projects/llvm/projects/compiler-rt/lib/profile/GCDAProfiling.c:232:9: error: implicit declaration of function 'ftell' is invalid in C99
> [-Werror,-Wimplicit-function-declaration]
> pos = ftell(output_file);
> ^
> /home/stomic/projects/llvm/projects/compiler-rt/lib/profile/GCDAProfiling.c:256:53: error: format specifies type 'long long' but the argument has type 'uint64_t'
> (aka 'unsigned long') [-Werror,-Wformat]
> fprintf(stderr, "old counter[%d]: %lld\n", j, old_ctrs[j]);
> ~~~~ ^~~~~~~~~~~
> %ld
> /home/stomic/projects/llvm/projects/compiler-rt/lib/profile/GCDAProfiling.c:261:3: error: implicit declaration of function 'fseek' is invalid in C99
> [-Werror,-Wimplicit-function-declaration]
> fseek(output_file, pos, SEEK_SET);
> ^
> /home/stomic/projects/llvm/projects/compiler-rt/lib/profile/GCDAProfiling.c:261:27: error: use of undeclared identifier 'SEEK_SET'
> fseek(output_file, pos, SEEK_SET);
> ^
> 5 errors generated.
Committed a fix in r164025. Let me know if it's still broken.
- Ben
>
>
> Regards,
> Sasha
>
> On 09/14/2012 08:55 PM, Bill Wendling wrote:
>> Author: void
>> Date: Fri Sep 14 13:55:32 2012
>> New Revision: 163923
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=163923&view=rev
>> Log:
>> Add support for reading the GCDA file and merging the arc information.
>>
>> With the advent of the __llvm_gcov_flush function, we need to be able to merge
>> counts into the .gcda files in an intelligent manner. This involves reading the
>> file if it exists, adding the counts together, and then writing the results.
>> <rdar://problem/12185886>
>>
>> Modified:
>> compiler-rt/trunk/SDKs/darwin/usr/include/stdio.h
>> compiler-rt/trunk/lib/profile/GCDAProfiling.c
>>
>> Modified: compiler-rt/trunk/SDKs/darwin/usr/include/stdio.h
>> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/SDKs/darwin/usr/include/stdio.h?rev=163923&r1=163922&r2=163923&view=diff
>> ==============================================================================
>> --- compiler-rt/trunk/SDKs/darwin/usr/include/stdio.h (original)
>> +++ compiler-rt/trunk/SDKs/darwin/usr/include/stdio.h Fri Sep 14 13:55:32 2012
>> @@ -51,11 +51,24 @@
>> # define stderr __stderrp
>> extern FILE *__stderrp;
>> +#ifndef SEEK_SET
>> +#define SEEK_SET 0 /* set file offset to offset */
>> +#endif
>> +#ifndef SEEK_CUR
>> +#define SEEK_CUR 1 /* set file offset to current plus offset */
>> +#endif
>> +#ifndef SEEK_END
>> +#define SEEK_END 2 /* set file offset to EOF plus offset */
>> +#endif
>> +
>> int fclose(FILE *);
>> int fflush(FILE *);
>> FILE *fopen(const char * restrict, const char * restrict) __asm(__FOPEN_NAME);
>> int fprintf(FILE * restrict, const char * restrict, ...);
>> size_t fwrite(const void * restrict, size_t, size_t, FILE * restrict)
>> __asm(__FWRITE_NAME);
>> +size_t fread(void * __restrict, size_t, size_t, FILE * __restrict);
>> +long ftell(FILE *);
>> +int fseek(FILE *, long, int);
>> #endif /* __STDIO_H__ */
>>
>> Modified: compiler-rt/trunk/lib/profile/GCDAProfiling.c
>> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/GCDAProfiling.c?rev=163923&r1=163922&r2=163923&view=diff
>> ==============================================================================
>> --- compiler-rt/trunk/lib/profile/GCDAProfiling.c (original)
>> +++ compiler-rt/trunk/lib/profile/GCDAProfiling.c Fri Sep 14 13:55:32 2012
>> @@ -66,6 +66,24 @@
>> fwrite("\0\0\0\0", 4 - (strlen(s) % 4), 1, output_file);
>> }
>> +static uint32_t read_int32() {
>> + uint32_t tmp;
>> +
>> + if (fread(&tmp, 1, 4, output_file) != 4)
>> + return (uint32_t)-1;
>> +
>> + return tmp;
>> +}
>> +
>> +static uint64_t read_int64() {
>> + uint64_t tmp;
>> +
>> + if (fread(&tmp, 1, 8, output_file) != 8)
>> + return (uint64_t)-1;
>> +
>> + return tmp;
>> +}
>> +
>> static char *mangle_filename(const char *orig_filename) {
>> char *filename = 0;
>> int prefix_len = 0;
>> @@ -129,15 +147,24 @@
>> */
>> void llvm_gcda_start_file(const char *orig_filename) {
>> char *filename = mangle_filename(orig_filename);
>> - output_file = fopen(filename, "w+b");
>> + char buffer[13];
>> +
>> + /* Try just opening the file. */
>> + output_file = fopen(filename, "r+b");
>> if (!output_file) {
>> - recursive_mkdir(filename);
>> + /* Try opening the file, creating it if necessary. */
>> output_file = fopen(filename, "w+b");
>> if (!output_file) {
>> - fprintf(stderr, "profiling:%s: cannot open\n", filename);
>> - free(filename);
>> - return;
>> + /* Try creating the directories first then opening the file. */
>> + recursive_mkdir(filename);
>> + output_file = fopen(filename, "w+b");
>> + if (!output_file) {
>> + /* Bah! It's hopeless. */
>> + fprintf(stderr, "profiling:%s: cannot open\n", filename);
>> + free(filename);
>> + return;
>> + }
>> }
>> }
>> @@ -148,11 +175,11 @@
>> fwrite("adcg*404MVLL", 12, 1, output_file);
>> #endif
>> + free(filename);
>> +
>> #ifdef DEBUG_GCDAPROFILING
>> - printf("llvmgcda: [%s]\n", orig_filename);
>> + fprintf(stderr, "llvmgcda: [%s]\n", orig_filename);
>> #endif
>> -
>> - free(filename);
>> }
>> /* Given an array of pointers to counters (counters), increment the n-th one,
>> @@ -175,14 +202,14 @@
>> #ifdef DEBUG_GCDAPROFILING
>> else
>> fprintf(stderr,
>> - "llvmgcda: increment_indirect_counter counters=%x, pred=%u\n",
>> - state_table_row, *predecessor);
>> + "llvmgcda: increment_indirect_counter counters=%08llx, pred=%u\n",
>> + *counter, *predecessor);
>> #endif
>> }
>> void llvm_gcda_emit_function(uint32_t ident, const char *function_name) {
>> #ifdef DEBUG_GCDAPROFILING
>> - printf("llvmgcda: function id=%x\n", ident);
>> + fprintf(stderr, "llvmgcda: function id=0x%08x\n", ident);
>> #endif
>> if (!output_file) return;
>> @@ -197,18 +224,55 @@
>> void llvm_gcda_emit_arcs(uint32_t num_counters, uint64_t *counters) {
>> uint32_t i;
>> + uint64_t *old_ctrs = NULL;
>> + uint32_t val = 0;
>> + long pos = 0;
>> - /* Counter #1 (arcs) tag */
>> if (!output_file) return;
>> +
>> + pos = ftell(output_file);
>> + val = read_int32();
>> +
>> + fprintf(stderr, "Read: 0x%08x\n", val);
>> +
>> + if (val != (uint32_t)-1) {
>> + /* There are counters present in the file. Merge them. */
>> + uint32_t j;
>> +
>> + if (val != 0x01a10000) {
>> + fprintf(stderr, "profiling: invalid magic number (0x%08x)\n", val);
>> + return;
>> + }
>> +
>> + val = read_int32();
>> + if (val == (uint32_t)-1 || val / 2 != num_counters) {
>> + fprintf(stderr, "profiling: invalid number of counters (%d)\n", val);
>> + return;
>> + }
>> +
>> + old_ctrs = malloc(sizeof(uint64_t) * num_counters);
>> +
>> + for (j = 0; j < num_counters; ++j) {
>> + old_ctrs[j] = read_int64();
>> + fprintf(stderr, "old counter[%d]: %lld\n", j, old_ctrs[j]);
>> + }
>> + }
>> +
>> + /* Reset for writing. */
>> + fseek(output_file, pos, SEEK_SET);
>> +
>> + /* Counter #1 (arcs) tag */
>> fwrite("\0\0\xa1\1", 4, 1, output_file);
>> write_int32(num_counters * 2);
>> for (i = 0; i < num_counters; ++i)
>> - write_int64(counters[i]);
>> + write_int64(counters[i] + (old_ctrs ? old_ctrs[i] : 0));
>> +
>> + free(old_ctrs);
>> #ifdef DEBUG_GCDAPROFILING
>> - printf("llvmgcda: %u arcs\n", num_counters);
>> + fprintf(stderr, "llvmgcda: %u arcs\n", num_counters);
>> for (i = 0; i < num_counters; ++i)
>> - printf("llvmgcda: %llu\n", (unsigned long long)counters[i]);
>> + fprintf(stderr, "llvmgcda: %llu\n", (unsigned long long)counters[i]);
>> #endif
>> }
>> @@ -220,6 +284,6 @@
>> output_file = NULL;
>> #ifdef DEBUG_GCDAPROFILING
>> - printf("llvmgcda: -----\n");
>> + fprintf(stderr, "llvmgcda: -----\n");
>> #endif
>> }
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
> --
> best regards,
> Saša
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list