@ -466,23 +466,14 @@ This command wraps "go %s". Below is its help:
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							flagDebugDir  =  filepath . Join ( wd ,  flagDebugDir ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						if  err  :=  os . RemoveAll ( flagDebugDir ) ;  err  ==  nil  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							err  :=  os . MkdirAll ( flagDebugDir ,  0 o755 ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							if  err  !=  nil  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								return  nil ,  err 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						}  else  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							return  nil ,  fmt . Errorf ( "debugdir error: %v" ,  err ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						if  err  :=  os . RemoveAll ( flagDebugDir ) ;  err  !=  nil  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							return  nil ,  fmt . Errorf ( "could not empty debugdir: %v" ,  err ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						if  err  :=  os . MkdirAll ( flagDebugDir ,  0 o755 ) ;  err  !=  nil  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							return  nil ,  err 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					// Pass the garble flags down to each toolexec invocation.
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					// This way, all garble processes see the same flag values.
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					var  toolexecFlag  strings . Builder 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					toolexecFlag . WriteString ( "-toolexec=" ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					toolexecFlag . WriteString ( cache . ExecPath ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					appendFlags ( & toolexecFlag ,  false ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					goArgs  :=  [ ] string { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						command , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						"-trimpath" , 
 
			
		 
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
			
			 
			 
			
				@ -491,7 +482,15 @@ This command wraps "go %s". Below is its help:
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						// TODO: remove the conditional once we drop support for 1.17
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						goArgs  =  append ( goArgs ,  "-buildvcs=false" ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					// Pass the garble flags down to each toolexec invocation.
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					// This way, all garble processes see the same flag values.
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					var  toolexecFlag  strings . Builder 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					toolexecFlag . WriteString ( "-toolexec=" ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					toolexecFlag . WriteString ( cache . ExecPath ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					appendFlags ( & toolexecFlag ,  false ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					goArgs  =  append ( goArgs ,  toolexecFlag . String ( ) ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					if  flagDebugDir  !=  ""  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						// In case the user deletes the debug directory,
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						// and a previous build is cached,
 
 
			
		 
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
			
			 
			 
			
				@ -509,7 +508,7 @@ This command wraps "go %s". Below is its help:
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					return  exec . Command ( "go" ,  goArgs ... ) ,  nil 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				var  transformFuncs  =  map [ string ] func ( [ ] string )  ( args  [ ] string ,  _   error ) { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				var  transformFuncs  =  map [ string ] func ( [ ] string )  ( [ ] string ,  error ) { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					"asm" :      transformAsm , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					"compile" :  transformCompile , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					"link" :     transformLink , 
 
			
		 
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
			
			 
			 
			
				@ -1004,8 +1003,8 @@ var cachedOutput = struct {
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						"reflect.TypeOf" :   { 0 } , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						"reflect.ValueOf" :  { 0 } , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					} , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					KnownCannotObfuscate :      map [ s  tring] struct { } { } , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					KnownEmbeddedAliasFields :  map [ s  tring] typeName { } , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					KnownCannotObfuscate :      map [ objectS  tring] struct { } { } , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					KnownEmbeddedAliasFields :  map [ objectS  tring] typeName { } , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				// garbleExportFile returns an absolute path to a build cache entry
 
 
			
		 
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
			
			 
			 
			
				@ -1039,7 +1038,7 @@ func loadCachedOutputs() error {
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							continue  // nothing to load
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						// this function literal is used for the deferred close
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						err   = func ( )  error  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						if  err  :  = func ( )  error  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							filename  :=  garbleExportFile ( pkg ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							f ,  err  :=  os . Open ( filename ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							if  err  !=  nil  { 
 
			
		 
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
			
			 
			 
			
				@ -1052,8 +1051,7 @@ func loadCachedOutputs() error {
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								return  fmt . Errorf ( "gob decode: %w" ,  err ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							return  nil 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						} ( ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						if  err  !=  nil  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						} ( ) ;  err  !=  nil  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							return  fmt . Errorf ( "cannot load garble export file for %s: %w" ,  path ,  err ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						loaded ++ 
 
			
		 
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
			
			 
			 
			
				@ -1446,23 +1444,23 @@ func (tf *transformer) transformGo(file *ast.File) *ast.File {
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						if  obj  ==  nil  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							_ ,  isImplicit  :=  tf . info . Defs [ node ] 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							_ ,  parentIsFile  :=  cursor . Parent ( ) . ( * ast . File ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							if  isImplicit  &&  ! parentIsFile  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								// In a type switch like "switch foo := bar.(type) {",
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								// "foo" is being declared as a symbolic variable,
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								// as it is only actually declared in each "case SomeType:".
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								//
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								// As such, the symbolic "foo" in the syntax tree has no object,
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								// but it is still recorded under Defs with a nil value.
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								// We still want to obfuscate that syntax tree identifier,
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								// so if we detect the case, create a dummy types.Var for it.
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								//
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								// Note that "package mypkg" also denotes a nil object in Defs,
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								// and we don't want to treat that "mypkg" as a variable,
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								// so avoid that case by checking the type of cursor.Parent.
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								obj  =  types . NewVar ( node . Pos ( ) ,  tf . pkg ,  name ,  nil ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							}  else  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							if  ! isImplicit  ||  parentIsFile  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								// We only care about nil objects in the switch scenario below.
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								return  true 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							// In a type switch like "switch foo := bar.(type) {",
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							// "foo" is being declared as a symbolic variable,
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							// as it is only actually declared in each "case SomeType:".
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							//
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							// As such, the symbolic "foo" in the syntax tree has no object,
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							// but it is still recorded under Defs with a nil value.
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							// We still want to obfuscate that syntax tree identifier,
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							// so if we detect the case, create a dummy types.Var for it.
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							//
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							// Note that "package mypkg" also denotes a nil object in Defs,
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							// and we don't want to treat that "mypkg" as a variable,
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							// so avoid that case by checking the type of cursor.Parent.
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							obj  =  types . NewVar ( node . Pos ( ) ,  tf . pkg ,  name ,  nil ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						pkg  :=  obj . Pkg ( ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						if  vr ,  ok  :=  obj . ( * types . Var ) ;  ok  &&  vr . Embedded ( )  {