diff options
author | Chris Lattner <sabre@nondot.org> | 2001-11-26 18:56:10 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2001-11-26 18:56:10 +0000 |
commit | d23b1d31c0a4d46f3ee78cd5393bea571c29888c (patch) | |
tree | 2ed914aaf3d642bc80863ac8a0b99352db327c7e | |
parent | dda719665ba2ffd2eb1c32a0d2daa3921448db7c (diff) |
Implement internal method support
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1374 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Bytecode/Reader/ConstantReader.cpp | 3 | ||||
-rw-r--r-- | lib/Bytecode/Reader/Reader.cpp | 13 | ||||
-rw-r--r-- | lib/Bytecode/Reader/ReaderInternals.h | 2 | ||||
-rw-r--r-- | lib/Bytecode/Writer/Writer.cpp | 10 |
4 files changed, 18 insertions, 10 deletions
diff --git a/lib/Bytecode/Reader/ConstantReader.cpp b/lib/Bytecode/Reader/ConstantReader.cpp index ec39a9f64c..405745d14a 100644 --- a/lib/Bytecode/Reader/ConstantReader.cpp +++ b/lib/Bytecode/Reader/ConstantReader.cpp @@ -306,7 +306,8 @@ bool BytecodeParser::parseConstPoolValue(const uchar *&Buf, BCR_TRACE(5, "Creating new forward ref variable!\n"); // Create a placeholder for the global variable reference... - GlobalVariable *GVar = new GlobalVariable(PT->getValueType(), false); + GlobalVariable *GVar = + new GlobalVariable(PT->getValueType(), false, true); // Keep track of the fact that we have a forward ref to recycle it GlobalRefs.insert(make_pair(make_pair(PT, Slot), GVar)); diff --git a/lib/Bytecode/Reader/Reader.cpp b/lib/Bytecode/Reader/Reader.cpp index a076bffb3a..7f02b9339f 100644 --- a/lib/Bytecode/Reader/Reader.cpp +++ b/lib/Bytecode/Reader/Reader.cpp @@ -265,9 +265,12 @@ bool BytecodeParser::ParseMethod(const uchar *&Buf, const uchar *EndBuf, const MethodType *MTy = dyn_cast<const MethodType>(PMTy->getValueType()); if (MTy == 0) return failure(true); // Not ptr to method! + unsigned isInternal; + if (read_vbr(Buf, EndBuf, isInternal)) return failure(true); + unsigned MethSlot = MethodSignatureList.front().second; MethodSignatureList.pop_front(); - Method *M = new Method(MTy); + Method *M = new Method(MTy, isInternal != 0); BCR_TRACE(2, "METHOD TYPE: " << MTy << endl); @@ -380,8 +383,9 @@ bool BytecodeParser::ParseModuleGlobalInfo(const uchar *&Buf, const uchar *End, unsigned VarType; if (read_vbr(Buf, End, VarType)) return failure(true); while (VarType != Type::VoidTyID) { // List is terminated by Void - // VarType Fields: bit0 = isConstant, bit1 = hasInitializer, bit2+ = slot# - const Type *Ty = getType(VarType >> 2); + // VarType Fields: bit0 = isConstant, bit1 = hasInitializer, + // bit2 = isInternal, bit3+ = slot# + const Type *Ty = getType(VarType >> 3); if (!Ty || !Ty->isPointerType()) { Error = "Global not pointer type! Ty = " + Ty->getDescription(); return failure(true); @@ -404,7 +408,8 @@ bool BytecodeParser::ParseModuleGlobalInfo(const uchar *&Buf, const uchar *End, } // Create the global variable... - GlobalVariable *GV = new GlobalVariable(ElTy, VarType & 1, Initializer); + GlobalVariable *GV = new GlobalVariable(ElTy, VarType & 1, VarType & 4, + Initializer); int DestSlot = insertValue(GV, ModuleValues); if (DestSlot == -1) return failure(true); diff --git a/lib/Bytecode/Reader/ReaderInternals.h b/lib/Bytecode/Reader/ReaderInternals.h index 50eed19393..fb34169d79 100644 --- a/lib/Bytecode/Reader/ReaderInternals.h +++ b/lib/Bytecode/Reader/ReaderInternals.h @@ -149,7 +149,7 @@ struct BBPlaceHolderHelper : public BasicBlock { struct MethPlaceHolderHelper : public Method { MethPlaceHolderHelper(const Type *Ty) - : Method(cast<const MethodType>(Ty)) { + : Method(cast<const MethodType>(Ty), true) { } }; diff --git a/lib/Bytecode/Writer/Writer.cpp b/lib/Bytecode/Writer/Writer.cpp index d0b2eb40b0..c8ce40ba62 100644 --- a/lib/Bytecode/Writer/Writer.cpp +++ b/lib/Bytecode/Writer/Writer.cpp @@ -121,9 +121,10 @@ void BytecodeWriter::outputModuleInfoBlock(const Module *M) { int Slot = Table.getValSlot(GV->getType()); assert(Slot != -1 && "Module global vars is broken!"); - // Fields: bit0 = isConstant, bit1 = hasInitializer, bit2+ = slot# - unsigned oSlot = ((unsigned)Slot << 2) | (GV->hasInitializer() << 1) | - GV->isConstant(); + // Fields: bit0 = isConstant, bit1 = hasInitializer, bit2=InternalLinkage, + // bit3+ = slot# + unsigned oSlot = ((unsigned)Slot << 3) | (GV->hasInternalLinkage() << 2) | + (GV->hasInitializer() << 1) | GV->isConstant(); output_vbr(oSlot, Out); // If we have an initializer, output it now. @@ -150,9 +151,10 @@ void BytecodeWriter::outputModuleInfoBlock(const Module *M) { void BytecodeWriter::processMethod(const Method *M) { BytecodeBlock MethodBlock(BytecodeFormat::Method, Out); - + output_vbr((unsigned)M->hasInternalLinkage(), Out); // Only output the constant pool and other goodies if needed... if (!M->isExternal()) { + // Get slot information about the method... Table.incorporateMethod(M); |