diff --git a/include/llvm/Attributes.h b/include/llvm/Attributes.h
index 0975d1a..cc14e96 100644
--- a/include/llvm/Attributes.h
+++ b/include/llvm/Attributes.h
@@ -127,7 +127,7 @@
     return pImpl != A.pImpl;
   }
 
-  uint64_t Raw() const;
+  uint64_t getBitMask() const;
 
   /// \brief Which attributes cannot be applied to a type.
   static Attribute typeIncompatible(Type *Ty);
@@ -160,7 +160,7 @@
 public:
   AttrBuilder() : Bits(0) {}
   explicit AttrBuilder(uint64_t B) : Bits(B) {}
-  AttrBuilder(const Attribute &A) : Bits(A.Raw()) {}
+  AttrBuilder(const Attribute &A) : Bits(A.getBitMask()) {}
 
   void clear() { Bits = 0; }
 
@@ -231,7 +231,7 @@
       .removeAttribute(Attribute::NoDuplicate);
   }
 
-  uint64_t Raw() const { return Bits; }
+  uint64_t getBitMask() const { return Bits; }
 
   bool operator==(const AttrBuilder &B) {
     return Bits == B.Bits;
diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp
index 9467679..48c02c8 100644
--- a/lib/Bitcode/Reader/BitcodeReader.cpp
+++ b/lib/Bitcode/Reader/BitcodeReader.cpp
@@ -477,7 +477,7 @@
       for (unsigned i = 0, e = Record.size(); i != e; i += 2) {
         Attribute ReconstitutedAttr =
           Attribute::decodeLLVMAttributesForBitcode(Context, Record[i+1]);
-        Record[i+1] = ReconstitutedAttr.Raw();
+        Record[i+1] = ReconstitutedAttr.getBitMask();
       }
 
       for (unsigned i = 0, e = Record.size(); i != e; i += 2) {
diff --git a/lib/VMCore/AttributeImpl.h b/lib/VMCore/AttributeImpl.h
index 3b8f818..253d6e8 100644
--- a/lib/VMCore/AttributeImpl.h
+++ b/lib/VMCore/AttributeImpl.h
@@ -42,7 +42,7 @@
   uint64_t getAlignment() const;
   uint64_t getStackAlignment() const;
 
-  uint64_t Raw() const;         // FIXME: Remove.
+  uint64_t getBitMask() const;         // FIXME: Remove.
 
   static uint64_t getAttrMask(uint64_t Val);
 
@@ -71,7 +71,7 @@
   }
   static void Profile(FoldingSetNodeID &ID, ArrayRef<AttributeWithIndex> Attrs){
     for (unsigned i = 0, e = Attrs.size(); i != e; ++i) {
-      ID.AddInteger(Attrs[i].Attrs.Raw());
+      ID.AddInteger(Attrs[i].Attrs.getBitMask());
       ID.AddInteger(Attrs[i].Index);
     }
   }
diff --git a/lib/VMCore/Attributes.cpp b/lib/VMCore/Attributes.cpp
index c85e5fe..ad1af45 100644
--- a/lib/VMCore/Attributes.cpp
+++ b/lib/VMCore/Attributes.cpp
@@ -45,7 +45,7 @@
   // Otherwise, build a key to look up the existing attributes.
   LLVMContextImpl *pImpl = Context.pImpl;
   FoldingSetNodeID ID;
-  ID.AddInteger(B.Raw());
+  ID.AddInteger(B.getBitMask());
 
   void *InsertPoint;
   AttributeImpl *PA = pImpl->AttrsSet.FindNodeOrInsertPos(ID, InsertPoint);
@@ -53,7 +53,7 @@
   if (!PA) {
     // If we didn't find any existing attributes of the same shape then create a
     // new one and insert it.
-    PA = new AttributeImpl(Context, B.Raw());
+    PA = new AttributeImpl(Context, B.getBitMask());
     pImpl->AttrsSet.InsertNode(PA, InsertPoint);
   }
 
@@ -88,8 +88,8 @@
   return 1U << ((pImpl->getStackAlignment() >> 26) - 1);
 }
 
-uint64_t Attribute::Raw() const {
-  return pImpl ? pImpl->Raw() : 0;
+uint64_t Attribute::getBitMask() const {
+  return pImpl ? pImpl->getBitMask() : 0;
 }
 
 Attribute Attribute::typeIncompatible(Type *Ty) {
@@ -124,10 +124,10 @@
 
   // Store the alignment in the bitcode as a 16-bit raw value instead of a 5-bit
   // log2 encoded value. Shift the bits above the alignment up by 11 bits.
-  uint64_t EncodedAttrs = Attrs.Raw() & 0xffff;
+  uint64_t EncodedAttrs = Attrs.getBitMask() & 0xffff;
   if (Attrs.hasAttribute(Attribute::Alignment))
     EncodedAttrs |= Attrs.getAlignment() << 16;
-  EncodedAttrs |= (Attrs.Raw() & (0xffffULL << 21)) << 11;
+  EncodedAttrs |= (Attrs.getBitMask() & (0xffffULL << 21)) << 11;
   return EncodedAttrs;
 }
 
@@ -257,12 +257,12 @@
 }
 
 AttrBuilder &AttrBuilder::addAttributes(const Attribute &A) {
-  Bits |= A.Raw();
+  Bits |= A.getBitMask();
   return *this;
 }
 
 AttrBuilder &AttrBuilder::removeAttributes(const Attribute &A){
-  Bits &= ~A.Raw();
+  Bits &= ~A.getBitMask();
   return *this;
 }
 
@@ -274,7 +274,7 @@
   return Bits != 0;
 }
 bool AttrBuilder::hasAttributes(const Attribute &A) const {
-  return Bits & A.Raw();
+  return Bits & A.getBitMask();
 }
 bool AttrBuilder::hasAlignmentAttr() const {
   return Bits & AttributeImpl::getAttrMask(Attribute::Alignment);
@@ -302,7 +302,7 @@
   Data = ConstantInt::get(Type::getInt64Ty(C), data);
 }
 
-uint64_t AttributeImpl::Raw() const {
+uint64_t AttributeImpl::getBitMask() const {
   return cast<ConstantInt>(Data)->getZExtValue();
 }
 
@@ -343,23 +343,24 @@
 }
 
 bool AttributeImpl::hasAttribute(uint64_t A) const {
-  return (Raw() & getAttrMask(A)) != 0;
+  return (getBitMask() & getAttrMask(A)) != 0;
 }
 
 bool AttributeImpl::hasAttributes() const {
-  return Raw() != 0;
+  return getBitMask() != 0;
 }
 
 bool AttributeImpl::hasAttributes(const Attribute &A) const {
-  return Raw() & A.Raw();       // FIXME: Raw() won't work here in the future.
+  // FIXME: getBitMask() won't work here in the future.
+  return getBitMask() & A.getBitMask();
 }
 
 uint64_t AttributeImpl::getAlignment() const {
-  return Raw() & getAttrMask(Attribute::Alignment);
+  return getBitMask() & getAttrMask(Attribute::Alignment);
 }
 
 uint64_t AttributeImpl::getStackAlignment() const {
-  return Raw() & getAttrMask(Attribute::StackAlignment);
+  return getBitMask() & getAttrMask(Attribute::StackAlignment);
 }
 
 void AttributeImpl::Profile(FoldingSetNodeID &ID, Constant *Data) {
diff --git a/lib/VMCore/Core.cpp b/lib/VMCore/Core.cpp
index 71098bf..1fb8528 100644
--- a/lib/VMCore/Core.cpp
+++ b/lib/VMCore/Core.cpp
@@ -1402,7 +1402,7 @@
   Function *Func = unwrap<Function>(Fn);
   const AttributeSet PAL = Func->getAttributes();
   Attribute attr = PAL.getFnAttributes();
-  return (LLVMAttribute)attr.Raw();
+  return (LLVMAttribute)attr.getBitMask();
 }
 
 /*--.. Operations on parameters ............................................--*/
@@ -1479,7 +1479,7 @@
   Argument *A = unwrap<Argument>(Arg);
   Attribute attr = A->getParent()->getAttributes().getParamAttributes(
     A->getArgNo()+1);
-  return (LLVMAttribute)attr.Raw();
+  return (LLVMAttribute)attr.getBitMask();
 }
   
 
