Loading...
You are not logged-in Login/Register





  • Posts   Search Threads
  • afylotFebruary 7, 2012 4:33 AM PST   
    idb cannot find function defined by preprocessor directive

    Hi, I am linking a c-main to a function in a fortran90 module and I am debugging with idb. It cannot step into the fortran90 function if the function name is defined by a preprocessor directive. The function is declared by a preprocessor constant:  I want to link to different functions depending on the flag I pass at compile time.

    The definition of the the function is like that:
    #ifdef FLAG
           #define FUNC function1
    #else
           #define FUNC function2
    #endif

    Is there anybody that confirm this? Is there a way to enable the debugger to step in this case?

    I compiled with intel 11.1

    Thanx

    Georg Zitzlsberger (Intel)February 7, 2012 5:22 AM PST
    Rate
     
    idb cannot find function defined by preprocessor directive

    Hello,

    without a reproducer and information about your command line arguments for the compilers/linkers it's hard to tell what's wrong. Also more information about your system (32/64 bit) and OS would be great.

    I'll provide a short version of a "C-main" calling FORTRAN subroutines selected via macros, as you described (Linux/64bit):

    module.f90:

    subroutine test1(x,y)
    integer x, y
        write (*,*) "test1:"
        write (*,*) x, y
    end subroutine test1
    
    subroutine test2(y,x)
    integer x, y
        write (*,*) "test2:"
        write (*,*) x, y
    end subroutine test2
    main.c:
    #ifdef FLAG
    #define FUNC test1_
    #else
    #define FUNC test2_
    #endif
    
    int main(int argc, char **argv) {
        int x = argc;
        int y = argc / 2;
    
        FUNC(&x,&y);
    }


    $ ifort -g -O0 -c module.f90
    $ icc -g -O0 -c main.c -DFLAG
    $ icc module.o main.o -lifcore -o test

    $ ./test
     test1:
               1           0


    Stepping into the call of FUNC works well with IDB (tested with 11.1 & 12.1 compilers):
    CFortranMix.png

    Maybe you can comment what's different to your setup to find the problem.

    Btw.: Remember that both C & FORTRAN compilation units need debug information for this to work (-g). Ideally all optimizations are turned off, too (-O0).

    Best regards,

    Georg Zitzlsberger




    afylotFebruary 14, 2012 6:53 AM PST
    Rate
     
    idb cannot find function defined by preprocessor directive

    You are right.

    But I still have the problem I cannot step in one of my functions.

    I have a main.c (c) ---> func1 into lib1.a (fortran) ---> func2 into lib2.a (fortran)

    the function I cannot step into belongs to lib2.a, so I am stuck with the debugger into a function in lib1.a
    Both func1 and func2 belong to two different modules.

    I compiled the f90 code with

    F90FLAGS=-g -O0 -check bounds -warn all -traceback -align all -align rec8byte

    and the c code with

    CFLAGS=-ggdb -debug full -O0  -Wall -traceback

    I am working in linux.

    Please, do you have any hint?

    Georg Zitzlsberger (Intel)February 14, 2012 10:12 AM PST
    Rate
     
    idb cannot find function defined by preprocessor directive

    Hello,

    without a reproducer it's hard to tell what's wrong. Can you create a simple example that I can use for verification? I tried already myself with two FORTRAN modules in separate static libraries but it works (unfortunately).

    Also, what does "cannot step" mean; how does it look like?
    Assuming you're using the IDB GUI (not command line): Is there a blue bullet at the line you do the call? Can you load the source file from lib2.a you want to step into manually (Open Source File dialog)? Does it show blue bullets on the left then? Can you set a breakpoint manually at the callee (@lib2.a) and stop there?

    Best regards,

    Georg Zitzlsberger

    afylotFebruary 15, 2012 2:10 AM PST
    Rate
     
    idb cannot find function defined by preprocessor directive

    Hello,

    without a reproducer it's hard to tell what's wrong. Can you create a simple example that I can use for verification? I tried already myself with two FORTRAN modules in separate static libraries but it works (unfortunately).

    Also, what does "cannot step" mean; how does it look like?
    Assuming you're using the IDB GUI (not command line): Is there a blue bullet at the line you do the call? Can you load the source file from lib2.a you want to step into manually (Open Source File dialog)? Does it show blue bullets on the left then? Can you set a breakpoint manually at the callee (@lib2.a) and stop there?

    Best regards,

    Georg Zitzlsberger

     

    If I manage to create a simple example I'll post it.

    "cannot step" means that when I am in func1 at the line where I call func2, when I press 's' it goes to the next line in func1 instead of opening the source file for func2.

    There is not blue bullet at the line I do the call, I cannot load the source file from lib2.a manually. Does it look like I didn't compile with debug option?

    I put debug flag only at compile time for object files, not when I created the static library with ar.

    ---------------------------------------------------------------

     

    Edit: 

    I wrote a simple program (only in fortran 90) that uses only lib2.a, without using lib1.a, and idb doesn't step anyway into lib2.a.

    I compile the library like

    ifort -g -O0 -check bounds -warn all -traceback -align all -align rec8byte -o a.o -c a.f90 -I
    ifort -g -O0 -check bounds -warn all -traceback -align all -align rec8byte -o b.o -c b.f90 -I
    ifort -g -O0 -check bounds -warn all -traceback -align all -align rec8byte -o c.o -c c.f90 -I
    ifort -g -O0 -check bounds -warn all -traceback -align all -align rec8byte -o d.o -c d.f90 -I
    /u/shared/programs/x86_64/ifort/11.1.064/bin/intel64/xiar rcvf lib2.a a.o b.o c.o d.o  
    xiar: executing 'ar'
    a - a.o
    a - b.o
    a - c.o
    a - d.o

    I don't understand what is going wrong, I usually compile libraries like that and the debugger works!

    Any idea?

     



    Georg Zitzlsberger (Intel)February 15, 2012 3:51 AM PST
    Rate
     
    idb cannot find function defined by preprocessor directive

    Hello,

    I was able to reproduce a similar behavior on my side (assuming the call is constructed via preprocessor macros).
    The problem is the sole "-I" option without any further argument. Please remove it, make sure it's also not used this (wrong) way elsewhere and recompile the whole project. It should work then.

    Using "-I" without further arguments should end in a warning or error from the compiler (driver). I'll file a defect ticket to fix it for future versions.

    Best regards,

    Georg Zitzlsberger

    Edit: Opened a defect ticket (DPD200274939) to print an error when "-I" is last option without further argument. I can only reproduce this for our FORTRAN compiler; our C/C++ compilers are printing a correct error message.


Forum jump:  

Intel Software Network Forums Statistics

17,025 users have contributed to 48,319 threads and 172,758 posts to date.

In the past 24 hours, we have 11 new thread(s) 54 new posts(s), and 47 new user(s).

In the past 3 days, the most popular thread for everyone has been Optimalization of sine function\'s taylor expansion The most posts were made to Most likely, the issue is that The post with the most views is Optimalization of sine function\'s taylor expansion

Please welcome our newest member redfruit83


For more complete information about compiler optimizations, see our Optimization Notice.