diff -ru llvm_orig/tools/clang/lib/CodeGen/CGClass.cpp llvm/tools/clang/lib/CodeGen/CGClass.cpp
--- llvm_orig/tools/clang/lib/CodeGen/CGClass.cpp	2012-11-07 14:43:17.277697000 -0800
+++ llvm/tools/clang/lib/CodeGen/CGClass.cpp	2013-03-11 17:39:11.018614000 -0700
@@ -1534,11 +1534,35 @@
                                                   NonVirtualOffset,
                                                   VirtualOffset);
 
+  // VTXor security mitigation...
+
+  llvm::GlobalVariable *VTXorGlobalVariable = CGM.getModule().getNamedGlobal("__vtxor_cookie");
+  if (VTXorGlobalVariable == NULL) {
+
+   unsigned PtrWidth = CGM.getContext().getTargetInfo().getPointerWidth(0);
+
+   VTXorGlobalVariable = new llvm::GlobalVariable(CGM.getModule(),
+               llvm::IntegerType::get(CGM.getLLVMContext(),PtrWidth),
+               false,
+               llvm::GlobalValue::ExternalLinkage,
+               llvm::ConstantInt::get(llvm::IntegerType::get(CGM.getLLVMContext(),PtrWidth),0),
+               "__vtxor_cookie");
+
+  }
+
+  llvm::Value *VTXorCookie = Builder.CreateLoad(VTXorGlobalVariable);
+
+  llvm::Value *VTableAddressPointInt=Builder.CreatePtrToInt(VTableAddressPoint, VTXorCookie->getType());
+  llvm::Value *XoredVTableAddressPointInt = Builder.CreateXor(VTableAddressPointInt, VTXorCookie);
+  llvm::Value *XoredVTableAddressPointPtr=Builder.CreateIntToPtr(XoredVTableAddressPointInt,VTableAddressPoint->getType());
+
   // Finally, store the address point.
   llvm::Type *AddressPointPtrTy =
     VTableAddressPoint->getType()->getPointerTo();
+
   VTableField = Builder.CreateBitCast(VTableField, AddressPointPtrTy);
-  llvm::StoreInst *Store = Builder.CreateStore(VTableAddressPoint, VTableField);
+
+  llvm::StoreInst *Store = Builder.CreateStore(XoredVTableAddressPointPtr, VTableField);
   CGM.DecorateInstruction(Store, CGM.getTBAAInfoForVTablePtr());
 }
 
@@ -1624,7 +1648,29 @@
   llvm::Value *VTablePtrSrc = Builder.CreateBitCast(This, Ty->getPointerTo());
   llvm::Instruction *VTable = Builder.CreateLoad(VTablePtrSrc, "vtable");
   CGM.DecorateInstruction(VTable, CGM.getTBAAInfoForVTablePtr());
-  return VTable;
+
+  // VTXor security mitigation...
+  llvm::GlobalVariable *VTXorGlobalVariable = CGM.getModule().getNamedGlobal("__vtxor_cookie");
+  if (VTXorGlobalVariable == NULL) {
+
+   unsigned PtrWidth = CGM.getContext().getTargetInfo().getPointerWidth(0);
+
+   VTXorGlobalVariable = new llvm::GlobalVariable(CGM.getModule(),
+               llvm::IntegerType::get(CGM.getLLVMContext(),PtrWidth),
+               false,
+               llvm::GlobalValue::ExternalLinkage,
+               llvm::ConstantInt::get(llvm::IntegerType::get(CGM.getLLVMContext(),PtrWidth),0),
+               "__vtxor_cookie");
+
+  }
+
+  llvm::Value *VTXorCookie = Builder.CreateLoad(VTXorGlobalVariable);
+
+  llvm::Value *VTableInt=Builder.CreatePtrToInt(VTable, VTXorCookie->getType());
+  llvm::Value *XoredVTableInt = Builder.CreateXor(VTableInt, VTXorCookie);
+  llvm::Value *XoredVTablePtr=Builder.CreateIntToPtr(XoredVTableInt,VTable->getType());
+
+  return XoredVTablePtr;
 }
 
 static const CXXRecordDecl *getMostDerivedClassDecl(const Expr *Base) {
