[cfe-commits] r145015 - in /cfe/trunk: lib/CodeGen/CGDecl.cpp test/CodeGen/asm-label.c

Benjamin Kramer benny.kra at googlemail.com
Sun Nov 20 13:05:05 PST 2011


Author: d0k
Date: Sun Nov 20 15:05:04 2011
New Revision: 145015

URL: http://llvm.org/viewvc/llvm-project?rev=145015&view=rev
Log:
CodeGen: allow __asm renaming on static local variables.

Fixes PR4777.

Modified:
    cfe/trunk/lib/CodeGen/CGDecl.cpp
    cfe/trunk/test/CodeGen/asm-label.c

Modified: cfe/trunk/lib/CodeGen/CGDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDecl.cpp?rev=145015&r1=145014&r2=145015&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGDecl.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGDecl.cpp Sun Nov 20 15:05:04 2011
@@ -11,6 +11,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "CGCXXABI.h"
 #include "CGDebugInfo.h"
 #include "CodeGenFunction.h"
 #include "CodeGenModule.h"
@@ -177,7 +178,14 @@
   QualType Ty = D.getType();
   assert(Ty->isConstantSizeType() && "VLAs can't be static");
 
-  std::string Name = GetStaticDeclName(*this, D, Separator);
+  // Use the label if the variable is renamed with the asm-label extension.
+  std::string Name;
+  if (D.hasAttr<AsmLabelAttr>()) {
+    llvm::raw_string_ostream Out(Name);
+    CGM.getCXXABI().getMangleContext().mangleName(&D, Out);
+  } else {
+    Name = GetStaticDeclName(*this, D, Separator);
+  }
 
   llvm::Type *LTy = CGM.getTypes().ConvertTypeForMem(Ty);
   llvm::GlobalVariable *GV =

Modified: cfe/trunk/test/CodeGen/asm-label.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/asm-label.c?rev=145015&r1=145014&r2=145015&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/asm-label.c (original)
+++ cfe/trunk/test/CodeGen/asm-label.c Sun Nov 20 15:05:04 2011
@@ -2,11 +2,18 @@
 // RUN: %clang_cc1 -triple=i686-apple-darwin9 -emit-llvm %s -o - | FileCheck %s --check-prefix=DARWIN
 
 char *strerror(int) asm("alias");
+int x __asm("foo");
 
-void test(void)
-{
-	strerror(-1);
+int *test(void) {
+  static int y __asm("bar");
+  strerror(-1);
+  return &y;
 }
 
+// LINUX: @bar = internal global i32 0
+// LINUX: @foo = common global i32 0
 // LINUX: declare i8* @alias(i32)
+
+// DARWIN: @"\01bar" = internal global i32 0
+// DARWIN: @"\01foo" = common global i32 0
 // DARWIN: declare i8* @"\01alias"(i32)





More information about the cfe-commits mailing list