[PATCH] AsmPrinter: introduce support for aliases with non-zero GEPs.

Peter Collingbourne peter at pcc.me.uk
Mon Apr 22 00:47:35 PDT 2013


http://llvm-reviews.chandlerc.com/D701

Files:
  lib/CodeGen/AsmPrinter/AsmPrinter.cpp
  test/CodeGen/X86/aliases.ll

Index: lib/CodeGen/AsmPrinter/AsmPrinter.cpp
===================================================================
--- lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -841,6 +841,8 @@
   // FIXME: Produce a DW_OP_bit_piece if we used a superregister
 }
 
+static const MCExpr *lowerConstant(const Constant *CV, AsmPrinter &AP);
+
 bool AsmPrinter::doFinalization(Module &M) {
   // Emit global variables.
   for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
@@ -908,9 +910,6 @@
          I != E; ++I) {
       MCSymbol *Name = Mang->getSymbol(I);
 
-      const GlobalValue *GV = I->getAliasedGlobal();
-      MCSymbol *Target = Mang->getSymbol(GV);
-
       if (I->hasExternalLinkage() || !MAI->getWeakRefDirective())
         OutStreamer.EmitSymbolAttribute(Name, MCSA_Global);
       else if (I->hasWeakLinkage())
@@ -921,8 +920,7 @@
       EmitVisibility(Name, I->getVisibility());
 
       // Emit the directives as assignments aka .set:
-      OutStreamer.EmitAssignment(Name,
-                                 MCSymbolRefExpr::Create(Target, OutContext));
+      OutStreamer.EmitAssignment(Name, lowerConstant(I->getAliasee(), *this));
     }
   }
 
Index: test/CodeGen/X86/aliases.ll
===================================================================
--- test/CodeGen/X86/aliases.ll
+++ test/CodeGen/X86/aliases.ll
@@ -1,26 +1,42 @@
-; RUN: llc < %s -mtriple=i686-pc-linux-gnu -asm-verbose=false -o %t
-; RUN: grep globl %t | count 6
-; RUN: grep weak %t  | count 1
-; RUN: grep hidden %t | count 1
-; RUN: grep protected %t | count 1
+; RUN: llc < %s -mtriple=i686-pc-linux-gnu -asm-verbose=false -o - | FileCheck %s
 
 @bar = external global i32
+; CHECK: .globl	foo1
+; CHECK: foo1 = bar
 @foo1 = alias i32* @bar
+; CHECK: .globl	foo2
+; CHECK: foo2 = bar
 @foo2 = alias i32* @bar
 
 %FunTy = type i32()
 
 declare i32 @foo_f()
+; CHECK: .weak	bar_f
+; CHECK: bar_f = foo_f
 @bar_f = alias weak %FunTy* @foo_f
 
+; CHECK-NOT: .{{.*}}bar_i
+; CHECK: bar_i = bar
 @bar_i = alias internal i32* @bar
 
+; CHECK: .globl	A
+; CHECK: A = bar
 @A = alias bitcast (i32* @bar to i64*)
 
+; CHECK: .globl	bar_h
+; CHECK: .hidden	bar_h
+; CHECK: bar_h = bar
 @bar_h = hidden alias i32* @bar
 
+; CHECK: .globl	bar_p
+; CHECK: .protected	bar_p
+; CHECK: bar_p = bar
 @bar_p = protected alias i32* @bar
 
+; CHECK: .globl	bar_offset
+; CHECK: bar_offset = bar+4
+ at bar_offset = alias getelementptr (i32* @bar, i32 1)
+
 define i32 @test() {
 entry:
    %tmp = load i32* @foo1
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D701.1.patch
Type: text/x-patch
Size: 2533 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130422/202ed681/attachment.bin>


More information about the llvm-commits mailing list