diff options
| author | Reid Spencer <rspencer@reidspencer.com> | 2007-02-08 09:07:25 +0000 | 
|---|---|---|
| committer | Reid Spencer <rspencer@reidspencer.com> | 2007-02-08 09:07:25 +0000 | 
| commit | 91a76a443f211bfbb8d6cc1e70ffe2297339ab1d (patch) | |
| tree | bf82cb174080aa6fdd7932da3aaec131a314b985 | |
| parent | 47b6d12ef1f3ae4af252ee718769434c93eb459c (diff) | |
| download | bcm5719-llvm-91a76a443f211bfbb8d6cc1e70ffe2297339ab1d.tar.gz bcm5719-llvm-91a76a443f211bfbb8d6cc1e70ffe2297339ab1d.zip  | |
For PR1187:
Rename function scope names that conflict with basic block names.
llvm-svn: 34048
| -rw-r--r-- | llvm/tools/llvm-upgrade/UpgradeParser.y | 31 | 
1 files changed, 20 insertions, 11 deletions
diff --git a/llvm/tools/llvm-upgrade/UpgradeParser.y b/llvm/tools/llvm-upgrade/UpgradeParser.y index 8a213707abc..ad72b3996ad 100644 --- a/llvm/tools/llvm-upgrade/UpgradeParser.y +++ b/llvm/tools/llvm-upgrade/UpgradeParser.y @@ -475,6 +475,14 @@ static Value *getVal(const Type *Ty, const ValID &ID) {    return V;  } +/// @brief This just makes any name given to it unique, up to MAX_UINT times. +static std::string makeNameUnique(const std::string& Name) { +  static unsigned UniqueNameCounter = 1; +  std::string Result(Name); +  Result += ".upgrd." + llvm::utostr(UniqueNameCounter++); +  return Result; +} +  /// getBBVal - This is used for two purposes:  ///  * If isDefinition is true, a new basic block with the specified ID is being  ///    defined. @@ -499,9 +507,18 @@ static BasicBlock *getBBVal(const ValID &ID, bool isDefinition = false) {      Name = ID.Name;      if (Value *N = CurFun.CurrentFunction->                     getValueSymbolTable().lookup(Name)) { -      if (N->getType() != Type::LabelTy) -        error("Name '" + Name + "' does not refer to a BasicBlock"); -      BB = cast<BasicBlock>(N); +      if (N->getType() != Type::LabelTy) { +        // Register names didn't use to conflict with basic block names +        // because of type planes. Now they all have to be unique. So, we just +        // rename the register and treat this name as if no basic block +        // had been found. +        RenameMapKey Key = std::make_pair(N->getName(),N->getType()); +        N->setName(makeNameUnique(N->getName())); +        CurModule.RenameMap[Key] = N->getName(); +        BB = 0; +      } else { +        BB = cast<BasicBlock>(N); +      }      }      break;    } @@ -623,14 +640,6 @@ static void ResolveTypeTo(char *Name, const Type *ToTy) {    }  } -/// @brief This just makes any name given to it unique, up to MAX_UINT times. -static std::string makeNameUnique(const std::string& Name) { -  static unsigned UniqueNameCounter = 1; -  std::string Result(Name); -  Result += ".upgrd." + llvm::utostr(UniqueNameCounter++); -  return Result; -} -  /// This is the implementation portion of TypeHasInteger. It traverses the  /// type given, avoiding recursive types, and returns true as soon as it finds  /// an integer type. If no integer type is found, it returns false.  | 

