зеркало из https://github.com/microsoft/clang-1.git
Bug 8765: Honor assembler labels for builtins. Ensure that the label is
mangled to avoid doing it twice for platforms that use prefixes like Darwin. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@131311 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
cbea7635a9
Коммит
4fe497d5cd
|
@ -1574,14 +1574,24 @@ llvm::Value *CodeGenModule::getBuiltinLibFunction(const FunctionDecl *FD,
|
|||
"isn't a lib fn");
|
||||
|
||||
// Get the name, skip over the __builtin_ prefix (if necessary).
|
||||
const char *Name = Context.BuiltinInfo.GetName(BuiltinID);
|
||||
if (Context.BuiltinInfo.isLibFunction(BuiltinID))
|
||||
Name += 10;
|
||||
llvm::StringRef Name;
|
||||
GlobalDecl D(FD);
|
||||
|
||||
// If the builtin has been declared explicitly with an assembler label,
|
||||
// use the mangled name. This differs from the plain label on platforms
|
||||
// that prefix labels.
|
||||
if (const AsmLabelAttr *ALA = FD->getAttr<AsmLabelAttr>())
|
||||
Name = getMangledName(D);
|
||||
else if (Context.BuiltinInfo.isLibFunction(BuiltinID))
|
||||
Name = Context.BuiltinInfo.GetName(BuiltinID) + 10;
|
||||
else
|
||||
Name = Context.BuiltinInfo.GetName(BuiltinID);
|
||||
|
||||
|
||||
const llvm::FunctionType *Ty =
|
||||
cast<llvm::FunctionType>(getTypes().ConvertType(FD->getType()));
|
||||
|
||||
return GetOrCreateLLVMFunction(Name, Ty, GlobalDecl(FD), /*ForVTable=*/false);
|
||||
return GetOrCreateLLVMFunction(Name, Ty, D, /*ForVTable=*/false);
|
||||
}
|
||||
|
||||
llvm::Function *CodeGenModule::getIntrinsic(unsigned IID,const llvm::Type **Tys,
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
// RUN: %clang_cc1 -triple=i686-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=LINUX
|
||||
// RUN: %clang_cc1 -triple=i686-apple-darwin9 -emit-llvm %s -o - | FileCheck %s --check-prefix=DARWIN
|
||||
|
||||
char *strerror(int) asm("alias");
|
||||
|
||||
void test(void)
|
||||
{
|
||||
strerror(-1);
|
||||
}
|
||||
|
||||
// LINUX: declare i8* @alias(i32)
|
||||
// DARWIN: declare i8* @"\01alias"(i32)
|
Загрузка…
Ссылка в новой задаче