[cfe-dev] clang generating aliases to aliases and breaking llvm-link

Adam Langley agl at imperialviolet.org
Fri Apr 16 13:31:54 PDT 2010


(LLVM and Clang built from r101478)

Background: I want to run ots[1], which parses and sanitises TrueType
files, under KLEE.

My first step was to build it with clang:

$ for x in $(ls *.cc) ; do clang++ -c -g -emit-llvm -I../include  $x; done

And then try to link it:

$ llvm-link -o out *.o
llvm-link: LinkModules.cpp:767: bool LinkAlias(llvm::Module*, const
llvm::Module*, std::map<const llvm::Value*, llvm::Value*,
std::less<const llvm::Value*>, std::allocator<std::pair<const
llvm::Value* const, llvm::Value*> > >&, std::string*): Assertion `VMI
!= ValueMap.end() && "Aliasee not linked"' failed.
0  llvm-link       0x000000000054a49f
1  llvm-link       0x000000000054c38a
2  libpthread.so.0 0x000000364b00f0f0
3  libc.so.6       0x000000364a8326d5 gsignal + 53
4  libc.so.6       0x000000364a833eb5 abort + 373
5  libc.so.6       0x000000364a82b7c5 __assert_fail + 245
6  llvm-link       0x000000000044546e
7  llvm-link       0x0000000000446e62
8  llvm-link       0x0000000000405d27 main + 327
9  libc.so.6       0x000000364a81eb1d __libc_start_main + 253
10 llvm-link       0x0000000000405009
Stack dump:
0.      Program arguments: llvm-link -o out cff.o cmap.o cvt.o fpgm.o
gasp.o glyf.o hdmx.o head.o head-test.o hhea.o hmtx.o kern.o loca.o
ltsh.o maxp.o name.o os2.o ots.o post.o prep.o vdmx.o vorg.o
Aborted (core dumped)

By adding debugging to LinkModules.cpp, we find that the symbol that
is causing it to explode is
_ZNSt12_Vector_baseIN12_GLOBAL__N_118CMAPSubtableHeaderESaIS1_EE12_Vector_implD1Ev.

>From running llvm-nm on some of the .o files, there are a couple of
files with symbols that are marked as '?'. It's these symbols which
kill llvm-link.

Adding more debugging to llvm-nm (see patch below), it turns out that
these symbols are aliases to aliases of functions, and aliases to
aliases to aliases of functions:

         T _ZNSt6vectorIN12_GLOBAL__N_118CMAPSubtableHeaderESaIS1_EED1Ev
         { _ZNSt12_Vector_baseIN12_GLOBAL__N_118CMAPSubtableHeaderESaIS1_EE12_Vector_implD1Ev
         ( _ZNSt12_Vector_baseIN12_GLOBAL__N_118CMAPSubtableHeaderESaIS1_EE12_Vector_implD2Ev
         T _ZNSaIN12_GLOBAL__N_118CMAPSubtableHeaderEED2Ev

Here my knowledge gives out. I'm not sure if clang is generating bad
output, or if llvm-link should be able to handle it.

Any ideas?


Cheers

AGL


Index: tools/llvm-nm/llvm-nm.cpp
===================================================================
--- tools/llvm-nm/llvm-nm.cpp   (revision 101478)
+++ tools/llvm-nm/llvm-nm.cpp   (working copy)
@@ -82,6 +82,16 @@
     const GlobalValue *AliasedGV = GA->getAliasedGlobal();
     if (isa<Function>(AliasedGV))                          return 'T';
     if (isa<GlobalVariable>(AliasedGV))                    return 'D';
+    if (const GlobalAlias *GA = dyn_cast<GlobalAlias>(AliasedGV)) {
+      const GlobalValue *AliasedGV = GA->getAliasedGlobal();
+      if (isa<Function>(AliasedGV))                        return '(';
+      if (isa<GlobalVariable>(AliasedGV))                  return ')';
+      if (const GlobalAlias *GA = dyn_cast<GlobalAlias>(AliasedGV)) {
+        const GlobalValue *AliasedGV = GA->getAliasedGlobal();
+        if (isa<Function>(AliasedGV))                      return '{';
+        if (isa<GlobalVariable>(AliasedGV))                return '}';
+      }
+    }
   }
                                                            return '?';
 }



[1] http://code.google.com/p/ots/

-- 
Adam Langley agl at imperialviolet.org http://www.imperialviolet.org



More information about the cfe-dev mailing list