#pragma options [no]info, #pragma info
Produces or suppresses groups of informational messages.
The messages are written to standard output and, optionally, to the listing file if one is generated. The compiler does not issue messages for the following files:
Option syntax >>- -q--+-noinfo-------------------------+--------------------->< '-info--+----------------------+-' | .-:-------------. | | V | | '-=----+-all-------+-+-' +-noall-----+ +-als-------+ +-noals-----+ +-group-----+ +-nogroup---+ +-mt--------+ +-nomt------+ +-private---+ +-reduction-+ +-stp-------+ '-nostp-----'
Pragma syntax .-,-------------. V | >>-#--pragma--info--(----+-all-------+-+--)-------------------->< +-none------+ +-als-------+ +-noals-----+ +-group-----+ +-nogroup---+ +-mt--------+ +-nomt------+ +-private---+ +-reduction-+ '-restore---'
-qnoinfo
-qinfo=unset uses program information, such as control flow information, available during optimization. As a result, detection accuracy improves with the optimization level. For example, some uses of unset variables that are not flagged at -O0 are flagged at -O2. Aggressive optimization levels, such as -O4 and -O5, can cause the line numbers in the informational messages to become inaccurate. In very rare cases, these optimization levels reorder the program sufficiently to cause false positive messages from static analysis. You can get the best results with the -O2 optimization level.
The -qinitauto option initializes automatic variables. As a result, the -qinitauto option hides variables that are used before they are set from the -qinfo=unset option.
Reports potential synchronization issues in parallel code. This suboption detects the Global Thread Flag pattern where one thread uses a shared volatile flag variable to notify other threads that it has completed a computation and stored its result to memory. Other threads check the flag variable in a loop that does not change the flag variable. When the value of the flag variable changes, the waiting threads access the computation result from memory. The PowerPC® storage model requires synchronization before the flag variable is set in the first thread, and after the flag variable is checked in the waiting threads. Synchronization can be done by a synchronization built-in function.
gotosleep: sleep(value);
if (!flag) goto gotosleep;
// A call to the __isync function is needed here.
x = shared_computation_result;
Some patterns that do not require synchronization are similar to the patterns described above. The messages generated by this suboption are only suggestions about potential synchronization issues.
The default option is -qinfo=nomt.
Specifying -qinfo with no suboptions is equivalent to -qinfo=all.
Specifying -qnoinfo is equivalent to -qinfo=noall.
None.
xlc myprogram.c -qinfo=all -qinfo=nocnv:norea
#define COND 0
void faa() // Obsolete prototype (-qinfo=obs)
{
printf("In faa\n"); // Unprototyped function call (-qinfo=pro)
}
int foo(int i, int k)
{
int j; // Uninitialized variable (-qinfo=uni)
switch(i) {
case 0:
i++;
if (COND) // Condition is always false (-qinfo=cnd)
i--; // Unreachable statement (-qinfo=rea)
break;
case 1:
break;
i++; // Unreachable statement (-qinfo=rea)
default:
k = (i) ? (j) ? j : i : 0;
}
goto L; // Use of goto statement (-qinfo=got)
return 3; // Unreachable statement (-qinfo=rea)
L:
faa(); // faa() does not have a prototype (-qinfo=pro)
// End of the function may be reached without returning a value
// because of there may be a jump to label L (-qinfo=ret)
} //Parameter k is never referenced (-qinfo=ref)
int main(void) {
({ int i = 0; i = i + 1; i; }); // Statement does not have side effects (-qinfo=eff)
return foo(1,2);
}
In the following example, the #pragma info(eff, nouni) directive preceding MyFunction1 instructs the compiler to generate messages identifying statements or pragmas with no effect, and to suppress messages identifying uninitialized variables. The #pragma info(restore) directive preceding MyFunction2 instructs the compiler to restore the message options that were in effect before the #pragma info(eff, nouni) directive was specified.
#pragma info(eff, nouni)
int MyFunction1()
{
.
.
.
}
#pragma info(restore)
int MyFunction2()
{
.
.
.
}
t1.c:
int main() {
short s = 42;
int *pi = (int*) &s;
*pi = 63;
return 0;
}
xlC -qinfo=als t1.c
"t1.c", line 4.3: 1540-0590 (I) Dereference may not conform to the current
aliasing rules.
"t1.c", line 4.3: 1540-0591 (I) The dereferenced expression has type "int".
"pi" may point to "s" which has incompatible
type "short".
"t1.c", line 4.3: 1540-0592 (I) Check assignment at line 3 column 11 of t1.c.
t2.c:
int* floatToInt(float *pf) { return (int*)pf; }
int main() {
int i;
float f;
int* pi = floatToInt((float*)*&i));
floatToInt(&f;)
return *pi;
}
xlC -qinfo=als t2.c
"t2.c", line 8.10: 1540-0590 (I) Dereference may not conform to the current
aliasing rules.
"t2.c", line 8.10: 1540-0591 (I) The dereferenced expression has type "int".
"pi" may point to "f" which has incompatible
type "float".
"t2.c", line 8.10: 1540-0592 (I) Check assignment at line 7 column 14 of t2.c.
"t2.c", line 8.10: 1540-0592 (I) Check assignment at line 1 column 37 of t2.c.
"t2.c", line 8.10: 1540-0592 (I) Check assignment at line 6 column 11 of t2.c.
t3.c:
int main() {
float f;
int i = 42;
int *p = (int*) &f;
p = &i;
return *p;
}
xlC -qinfo=als t3.c
"t3.c", line 6.10: 1540-0590 (I) Dereference may not conform to the current
aliasing rules.
"t3.c", line 6.10: 1540-0591 (I) The dereferenced expression has type "int".
"p" may point to "f", which has incompatible type "float".
"t3.c", line 6.10: 1540-0592 (I) Check assignment at line 4 column 10 of t3.c.
xlc_r -O3 -qinfo=mt sync.c
Suppose
that sync.c contains the following code:#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
volatile int done; /* shared flag */
volatile int result; /* shared result */
void *setter(void *id)
{
sleep(5);
result = 7;
/* Need __lwsync(); */
done = 1; /* line 13 */
}
void *waiter(void *id)
{
while (!done) /* line 18 */
{
sleep(1);
}
/* need __lwsync(); */
printf("%d\n", result);
}
int main()
{
pthread_t threads[2];
pthread_attr_t attr;
int result;
result = pthread_create(&threads[0], NULL, waiter, NULL);
if (result != 0) exit(2);
result = pthread_create(&threads[1], NULL, setter, NULL);
if (result != 0) exit(3);
pthread_join(threads[0], NULL);
pthread_join(threads[1], NULL);
return 0;
}
The compiler issues the following informational messages:1586-669 (I) "sync.c", line 18: If this loop is used as a synchronization
point, additional synchronization via a directive or built-in function might
be needed.
1586-670 (I) "sync.c", line 13: If this statement is used as a synchronization
point, additional synchronization via a directive or built-in function might
be needed.
xlc -qinfo=ini ini.c -c
Suppose that ini.c contains
the following code:int a[3] = {1};
The compiler
issues the following informational message:"ini.c", line 1.10: 1506-446 (I) Array element(s) [1] ...
[2] will be initialized with a default value of 0.
xlc -qinfo=unset -O factorial.c
factorial.c contains
the following code:int factorial(int n) {
int result;
if (n > 1) {
result = n * factorial(n - 1);
}
return result; /* line 8 */
}
int main() {
int x = factorial(1);
return x;
}
The compiler issues the following informational message:1500-099: (I) "factorial.c", line 8: "result" might be used before it is set.