Using Clang -O4 with CMake

classic Classic list List threaded Threaded
14 messages Options
Reply | Threaded
Open this post in threaded view
|

Using Clang -O4 with CMake

Clark Gaebel
When trying out -O4 instead of my usual -O3 on my C++ code using CMake,
I got this error...

Linking CXX executable test_memory
cd /home/clark/dev/cpp/GoGo/build/util/test && /usr/bin/cmake -E
cmake_link_script CMakeFiles/test_memory.dir/link.txt --verbose=1
/usr/local/bin/clang++    
CMakeFiles/test_memory.dir/test_memory.cpp.o  -o test_memory -rdynamic
-lboost_filesystem-mt-1_42 -lboost_iostreams-mt-1_42
-lboost_program_options-mt-1_42 -lboost_regex-mt-1_42
-lboost_serialization-mt-1_42 -lboost_signals-mt-1_42
-lboost_thread-mt-1_42 -lboost_wave-mt-1_42
CMakeFiles/test_memory.dir/test_memory.cpp.o: file not recognized: File
format not recognized
collect2: ld returned 1 exit status

What am I doing wrong? This works fine on every other optimization
setting. Literally, the only thing I did differently was -O4 instead of -O3.

--
Regards,
-Clark

_______________________________________________
cfe-dev mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
Reply | Threaded
Open this post in threaded view
|

Re: Using Clang -O4 with CMake

Eric Christopher-2

On Jun 18, 2010, at 8:01 PM, Clark Gaebel wrote:

> When trying out -O4 instead of my usual -O3 on my C++ code using CMake,
> I got this error...
>
> Linking CXX executable test_memory
> cd /home/clark/dev/cpp/GoGo/build/util/test && /usr/bin/cmake -E
> cmake_link_script CMakeFiles/test_memory.dir/link.txt --verbose=1
> /usr/local/bin/clang++    
> CMakeFiles/test_memory.dir/test_memory.cpp.o  -o test_memory -rdynamic
> -lboost_filesystem-mt-1_42 -lboost_iostreams-mt-1_42
> -lboost_program_options-mt-1_42 -lboost_regex-mt-1_42
> -lboost_serialization-mt-1_42 -lboost_signals-mt-1_42
> -lboost_thread-mt-1_42 -lboost_wave-mt-1_42
> CMakeFiles/test_memory.dir/test_memory.cpp.o: file not recognized: File
> format not recognized
> collect2: ld returned 1 exit status
>
> What am I doing wrong? This works fine on every other optimization
> setting. Literally, the only thing I did differently was -O4 instead of -O3.

O4 means use lto.  What platform are you on? Does it support llvm lto? :)

And I have no idea if the cmake files are set up for that either.

-eric
_______________________________________________
cfe-dev mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
Reply | Threaded
Open this post in threaded view
|

Re: Using Clang -O4 with CMake

Clark Gaebel
I'm running...

clark@clark-laptop ~/dev/cpp/GoGo/build $ clang++ --version
clang version 1.5 (trunk 101682)
Target: x86_64-unknown-linux-gnu
Thread model: posix

On 06/18/10 23:07, Eric Christopher wrote:

> On Jun 18, 2010, at 8:01 PM, Clark Gaebel wrote:
>
>  
>> When trying out -O4 instead of my usual -O3 on my C++ code using CMake,
>> I got this error...
>>
>> Linking CXX executable test_memory
>> cd /home/clark/dev/cpp/GoGo/build/util/test && /usr/bin/cmake -E
>> cmake_link_script CMakeFiles/test_memory.dir/link.txt --verbose=1
>> /usr/local/bin/clang++    
>> CMakeFiles/test_memory.dir/test_memory.cpp.o  -o test_memory -rdynamic
>> -lboost_filesystem-mt-1_42 -lboost_iostreams-mt-1_42
>> -lboost_program_options-mt-1_42 -lboost_regex-mt-1_42
>> -lboost_serialization-mt-1_42 -lboost_signals-mt-1_42
>> -lboost_thread-mt-1_42 -lboost_wave-mt-1_42
>> CMakeFiles/test_memory.dir/test_memory.cpp.o: file not recognized: File
>> format not recognized
>> collect2: ld returned 1 exit status
>>
>> What am I doing wrong? This works fine on every other optimization
>> setting. Literally, the only thing I did differently was -O4 instead of -O3.
>>    
> O4 means use lto.  What platform are you on? Does it support llvm lto? :)
>
> And I have no idea if the cmake files are set up for that either.
>
> -eric

--
Regards,
-Clark

_______________________________________________
cfe-dev mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
Reply | Threaded
Open this post in threaded view
|

Re: Using Clang -O4 with CMake

Chris Lattner

On Jun 18, 2010, at 8:47 PM, Clark Gaebel wrote:

> I'm running...
>
> clark@clark-laptop ~/dev/cpp/GoGo/build $ clang++ --version
> clang version 1.5 (trunk 101682)
> Target: x86_64-unknown-linux-gnu
> Thread model: posix

For LTO to work on linux, you need to use the gold linker and set up the gold lto plugin.  Please see:
http://llvm.org/docs/GoldPlugin.html

-Chris

>
> On 06/18/10 23:07, Eric Christopher wrote:
>> On Jun 18, 2010, at 8:01 PM, Clark Gaebel wrote:
>>
>>
>>> When trying out -O4 instead of my usual -O3 on my C++ code using CMake,
>>> I got this error...
>>>
>>> Linking CXX executable test_memory
>>> cd /home/clark/dev/cpp/GoGo/build/util/test && /usr/bin/cmake -E
>>> cmake_link_script CMakeFiles/test_memory.dir/link.txt --verbose=1
>>> /usr/local/bin/clang++    
>>> CMakeFiles/test_memory.dir/test_memory.cpp.o  -o test_memory -rdynamic
>>> -lboost_filesystem-mt-1_42 -lboost_iostreams-mt-1_42
>>> -lboost_program_options-mt-1_42 -lboost_regex-mt-1_42
>>> -lboost_serialization-mt-1_42 -lboost_signals-mt-1_42
>>> -lboost_thread-mt-1_42 -lboost_wave-mt-1_42
>>> CMakeFiles/test_memory.dir/test_memory.cpp.o: file not recognized: File
>>> format not recognized
>>> collect2: ld returned 1 exit status
>>>
>>> What am I doing wrong? This works fine on every other optimization
>>> setting. Literally, the only thing I did differently was -O4 instead of -O3.
>>>
>> O4 means use lto.  What platform are you on? Does it support llvm lto? :)
>>
>> And I have no idea if the cmake files are set up for that either.
>>
>> -eric
>
> --
> Regards,
> -Clark
>
> _______________________________________________
> cfe-dev mailing list
> [hidden email]
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev


_______________________________________________
cfe-dev mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
Reply | Threaded
Open this post in threaded view
|

Re: Using Clang -O4 with CMake

Toralf Niebuhr

Am 19.06.2010 um 06:15 schrieb Chris Lattner:

>
> On Jun 18, 2010, at 8:47 PM, Clark Gaebel wrote:
>
>> I'm running...
>>
>> clark@clark-laptop ~/dev/cpp/GoGo/build $ clang++ --version
>> clang version 1.5 (trunk 101682)
>> Target: x86_64-unknown-linux-gnu
>> Thread model: posix
>
> For LTO to work on linux, you need to use the gold linker and set up the gold lto plugin.  Please see:
> http://llvm.org/docs/GoldPlugin.html
I had the same problem too. Is there such a plugin for Mac OS X too?

>
> -Chris
>
>>
>> On 06/18/10 23:07, Eric Christopher wrote:
>>> On Jun 18, 2010, at 8:01 PM, Clark Gaebel wrote:
>>>
>>>
>>>> When trying out -O4 instead of my usual -O3 on my C++ code using CMake,
>>>> I got this error...
>>>>
>>>> Linking CXX executable test_memory
>>>> cd /home/clark/dev/cpp/GoGo/build/util/test && /usr/bin/cmake -E
>>>> cmake_link_script CMakeFiles/test_memory.dir/link.txt --verbose=1
>>>> /usr/local/bin/clang++    
>>>> CMakeFiles/test_memory.dir/test_memory.cpp.o  -o test_memory -rdynamic
>>>> -lboost_filesystem-mt-1_42 -lboost_iostreams-mt-1_42
>>>> -lboost_program_options-mt-1_42 -lboost_regex-mt-1_42
>>>> -lboost_serialization-mt-1_42 -lboost_signals-mt-1_42
>>>> -lboost_thread-mt-1_42 -lboost_wave-mt-1_42
>>>> CMakeFiles/test_memory.dir/test_memory.cpp.o: file not recognized: File
>>>> format not recognized
>>>> collect2: ld returned 1 exit status
>>>>
>>>> What am I doing wrong? This works fine on every other optimization
>>>> setting. Literally, the only thing I did differently was -O4 instead of -O3.
>>>>
>>> O4 means use lto.  What platform are you on? Does it support llvm lto? :)
>>>
>>> And I have no idea if the cmake files are set up for that either.
>>>
>>> -eric
>>
>> --
>> Regards,
>> -Clark
>>
>> _______________________________________________
>> cfe-dev mailing list
>> [hidden email]
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
>
> _______________________________________________
> cfe-dev mailing list
> [hidden email]
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev


_______________________________________________
cfe-dev mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
Reply | Threaded
Open this post in threaded view
|

Re: Using Clang -O4 with CMake

Paul Davey
On Sat, Jun 19, 2010 at 10:39 PM, Toralf Niebuhr <[hidden email]> wrote:

>
> Am 19.06.2010 um 06:15 schrieb Chris Lattner:
>
>>
>> On Jun 18, 2010, at 8:47 PM, Clark Gaebel wrote:
>>
>>> I'm running...
>>>
>>> clark@clark-laptop ~/dev/cpp/GoGo/build $ clang++ --version
>>> clang version 1.5 (trunk 101682)
>>> Target: x86_64-unknown-linux-gnu
>>> Thread model: posix
>>
>> For LTO to work on linux, you need to use the gold linker and set up the gold lto plugin.  Please see:
>> http://llvm.org/docs/GoldPlugin.html
> I had the same problem too. Is there such a plugin for Mac OS X too?

The darwin linker understands llvm bitcode files and can link them AFAIK...
=

_______________________________________________
cfe-dev mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
Reply | Threaded
Open this post in threaded view
|

Re: Using Clang -O4 with CMake

Chris Lattner
In reply to this post by Chris Lattner

On Jun 19, 2010, at 1:46 AM, Toralf Niebuhr wrote:

>
> Am 19.06.2010 um 06:15 schrieb Chris Lattner:
>
>>
>> On Jun 18, 2010, at 8:47 PM, Clark Gaebel wrote:
>>
>>> I'm running...
>>>
>>> clark@clark-laptop ~/dev/cpp/GoGo/build $ clang++ --version
>>> clang version 1.5 (trunk 101682)
>>> Target: x86_64-unknown-linux-gnu
>>> Thread model: posix
>>
>> For LTO to work on linux, you need to use the gold linker and set up the gold lto plugin.  Please see:
>> http://llvm.org/docs/GoldPlugin.html
> Is there such a plugin for Mac OS X too?

Yep, it ships standard on the platform as part of xcode 3.1 and later (I think):
http://llvm.org/docs/LinkTimeOptimization.html

-Chris
_______________________________________________
cfe-dev mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
Reply | Threaded
Open this post in threaded view
|

Re: Using Clang -O4 with CMake

Clark Gaebel
Is there any way to do this without using gold? I'd rather not enable an
experimental linker.

On 06/19/10 13:31, Chris Lattner wrote:

> On Jun 19, 2010, at 1:46 AM, Toralf Niebuhr wrote:
>
>  
>> Am 19.06.2010 um 06:15 schrieb Chris Lattner:
>>
>>    
>>> On Jun 18, 2010, at 8:47 PM, Clark Gaebel wrote:
>>>
>>>      
>>>> I'm running...
>>>>
>>>> clark@clark-laptop ~/dev/cpp/GoGo/build $ clang++ --version
>>>> clang version 1.5 (trunk 101682)
>>>> Target: x86_64-unknown-linux-gnu
>>>> Thread model: posix
>>>>        
>>> For LTO to work on linux, you need to use the gold linker and set up the gold lto plugin.  Please see:
>>> http://llvm.org/docs/GoldPlugin.html
>>>      
>> Is there such a plugin for Mac OS X too?
>>    
> Yep, it ships standard on the platform as part of xcode 3.1 and later (I think):
> http://llvm.org/docs/LinkTimeOptimization.html
>
> -Chris
> _______________________________________________
> cfe-dev mailing list
> [hidden email]
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>  

--
Regards,
-Clark

_______________________________________________
cfe-dev mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
Reply | Threaded
Open this post in threaded view
|

Re: Using Clang -O4 with CMake

David Chisnall
On 19 Jun 2010, at 19:23, Clark Gaebel wrote:

> Is there any way to do this without using gold? I'd rather not enable an
> experimental linker.

You can add -emit-llvm to your CFLAGS, then use llvm-link to link the resulting bitcode files together, use opt to produce an optimised version, and then llc to generate the native code, which you then pass to the linker.  It's a bit more effort (and involves spawning a lot of processes, so will be slower), but should have the same end result.

David

-- Sent from my IBM 1620
_______________________________________________
cfe-dev mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
Reply | Threaded
Open this post in threaded view
|

Re: Using Clang -O4 with CMake

Clark Gaebel
Is there any way to do this with CMake?

Also (kinda related), how do I detect whether I'm using clang or gcc
from a CMakeFile?

On 06/19/10 14:35, David Chisnall wrote:

> On 19 Jun 2010, at 19:23, Clark Gaebel wrote:
>
>  
>> Is there any way to do this without using gold? I'd rather not enable an
>> experimental linker.
>>    
> You can add -emit-llvm to your CFLAGS, then use llvm-link to link the resulting bitcode files together, use opt to produce an optimised version, and then llc to generate the native code, which you then pass to the linker.  It's a bit more effort (and involves spawning a lot of processes, so will be slower), but should have the same end result.
>
> David
>
> -- Sent from my IBM 1620

--
Regards,
-Clark

_______________________________________________
cfe-dev mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
Reply | Threaded
Open this post in threaded view
|

Re: Using Clang -O4 with CMake

Rafael Espindola
In reply to this post by David Chisnall
> You can add -emit-llvm to your CFLAGS, then use llvm-link to link the resulting bitcode files together, use opt to produce an optimised version, and then llc to generate the native code, which you then pass to the linker.  It's a bit more effort (and involves spawning a lot of processes, so will be slower), but should have the same end result.


One thing that is different is that gold (or the Apple linker) knows
what symbols are used and can optimize:

http://llvm.org/releases/2.6/docs/LinkTimeOptimization.html

> David
>
> -- Sent from my IBM 1620
> _______________________________________________
> cfe-dev mailing list
> [hidden email]
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>


Cheers,
--
Rafael Ávila de Espíndola

_______________________________________________
cfe-dev mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
Reply | Threaded
Open this post in threaded view
|

Re: Using Clang -O4 with CMake

Toralf Niebuhr
In reply to this post by Paul Davey

Am 19.06.2010 um 15:20 schrieb Paul Davey:

> On Sat, Jun 19, 2010 at 10:39 PM, Toralf Niebuhr <[hidden email]> wrote:
>>
>> Am 19.06.2010 um 06:15 schrieb Chris Lattner:
>>
>>>
>>> On Jun 18, 2010, at 8:47 PM, Clark Gaebel wrote:
>>>
>>>> I'm running...
>>>>
>>>> clark@clark-laptop ~/dev/cpp/GoGo/build $ clang++ --version
>>>> clang version 1.5 (trunk 101682)
>>>> Target: x86_64-unknown-linux-gnu
>>>> Thread model: posix
>>>
>>> For LTO to work on linux, you need to use the gold linker and set up the gold lto plugin.  Please see:
>>> http://llvm.org/docs/GoldPlugin.html
>> I had the same problem too. Is there such a plugin for Mac OS X too?
>
> The darwin linker understands llvm bitcode files and can link them AFAIK...
> =
This is my problem with -O4
Compiling with -O3 compiles fine.

compiling this with
clang++ -O4 -o test test.cpp

int main() {
    return 0;
  }
compiles fine on Mac OS X

As sonn as I include system headers, the compilation breaks.
clang++ -O4 -o test test.cpp

#include <iostream>
 
 int main() {
   return 0;
 }

Operand is null
        %0 = tail call i32 @__cxa_atexit(void (i8*)* bitcast (void (%"class.std::ios_base::Init"*)* @_ZNSt8ios_base4InitD1Ev to void (i8*)*), <null operand!>, i8* bitcast (i8** @__dso_handle to i8*)) ; <i32> [#uses=0]
Broken module found, compilation aborted!
Stack dump:
0. Running pass 'Function Pass Manager' on module 'ld-temp.o'.
1. Running pass 'Module Verifier' on function '@_GLOBAL__I_a'

Is this a different problem?


For details:

Target: x86_64-apple-darwin10
Thread model: posix
 "/Users/gmthor85/llvm/llvm/Release/bin/clang" -cc1 -triple x86_64-apple-darwin10.0.0 -emit-llvm-bc -disable-free -main-file-name test.cpp -pic-level 1 -mdisable-fp-elim -masm-verbose -munwind-tables -target-cpu core2 -v -resource-dir /Users/gmthor85/llvm/llvm/Release/lib/clang/2.0 -O3 -ferror-limit 19 -fmessage-length 80 -stack-protector 1 -fblocks -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o /var/folders/3C/3Cjb8XqLGZ4CudBSDgvEJE+++TI/-Tmp-/cc-8KSeTq.o -x c++ test.cpp
clang -cc1 version 2.0 based upon llvm 2.8svn hosted on x86_64-apple-darwin10
#include "..." search starts here:
#include <...> search starts here:
 /usr/include/c++/4.2.1
 /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64
 /usr/include/c++/4.2.1/backward
 /usr/include/c++/4.0.0
 /usr/include/c++/4.0.0/i686-apple-darwin8
 /usr/include/c++/4.0.0/backward
 /usr/local/include
 /Users/gmthor85/llvm/llvm/Release/lib/clang/2.0/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.
 "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/ld" -dynamic -arch x86_64 -macosx_version_min 10.6.0 -o test -lcrt1.10.6.o -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64 -L/usr/lib/i686-apple-darwin10/4.2.1 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1 -L/Users/gmthor85/llvm/llvm/Release/bin/../lib -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../../i686-apple-darwin10/4.2.1 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../.. /var/folders/3C/3Cjb8XqLGZ4CudBSDgvEJE+++TI/-Tmp-/cc-8KSeTq.o -lstdc++ -lSystem -lgcc
Operand is null
        %0 = tail call i32 @__cxa_atexit(void (i8*)* bitcast (void (%"class.std::ios_base::Init"*)* @_ZNSt8ios_base4InitD1Ev to void (i8*)*), <null operand!>, i8* bitcast (i8** @__dso_handle to i8*)) ; <i32> [#uses=0]
Broken module found, compilation aborted!
Stack dump:
0. Running pass 'Function Pass Manager' on module 'ld-temp.o'.
1. Running pass 'Module Verifier' on function '@_GLOBAL__I_a'
>
> _______________________________________________
> cfe-dev mailing list
> [hidden email]
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev


_______________________________________________
cfe-dev mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
Reply | Threaded
Open this post in threaded view
|

Re: Using Clang -O4 with CMake

David Chisnall
In reply to this post by Rafael Espindola
On 20 Jun 2010, at 05:39, Rafael Espindola wrote:

> One thing that is different is that gold (or the Apple linker) knows
> what symbols are used and can optimize:
>
> http://llvm.org/releases/2.6/docs/LinkTimeOptimization.html

Reading that document,  that's not quite correct.  In the example given, foo2() should not be removed by the optimiser in the general case, because it is externally visible.  There is a special case here - you are compiling an executable, not a library.  Running the internalize pass when you run opt on the linked bitcode will have the same effect, allowing the optimizer to remove everything that is not reachable from main().

Of course, this is not the correct thing to do in the general case.  For example, if you provide some helper functions in your main executable that are only used by loadable modules, then LTO will 'helpfully' remove them for you if it takes the list of public symbols from the ones that the linker knows are used.  

If you use the internalize pass instead, then you can provide a list of functions that should not be removed, removing this problem.  

One of the things on my to-do list is allowing clang to drive the internalize pass based on the contents of a header, using clang's ability to parse C++ decls and mangle the names, so only symbols declared in a given header are exported from the resulting library.

David

-- Sent from my Apple II


_______________________________________________
cfe-dev mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
Reply | Threaded
Open this post in threaded view
|

Re: Using Clang -O4 with CMake

Rafael Espindola
> Reading that document,  that's not quite correct.  In the example given, foo2() should not be removed by the optimiser in the general case, because it is externally visible.  There is a special case here - you are compiling an executable, not a library.  Running the internalize pass when you run opt on the linked bitcode will have the same effect, allowing the optimizer to remove everything that is not reachable from main().

It is correct when building an executable. The nice thing about this
is that the linker knows you are building an executable :-) With gold
at least, when building a shared library only hidden functions are
removed.

Internalizing everything but main is a very particular case of this.
That is exactly what the linker will do, *if* main is the only symbol
being accessed from outside the bitcode.

> Of course, this is not the correct thing to do in the general case.  For example, if you provide some helper functions in your main executable that are only used by loadable modules, then LTO will 'helpfully' remove them for you if it takes the list of public symbols from the ones that the linker knows are used.

For that to work (even without LTO) in linux you have to pass
--export_dynamic to the linker. Again, gold notices the option and
does the right think: does not remove functions a shared library might
use.

> If you use the internalize pass instead, then you can provide a list of functions that should not be removed, removing this problem.

And you have to maintain it :-)
With the linker plugin solution the linker computes that list for you.

> One of the things on my to-do list is allowing clang to drive the internalize pass based on the contents of a header, using clang's ability to parse C++ decls and mangle the names, so only symbols declared in a given header are exported from the resulting library.

Might be useful for archs without a liker plugin (if you must use gnu
ld for example), but looks redundant otherwise. With the linker plugin
(gold, not sure what the details are for MACHO), you just do the same
you would do without LTO:

*) Set -fdefault-visibilit=hidden
*) Mark the API functions/classes with default visibility

If you like an external symbol list better, you can use a version
script. I have tested that the first case works. Should probably test
the linker script too, but I try to avoid using those.

> David
>
> -- Sent from my Apple II
>
>


Cheers,
--
Rafael Ávila de Espíndola

_______________________________________________
cfe-dev mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev