Uploaded image for project: 'IMPALA'
  1. IMPALA
  2. IMPALA-3181

build most of impala with -fno-exceptions

    Details

    • Type: Improvement
    • Status: Open
    • Priority: Minor
    • Resolution: Unresolved
    • Affects Version/s: Impala 2.5.0
    • Fix Version/s: None
    • Component/s: Backend
    • Labels:
      None

      Description

      In the backend, we only use exceptions when interfacing with third party libraries that throw exceptions (e.g. boost), which we wrap with try-catch. Outside of that, we don't expect, nor handle, exceptions unwinding impala code.

      So, we could isolate calls to those thirdparty libraries to .cc files, and then compile the rest of Impala with -fno-exceptions. The advantages to doing so are:

      • Better code. All the stack unwinding code goes away and potentially more optimizations are possible.
      • We'll get compiler errors if try-catch is written in places where it won't work anyway (IR code since we disable generating exception handling code). This probably could have caught IMPALA-2184 at compile time.

      A good starting point is probably to turn on -fno-exceptions for IR since we already don't generate exception handling code. This may require refactoring use of boost headers, however, since statically exceptions may be possible on these paths.

      An alternative would be to use 'noexcept', but this would require annotating every function.

      Example:

      #include <stdio.h>
      
      struct Foo {
        Foo() { printf("Foo()"); }
        ~Foo() { printf("~Foo()"); }
      };
      
      void NoExcept() noexcept;
      void Except();
      
      void CallNoExcept() {
        Foo foo;
        NoExcept();
      }
      
      void CallExcept() {
        Foo foo;
        Except();
      }
      
      int main() {
        CallExcept();
      }
      
      "-std=c++11 -O2 -S"
      CallNoExcept():
      .LFB18:
              .cfi_startproc
              .cfi_personality 0x3,__gxx_personality_v0
              .cfi_lsda 0x3,.LLSDA18
              subq    $8, %rsp
              .cfi_def_cfa_offset 16
              movl    $.LC0, %edi
              xorl    %eax, %eax
      .LEHB0:
              call    printf
      .LEHE0:
              call    NoExcept()
              movl    $.LC1, %edi
              xorl    %eax, %eax
              addq    $8, %rsp
              .cfi_def_cfa_offset 8
              jmp     printf
              .cfi_endproc
      ...
      CallExcept():
      .LFB19:
              .cfi_startproc
              .cfi_personality 0x3,__gxx_personality_v0
              .cfi_lsda 0x3,.LLSDA19
              pushq   %rbx
              .cfi_def_cfa_offset 16
              .cfi_offset 3, -16
              movl    $.LC0, %edi
              xorl    %eax, %eax
      .LEHB1:
              call    printf
      .LEHE1:
      .LEHB2:
              call    Except()
      .LEHE2:
              popq    %rbx
              .cfi_remember_state
              .cfi_def_cfa_offset 8
              movl    $.LC1, %edi
              xorl    %eax, %eax
              jmp     printf
      .L5:
              .cfi_restore_state
              movq    %rax, %rbx
              movl    $.LC1, %edi
              xorl    %eax, %eax
              call    printf
              movq    %rbx, %rdi
      .LEHB3:
              call    _Unwind_Resume
      .LEHE3:
              .cfi_endproc
      
      "-std=c++11 -O2 -fno-exceptions -S"
      CallNoExcept():
      .LFB18:
              .cfi_startproc
              subq    $8, %rsp
              .cfi_def_cfa_offset 16
              movl    $.LC0, %edi
              xorl    %eax, %eax
              call    printf
              call    NoExcept()
              movl    $.LC1, %edi
              xorl    %eax, %eax
              addq    $8, %rsp
              .cfi_def_cfa_offset 8
              jmp     printf
              .cfi_endproc
      ...
      CallExcept():
      .LFB19:
              .cfi_startproc
              subq    $8, %rsp
              .cfi_def_cfa_offset 16
              movl    $.LC0, %edi
              xorl    %eax, %eax
              call    printf
              call    Except()
              movl    $.LC1, %edi
              xorl    %eax, %eax
              addq    $8, %rsp
              .cfi_def_cfa_offset 8
              jmp     printf
              .cfi_endproc
      

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                kwho Michael Ho
                Reporter:
                dhecht Dan Hecht
              • Votes:
                0 Vote for this issue
                Watchers:
                5 Start watching this issue

                Dates

                • Created:
                  Updated: