diff options
-rw-r--r-- | lib/CodeGen/CGDecl.cpp | 10 | ||||
-rw-r--r-- | test/CodeGen/asm-label.c | 13 |
2 files changed, 19 insertions, 4 deletions
diff --git a/lib/CodeGen/CGDecl.cpp b/lib/CodeGen/CGDecl.cpp index d685847155..3935df02df 100644 --- a/lib/CodeGen/CGDecl.cpp +++ b/lib/CodeGen/CGDecl.cpp @@ -11,6 +11,7 @@ // //===----------------------------------------------------------------------===// +#include "CGCXXABI.h" #include "CGDebugInfo.h" #include "CodeGenFunction.h" #include "CodeGenModule.h" @@ -177,7 +178,14 @@ CodeGenFunction::CreateStaticVarDecl(const VarDecl &D, 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 = diff --git a/test/CodeGen/asm-label.c b/test/CodeGen/asm-label.c index 7be2ad3cc7..c06f11fd2d 100644 --- a/test/CodeGen/asm-label.c +++ b/test/CodeGen/asm-label.c @@ -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) |