-std::string Mangler::getValueName(const GlobalValue *GV, const char * Suffix) {
- // Check to see whether we've already named V.
- std::string &Name = Memo[GV];
- if (!Name.empty())
- return Name; // Return the already-computed name for V.
-
- // Name mangling occurs as follows:
- // - If V is an intrinsic function, do not change name at all
- // - Otherwise, mangling occurs if global collides with existing name.
- if (isa<Function>(GV) && cast<Function>(GV)->isIntrinsic()) {
- Name = GV->getName(); // Is an intrinsic function
- } else if (!GV->hasName()) {
- // Must mangle the global into a unique ID.
- unsigned TypeUniqueID = getTypeID(GV->getType());
- static unsigned GlobalID = 0;
- Name = "__unnamed_" + utostr(TypeUniqueID) + "_" + utostr(GlobalID++);
- } else if (!MangledGlobals.count(GV)) {
- Name = makeNameProper(GV->getName() + Suffix, Prefix);
- } else {
- unsigned TypeUniqueID = getTypeID(GV->getType());
- Name = "l" + utostr(TypeUniqueID) + "_" + makeNameProper(GV->getName());
+/// getNameWithPrefix - Fill OutName with the name of the appropriate prefix
+/// and the specified global variable's name. If the global variable doesn't
+/// have a name, this fills in a unique name for the global.
+void Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName,
+ const GlobalValue *GV,
+ bool isImplicitlyPrivate) {
+
+ // If the global is anonymous or not led with \1, then add the appropriate
+ // prefix.
+ if (!GV->hasName() || GV->getName()[0] != '\1') {
+ if (GV->hasPrivateLinkage() || isImplicitlyPrivate)
+ OutName.append(PrivatePrefix, PrivatePrefix+strlen(PrivatePrefix));
+ else if (GV->hasLinkerPrivateLinkage())
+ OutName.append(LinkerPrivatePrefix,
+ LinkerPrivatePrefix+strlen(LinkerPrivatePrefix));;
+ OutName.append(Prefix, Prefix+strlen(Prefix));