CodeGen: allow __asm renaming on static local variables.

Fixes PR4777.

llvm-svn: 145015
This commit is contained in:
Benjamin Kramer 2011-11-20 21:05:04 +00:00
parent 6ae03c3378
commit ddbb2b85ab
2 changed files with 19 additions and 4 deletions

View File

@ -11,6 +11,7 @@
// //
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
#include "CGCXXABI.h"
#include "CGDebugInfo.h" #include "CGDebugInfo.h"
#include "CodeGenFunction.h" #include "CodeGenFunction.h"
#include "CodeGenModule.h" #include "CodeGenModule.h"
@ -177,7 +178,14 @@ CodeGenFunction::CreateStaticVarDecl(const VarDecl &D,
QualType Ty = D.getType(); QualType Ty = D.getType();
assert(Ty->isConstantSizeType() && "VLAs can't be static"); 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::Type *LTy = CGM.getTypes().ConvertTypeForMem(Ty);
llvm::GlobalVariable *GV = llvm::GlobalVariable *GV =

View File

@ -2,11 +2,18 @@
// RUN: %clang_cc1 -triple=i686-apple-darwin9 -emit-llvm %s -o - | FileCheck %s --check-prefix=DARWIN // RUN: %clang_cc1 -triple=i686-apple-darwin9 -emit-llvm %s -o - | FileCheck %s --check-prefix=DARWIN
char *strerror(int) asm("alias"); char *strerror(int) asm("alias");
int x __asm("foo");
void test(void) int *test(void) {
{ static int y __asm("bar");
strerror(-1); strerror(-1);
return &y;
} }
// LINUX: @bar = internal global i32 0
// LINUX: @foo = common global i32 0
// LINUX: declare i8* @alias(i32) // LINUX: declare i8* @alias(i32)
// DARWIN: @"\01bar" = internal global i32 0
// DARWIN: @"\01foo" = common global i32 0
// DARWIN: declare i8* @"\01alias"(i32) // DARWIN: declare i8* @"\01alias"(i32)