llvm-objdump

    See asm and c related code

    llvm-objdump -d --symbolize-operands --no-addresses --x86-asm-syntax=intel --no-show-raw-insn loop-1-clang.c.o
    
    run_switches:
          xor     eax, eax            # res = 0
    loop:                             # while (true) {
          movsx   ecx, byte ptr [rdi] #   c = *input
          test    ecx, ecx            #   if (c == '\0')
          je      ret                 #     return
          add     rdi, 1              #   input++
          cmp     ecx, 'p'            #   if (c == 'p')
          je      p                   #     goto p
          cmp     ecx, 's'            #   if (c == 's')
          jne     loop                #     continue
          add     eax, 1              #   res++
          jmp     loop                #   continue
    p:    add     eax, -1             #   res--
          jmp     loop                # }
    ret:  ret
    

    With the related loop-1-clang.c following code

    int run_switches(char *input) {
      int res = 0;
      while (true) {
        char c = *input++;
        switch (c) {
          case '\0':
            return res;
          case 's':
            res += 1;
            break;
          case 'p':
            res -= 1;
            break;
          default:
            break;
        }
      }
    }
    

    source