-typedef PlaceholderDef<InstPlaceHolderHelper> DefPlaceHolder;
-typedef PlaceholderDef<BBPlaceHolderHelper> BBPlaceHolder;
-typedef PlaceholderDef<MethPlaceHolderHelper> MethPlaceHolder;
-//typedef PlaceholderDef<ModulePlaceHolderHelper> ModulePlaceHolder;
-
-static inline ValID &getValIDFromPlaceHolder(Value *Def) {
- switch (Def->getType()->getPrimitiveID()) {
- case Type::LabelTyID: return ((BBPlaceHolder*)Def)->getDef();
- case Type::MethodTyID: return ((MethPlaceHolder*)Def)->getDef();
-//case Type::ModuleTyID: return ((ModulePlaceHolder*)Def)->getDef();
- default: return ((DefPlaceHolder*)Def)->getDef();
+typedef PlaceholderValue<InstPlaceHolderHelper> ValuePlaceHolder;
+typedef PlaceholderValue<BBPlaceHolderHelper> BBPlaceHolder;
+
+static inline ValID &getValIDFromPlaceHolder(const Value *Val) {
+ const Type *Ty = Val->getType();
+ if (isa<PointerType>(Ty) &&
+ isa<FunctionType>(cast<PointerType>(Ty)->getElementType()))
+ Ty = cast<PointerType>(Ty)->getElementType();
+
+ switch (Ty->getPrimitiveID()) {
+ case Type::LabelTyID: return ((BBPlaceHolder*)Val)->getDef();
+ default: return ((ValuePlaceHolder*)Val)->getDef();
+ }
+}
+
+static inline int getLineNumFromPlaceHolder(const Value *Val) {
+ const Type *Ty = Val->getType();
+ if (isa<PointerType>(Ty) &&
+ isa<FunctionType>(cast<PointerType>(Ty)->getElementType()))
+ Ty = cast<PointerType>(Ty)->getElementType();
+
+ switch (Ty->getPrimitiveID()) {
+ case Type::LabelTyID: return ((BBPlaceHolder*)Val)->getLineNum();
+ default: return ((ValuePlaceHolder*)Val)->getLineNum();