1 //===-- Function.cpp - Implement the Global object classes ----------------===//
3 // The LLVM Compiler Infrastructure
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the Function & GlobalVariable classes for the VMCore
13 //===----------------------------------------------------------------------===//
15 #include "llvm/Module.h"
16 #include "llvm/DerivedTypes.h"
17 #include "llvm/IntrinsicInst.h"
18 #include "llvm/Support/LeakDetector.h"
19 #include "SymbolTableListTraitsImpl.h"
20 #include "llvm/ADT/StringExtras.h"
23 BasicBlock
*ilist_traits
<BasicBlock
>::createSentinel() {
24 BasicBlock
*Ret
= new BasicBlock();
25 // This should not be garbage monitored.
26 LeakDetector::removeGarbageObject(Ret
);
30 iplist
<BasicBlock
> &ilist_traits
<BasicBlock
>::getList(Function
*F
) {
31 return F
->getBasicBlockList();
34 Argument
*ilist_traits
<Argument
>::createSentinel() {
35 Argument
*Ret
= new Argument(Type::IntTy
);
36 // This should not be garbage monitored.
37 LeakDetector::removeGarbageObject(Ret
);
41 iplist
<Argument
> &ilist_traits
<Argument
>::getList(Function
*F
) {
42 return F
->getArgumentList();
45 // Explicit instantiations of SymbolTableListTraits since some of the methods
46 // are not in the public header file...
47 template class SymbolTableListTraits
<Argument
, Function
, Function
>;
48 template class SymbolTableListTraits
<BasicBlock
, Function
, Function
>;
50 //===----------------------------------------------------------------------===//
51 // Argument Implementation
52 //===----------------------------------------------------------------------===//
54 Argument::Argument(const Type
*Ty
, const std::string
&Name
, Function
*Par
)
55 : Value(Ty
, Value::ArgumentVal
, Name
) {
58 // Make sure that we get added to a function
59 LeakDetector::addGarbageObject(this);
62 Par
->getArgumentList().push_back(this);
65 void Argument::setParent(Function
*parent
) {
67 LeakDetector::addGarbageObject(this);
70 LeakDetector::removeGarbageObject(this);
73 //===----------------------------------------------------------------------===//
74 // Function Implementation
75 //===----------------------------------------------------------------------===//
77 Function::Function(const FunctionType
*Ty
, LinkageTypes Linkage
,
78 const std::string
&name
, Module
*ParentModule
)
79 : GlobalValue(PointerType::get(Ty
), Value::FunctionVal
, 0, 0, Linkage
, name
) {
80 CallingConvention
= 0;
81 BasicBlocks
.setItemParent(this);
82 BasicBlocks
.setParent(this);
83 ArgumentList
.setItemParent(this);
84 ArgumentList
.setParent(this);
85 SymTab
= new SymbolTable();
87 assert((getReturnType()->isFirstClassType() ||getReturnType() == Type::VoidTy
)
88 && "LLVM functions cannot return aggregate values!");
90 // Create the arguments vector, all arguments start out unnamed.
91 for (unsigned i
= 0, e
= Ty
->getNumParams(); i
!= e
; ++i
) {
92 assert(Ty
->getParamType(i
) != Type::VoidTy
&&
93 "Cannot have void typed arguments!");
94 ArgumentList
.push_back(new Argument(Ty
->getParamType(i
)));
97 // Make sure that we get added to a function
98 LeakDetector::addGarbageObject(this);
101 ParentModule
->getFunctionList().push_back(this);
104 Function::~Function() {
105 dropAllReferences(); // After this it is safe to delete instructions.
107 // Delete all of the method arguments and unlink from symbol table...
108 ArgumentList
.clear();
109 ArgumentList
.setParent(0);
113 void Function::setParent(Module
*parent
) {
115 LeakDetector::addGarbageObject(this);
118 LeakDetector::removeGarbageObject(this);
121 const FunctionType
*Function::getFunctionType() const {
122 return cast
<FunctionType
>(getType()->getElementType());
125 bool Function::isVarArg() const {
126 return getFunctionType()->isVarArg();
129 const Type
*Function::getReturnType() const {
130 return getFunctionType()->getReturnType();
133 void Function::removeFromParent() {
134 getParent()->getFunctionList().remove(this);
137 void Function::eraseFromParent() {
138 getParent()->getFunctionList().erase(this);
142 /// renameLocalSymbols - This method goes through the Function's symbol table
143 /// and renames any symbols that conflict with symbols at global scope. This is
144 /// required before printing out to a textual form, to ensure that there is no
145 /// ambiguity when parsing.
146 void Function::renameLocalSymbols() {
147 SymbolTable
&LST
= getSymbolTable(); // Local Symtab
148 SymbolTable
&GST
= getParent()->getSymbolTable(); // Global Symtab
150 for (SymbolTable::plane_iterator LPI
= LST
.plane_begin(), E
= LST
.plane_end();
152 // All global symbols are of pointer type, ignore any non-pointer planes.
153 if (const PointerType
*CurTy
= dyn_cast
<PointerType
>(LPI
->first
)) {
154 // Only check if the global plane has any symbols of this type.
155 SymbolTable::plane_iterator GPI
= GST
.find(LPI
->first
);
156 if (GPI
!= GST
.plane_end()) {
157 SymbolTable::ValueMap
&LVM
= LPI
->second
;
158 const SymbolTable::ValueMap
&GVM
= GPI
->second
;
160 // Loop over all local symbols, renaming those that are in the global
161 // symbol table already.
162 for (SymbolTable::value_iterator VI
= LVM
.begin(), E
= LVM
.end();
164 Value
*V
= VI
->second
;
165 const std::string
&Name
= VI
->first
;
167 if (GVM
.count(Name
)) {
168 static unsigned UniqueNum
= 0;
169 // Find a name that does not conflict!
170 while (GVM
.count(Name
+ "_" + utostr(++UniqueNum
)) ||
171 LVM
.count(Name
+ "_" + utostr(UniqueNum
)))
172 /* scan for UniqueNum that works */;
173 V
->setName(Name
+ "_" + utostr(UniqueNum
));
181 // dropAllReferences() - This function causes all the subinstructions to "let
182 // go" of all references that they are maintaining. This allows one to
183 // 'delete' a whole class at a time, even though there may be circular
184 // references... first all references are dropped, and all use counts go to
185 // zero. Then everything is deleted for real. Note that no operations are
186 // valid on an object that has "dropped all references", except operator
189 void Function::dropAllReferences() {
190 for (iterator I
= begin(), E
= end(); I
!= E
; ++I
)
191 I
->dropAllReferences();
192 BasicBlocks
.clear(); // Delete all basic blocks...
195 /// getIntrinsicID - This method returns the ID number of the specified
196 /// function, or Intrinsic::not_intrinsic if the function is not an
197 /// intrinsic, or if the pointer is null. This value is always defined to be
198 /// zero to allow easy checking for whether a function is intrinsic or not. The
199 /// particular intrinsic functions which correspond to this value are defined in
200 /// llvm/Intrinsics.h.
202 unsigned Function::getIntrinsicID() const {
203 const std::string
& Name
= this->getName();
204 if (Name
.size() < 5 || Name
[4] != '.' || Name
[0] != 'l' || Name
[1] != 'l'
205 || Name
[2] != 'v' || Name
[3] != 'm')
206 return 0; // All intrinsics start with 'llvm.'
208 assert(Name
.size() != 5 && "'llvm.' is an invalid intrinsic name!");
210 #define GET_FUNCTION_RECOGNIZER
211 #include "llvm/Intrinsics.gen"
212 #undef GET_FUNCTION_RECOGNIZER
216 const char *Intrinsic::getName(ID id
) {
217 assert(id
< num_intrinsics
&& "Invalid intrinsic ID!");
218 const char * const Table
[] = {
220 #define GET_INTRINSIC_NAME_TABLE
221 #include "llvm/Intrinsics.gen"
222 #undef GET_INTRINSIC_NAME_TABLE
227 Value
*IntrinsicInst::StripPointerCasts(Value
*Ptr
) {
228 if (ConstantExpr
*CE
= dyn_cast
<ConstantExpr
>(Ptr
)) {
229 if (CE
->getOpcode() == Instruction::Cast
) {
230 if (isa
<PointerType
>(CE
->getOperand(0)->getType()))
231 return StripPointerCasts(CE
->getOperand(0));
232 } else if (CE
->getOpcode() == Instruction::GetElementPtr
) {
233 for (unsigned i
= 1, e
= CE
->getNumOperands(); i
!= e
; ++i
)
234 if (!CE
->getOperand(i
)->isNullValue())
236 return StripPointerCasts(CE
->getOperand(0));
241 if (CastInst
*CI
= dyn_cast
<CastInst
>(Ptr
)) {
242 if (isa
<PointerType
>(CI
->getOperand(0)->getType()))
243 return StripPointerCasts(CI
->getOperand(0));
244 } else if (GetElementPtrInst
*GEP
= dyn_cast
<GetElementPtrInst
>(Ptr
)) {
245 for (unsigned i
= 1, e
= GEP
->getNumOperands(); i
!= e
; ++i
)
246 if (!isa
<Constant
>(GEP
->getOperand(i
)) ||
247 !cast
<Constant
>(GEP
->getOperand(i
))->isNullValue())
249 return StripPointerCasts(GEP
->getOperand(0));