From 2bb9c5ca221efe2c1ad77e85f13d8531c457807f Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Fri, 4 Dec 2015 00:45:43 +0000 Subject: [PATCH] Emit function alias to data as a function symbol. CFI emits jump slots for indirect functions as a byte array constant, and declares function-typed aliases to these constants. This change fixes AsmPrinter to emit these aliases as function symbols and not data symbols. llvm-svn: 254674 --- llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 5 +++++ llvm/test/CodeGen/Generic/function-alias.ll | 12 ++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 llvm/test/CodeGen/Generic/function-alias.ll diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 2cfea650872a..b8604240b5d9 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -1187,6 +1187,11 @@ bool AsmPrinter::doFinalization(Module &M) { else assert(Alias.hasLocalLinkage() && "Invalid alias linkage"); + // Set the symbol type to function if the alias has a function type. + // This affects codegen when the aliasee is not a function. + if (Alias.getType()->getPointerElementType()->isFunctionTy()) + OutStreamer->EmitSymbolAttribute(Name, MCSA_ELF_TypeFunction); + EmitVisibility(Name, Alias.getVisibility()); // Emit the directives as assignments aka .set: diff --git a/llvm/test/CodeGen/Generic/function-alias.ll b/llvm/test/CodeGen/Generic/function-alias.ll new file mode 100644 index 000000000000..d68d75d5578a --- /dev/null +++ b/llvm/test/CodeGen/Generic/function-alias.ll @@ -0,0 +1,12 @@ +; RUN: llc < %s | FileCheck %s +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +; "data" constant +@0 = private constant <{ i8, i8 }> <{i8 15, i8 11}>, section ".text" + +; function-typed alias +@ud2 = alias void (), bitcast (<{ i8, i8 }>* @0 to void ()*) + +; Check that "ud2" is emitted as a function symbol. +; CHECK: .type{{.*}}ud2,@function