diff --git a/Driver/Makefile b/Driver/Makefile
index 66031d6..c540c49 100644
--- a/Driver/Makefile
+++ b/Driver/Makefile
@@ -5,6 +5,7 @@
 TOOLNAME = clang
 USEDLIBS = clangCodeGen.a clangAnalysis.a clangRewrite.a clangSEMA.a \
            clangAST.a clangParse.a clangLex.a clangBasic.a \
+           LLVMAnalysis.a \
            LLVMCore.a LLVMSupport.a LLVMSystem.a \
            LLVMBitWriter.a LLVMBitReader.a LLVMCodeGen.a LLVMTarget.a 
 	
diff --git a/lib/CodeGen/CGObjCGNU.cpp b/lib/CodeGen/CGObjCGNU.cpp
index 53eaf57..73a692d 100644
--- a/lib/CodeGen/CGObjCGNU.cpp
+++ b/lib/CodeGen/CGObjCGNU.cpp
@@ -22,6 +22,15 @@
 #include "llvm/ADT/StringMap.h"
 #include <map>
 
+// FIXME: Remove THIS!
+#include "llvm/Analysis/ValueTracking.h"
+std::string getStringValue(llvm::Constant *C) {
+  std::string R;
+  bool V = GetConstantStringInfo(C, R);
+  assert(V && "Couldn't convert string");
+  return R;
+}
+
 using llvm::dyn_cast;
 
 // The version of the runtime that this class targets.  Must match the version
@@ -221,23 +230,23 @@
     // Untyped selector
     if (SelTypes == 0) {
       // If it's already cached, return it.
-      if (UntypedSelectors[CName->getStringValue()]) {
+      if (UntypedSelectors[getStringValue(CName)]) {
         // FIXME: Volatility
-        return Builder.CreateLoad(UntypedSelectors[CName->getStringValue()]);
+        return Builder.CreateLoad(UntypedSelectors[getStringValue(CName)]);
       }
       // If it isn't, cache it.
       llvm::GlobalAlias *Sel = new llvm::GlobalAlias(
           llvm::PointerType::getUnqual(SelectorTy),
           llvm::GlobalValue::InternalLinkage, ".objc_untyped_selector_alias",
           NULL, &TheModule);
-      UntypedSelectors[CName->getStringValue()] = Sel;
+      UntypedSelectors[getStringValue(CName)] = Sel;
       // FIXME: Volatility
       return Builder.CreateLoad(Sel);
     }
     // Typed selectors
     if (llvm::Constant *CTypes = dyn_cast<llvm::Constant>(SelTypes)) {
-      TypedSelector Selector = TypedSelector(CName->getStringValue(),
-          CTypes->getStringValue());
+      TypedSelector Selector = TypedSelector(getStringValue(CName),
+                                             getStringValue(CTypes));
       // If it's already cached, return it.
       if (TypedSelectors[Selector]) {
         // FIXME: Volatility
@@ -439,7 +448,8 @@
           llvm::ConstantExpr::getGetElementPtr(MethodTypes[i], Zeros, 2));
     llvm::Constant *Method =
       TheModule.getFunction(SymbolNameForMethod(ClassName, CategoryName,
-            MethodNames[i]->getStringValue(), isClassMethodList));
+                                                getStringValue(MethodNames[i]),
+                                                isClassMethodList));
     Method = llvm::ConstantExpr::getBitCast(Method,
         llvm::PointerType::getUnqual(IMPTy));
     Elements.push_back(Method);
@@ -567,7 +577,7 @@
   Elements.push_back(NullP);
   // Create an instance of the structure
   return MakeGlobal(ClassTy, Elements,
-      SymbolNameForClass(Name->getStringValue()));
+                    SymbolNameForClass(getStringValue(Name)));
 }
 
 llvm::Constant *CGObjCGNU::GenerateProtocolMethodList(
