mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-03 14:21:30 +00:00 
			
		
		
		
	If a function seen at compile time is not necessarily the one linked to
the binary being built, it is illegal to change the actual arguments
passing to it. 
  e.g. 
   --------------------------
   void foo(int lol) {
     // foo() has linkage satisifying isWeakForLinker()
     // "lol" is not used at all.
   }
   void bar(int lo2) {
      // xform to foo(undef) is illegal, as compiler dose not know which
      // instance of foo() will be linked to the the binary being built.
      foo(lol2); 
   }
  -----------------------------
  Such functions can be captured by isWeakForLinker(). NOTE that
mayBeOverridden() is insufficient for this purpose as it dosen't include
linkage types like AvailableExternallyLinkage and LinkOnceODRLinkage.
Take link_odr* as an example, it indicates a set of *EQUIVALENT* globals
that can be merged at link-time. However, the semantic of 
*EQUIVALENT*-functions includes parameters. Changing parameters breaks
the assumption.
  Thank John McCall for help, especially for the explanation of subtle
difference between linkage types.
  rdar://11546243
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@192302 91177308-0d34-0410-b5e6-96231b3b80d8
		
	
		
			
				
	
	
		
			22 lines
		
	
	
		
			422 B
		
	
	
	
		
			LLVM
		
	
	
	
	
	
			
		
		
	
	
			22 lines
		
	
	
		
			422 B
		
	
	
	
		
			LLVM
		
	
	
	
	
	
; RUN: opt < %s -deadargelim -S | FileCheck %s
 | 
						|
 | 
						|
; rdar://11546243
 | 
						|
%struct.A = type { i8 }
 | 
						|
 | 
						|
define available_externally void @_Z17externallyDefinedP1A(%struct.A* %a) {
 | 
						|
entry:
 | 
						|
  call void @_Z3foov()
 | 
						|
  ret void
 | 
						|
}
 | 
						|
 | 
						|
declare void @_Z3foov()
 | 
						|
 | 
						|
define void @_Z4testP1A(%struct.A* %a) {
 | 
						|
; CHECK: @_Z4testP1A
 | 
						|
; CHECK: @_Z17externallyDefinedP1A(%struct.A* %a)
 | 
						|
 | 
						|
entry:
 | 
						|
  call void @_Z17externallyDefinedP1A(%struct.A* %a)
 | 
						|
  ret void
 | 
						|
}
 |