Peter Collingbourne
Research Areas
      Authored Publications
    
  
  
  
    
    
  
      
        Sort By
        
        
    
    
        
          
            
              Souper: A Synthesizing Superoptimizer
            
          
        
        
          
            
              
                
                  
                    
    
    
    
    
    
                      
                        Raimondas Sasnauskas
                      
                    
                
              
            
              
                
                  
                    
                    
                      
                        Yang Chen
                      
                    
                  
              
            
              
                
                  
                    
                    
                  
              
            
              
                
                  
                    
                    
                      
                        Jeroen Ketema
                      
                    
                  
              
            
              
                
                  
                    
                    
                      
                        Jubi Taneja
                      
                    
                  
              
            
              
                
                  
                    
                    
                      
                        John Regehr
                      
                    
                  
              
            
          
          
          
          
            arXiv (2017)
          
          
        
        
        
          
              Preview abstract
          
          
              If we can automatically derive compiler optimizations, we might be able to sidestep some of the substantial engineering challenges involved in creating and maintaining a high-quality compiler. We developed Souper, a synthesizing superoptimizer, to see how far these ideas might be pushed in the context of LLVM. Along the way, we discovered that Souper's intermediate representation was sufficiently similar to the one in Microsoft Visual C++ that we applied Souper to that compiler as well. Shipping, or about-to-ship, versions of both compilers contain optimizations suggested by Souper but implemented by hand. Alternately, when Souper is used as a fully automated optimization pass it compiles a Clang compiler binary that is about 3 MB (4.4%) smaller than the one compiled by LLVM.
              
  
View details
          
        
      
    
        
          
            
              Enforcing Forward-Edge Control-Flow Integrity in GCC & LLVM
            
          
        
        
          
            
              
                
                  
                    
                
              
            
              
                
                  
                    
                    
    
    
    
    
    
                      
                        Tom Roeder
                      
                    
                  
              
            
              
                
                  
                    
                    
                  
              
            
              
                
                  
                    
                    
                      
                        Stephen Checkoway
                      
                    
                  
              
            
              
                
                  
                    
                    
                  
              
            
              
                
                  
                    
                    
                      
                        Luis Lozano
                      
                    
                  
              
            
              
                
                  
                    
                    
                      
                        Geoff Pike
                      
                    
                  
              
            
          
          
          
          
            Proceedings of the 23rd Usenix Security Symposium, USENIX, San Diego, CA (2014)
          
          
        
        
        
          
              Preview abstract
          
          
              Constraining dynamic control transfers is a common technique for mitigating software vulnerabilities.  This defense has been widely and successfully used to protect return addresses and stack data; hence, current attacks instead typically corrupt vtable and function pointers to subvert a forward edge (an indirect jump or call) in the control-flow graph.  Forward edges can be protected using Control-Flow Integrity (CFI) but, to date, CFI implementations have been research prototypes, based on impractical assumptions or ad hoc, heuristic techniques.  To be widely adoptable, CFI mechanisms must be integrated into production compilers and be compatible with software-engineering aspects such as incremental compilation and dynamic libraries.
This paper presents implementations of fine-grained, forward-edge CFI enforcement and analysis for GCC and LLVM that meet the above requirements.  An analysis and evaluation of the security, performance, and resource consumption of these mechanisms applied to the SPEC CPU2006 benchmarks and common benchmarks for the Chromium web browser show the practicality of our approach: these fine-grained CFI mechanisms have significantly lower overhead than recent academic CFI prototypes.  Implementing CFI in industrial compiler frameworks has also led to insights into design tradeoffs and practical challenges, such as dynamic loading.
              
  
View details