IR: Use a bitmask to access GlobalObject subclass data

Make room for more than just `Function::isMaterializable()` in the
`GlobalObject` subclass data bitfield.  Since we're treating it like a
bitfield, change `Function::Function()` to zero-out the whole thing.

llvm-svn: 235770
This commit is contained in:
Duncan P. N. Exon Smith 2015-04-24 20:47:23 +00:00
parent cbc28dc549
commit 4472b776b0
2 changed files with 15 additions and 3 deletions

View File

@ -77,6 +77,16 @@ private:
* bit 3-6: CallingConvention
*/
/// Bits from GlobalObject::GlobalObjectSubclassData.
enum {
/// Whether this function is materializable.
IsMaterializableBit = 1 << 0
};
void setGlobalObjectBit(unsigned Mask, bool Value) {
setGlobalObjectSubClassData((~Mask & getGlobalObjectSubClassData()) |
(Value ? Mask : 0u));
}
friend class SymbolTableListTraits<Function, Module>;
void setParent(Module *parent);

View File

@ -206,10 +206,12 @@ void Argument::removeAttr(AttributeSet AS) {
//===----------------------------------------------------------------------===//
bool Function::isMaterializable() const {
return getGlobalObjectSubClassData();
return getGlobalObjectSubClassData() & IsMaterializableBit;
}
void Function::setIsMaterializable(bool V) { setGlobalObjectSubClassData(V); }
void Function::setIsMaterializable(bool V) {
setGlobalObjectBit(IsMaterializableBit, V);
}
LLVMContext &Function::getContext() const {
return getType()->getContext();
@ -244,7 +246,7 @@ Function::Function(FunctionType *Ty, LinkageTypes Linkage, const Twine &name,
Ty(Ty) {
assert(FunctionType::isValidReturnType(getReturnType()) &&
"invalid return type");
setIsMaterializable(false);
setGlobalObjectSubClassData(0);
SymTab = new ValueSymbolTable();
// If the function has arguments, mark them as lazily built.