by Alexander Herz:
authorGabor Greif <ggreif@gmail.com>
Wed, 4 Aug 2010 10:00:52 +0000 (10:00 +0000)
committerGabor Greif <ggreif@gmail.com>
Wed, 4 Aug 2010 10:00:52 +0000 (10:00 +0000)
"The CWriter::GetValueName() method does not check if a value as an alias
and emits the alias name which will never be defined in the output .c
file (so the output file fails to compile). This can happen if you have
multiple inheritance with several destructors defined by clang (...D0Ev,
...D1Ev, ...D2Ev)."

-- applied with minor tweaks. Thanks!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@110194 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/CBackend/CBackend.cpp

index e8d8474b5be86bc424d7fc87cef3049f63638199..3b4d0a604cf17b94994c66e3e6de55d93a5cf735 100644 (file)
@@ -1300,6 +1300,13 @@ void CWriter::printConstantWithCast(Constant* CPV, unsigned Opcode) {
 }
 
 std::string CWriter::GetValueName(const Value *Operand) {
+
+  // Resolve potential alias.
+  if (const GlobalAlias *GA = dyn_cast<GlobalAlias>(Operand)) {
+    if (const Value *V = GA->resolveAliasedGlobal(false))
+      Operand = V;
+  }
+
   // Mangle globals with the standard mangler interface for LLC compatibility.
   if (const GlobalValue *GV = dyn_cast<GlobalValue>(Operand)) {
     SmallString<128> Str;