[llvm-dev] BackendUtil's EmitAssemblyHelper::EmitAssembly generated call in wrong order

Leslie Zhai via llvm-dev llvm-dev at lists.llvm.org
Sat Dec 23 20:23:33 PST 2017


Hi Craig,

Thanks for your response!

But GCC generated call in my expected order 
https://bugs.llvm.org/show_bug.cgi?id=35737#c1

Yes, it is my problem, I can write compatible and correct code like:

int r = bar();

std::cout << "return:" << r << std::endl;


在 2017年12月24日 12:13, Craig Topper 写道:
> I think this is a problem with your expectations
>
> The code in your main function is evalualated equivalent like this.
>
>  ((std::cout << "return: ") << bar()) << std::endl;
>
> The << operators are evaluated left to right one at a time. Just as 
> they would be in the case of something like "foo() + bar() + baz()"
>
> The << operator for cout prints and then return a reference to its 
> left hand side so that multiple << can be chained together. Due to 
> that, another way to write this is:
>
> std::cout << "return: ";
> std::cout << bar();
> std::cout << std::endl;
>
>
>
> ~Craig
>
> On Sat, Dec 23, 2017 at 7:47 PM, Leslie Zhai via llvm-dev 
> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>
>     Hi LLVM developers,
>
>     A C++ testcase for PR35737
>
>     #include <iostream>
>
>     int bar() {
>       std::cout << "bar" << std::endl;
>       return 1;
>     }
>
>     int main() {
>       std::cout << "return: " << bar() << std::endl;
>       return 0;
>     }
>
>     Actual output:
>
>     return: bar
>     1
>
>     Expected output:
>
>     bar
>     return: 1
>
>     Workaround to edit LLVM IR:
>
>     --- PR35737.ll  2017-12-24 11:20:12.012346163 <tel:12.012346163> +0800
>     +++ PR35737-workaround.ll       2017-12-24 11:42:25.303256968 +0800
>     @@ -62,8 +62,8 @@
>      entry:
>        %retval = alloca i32, align 4
>        store i32 0, i32* %retval, align 4
>     -  %call = call dereferenceable(272) %"class.std::basic_ostream"*
>     @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(%"class.std::basic_ostream"*
>     dereferenceable(272) @_ZSt4cout, i8* getelementptr inbounds ([9 x
>     i8], [9 x i8]* @.str.1, i32 0, i32 0))
>        %call1 = call i32 @_Z3barv()
>     +  %call = call dereferenceable(272) %"class.std::basic_ostream"*
>     @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(%"class.std::basic_ostream"*
>     dereferenceable(272) @_ZSt4cout, i8* getelementptr inbounds ([9 x
>     i8], [9 x i8]* @.str.1, i32 0, i32 0))
>        %call2 = call dereferenceable(272) %"class.std::basic_ostream"*
>     @_ZNSolsEi(%"class.std::basic_ostream"* %call, i32 %call1)
>        %call3 = call dereferenceable(272) %"class.std::basic_ostream"*
>     @_ZNSolsEPFRSoS_E(%"class.std::basic_ostream"* %call2,
>     %"class.std::basic_ostream"* (%"class.std::basic_ostream"*)*
>     @_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_)
>        ret i32 0
>
>
>     Then,
>
>     $ llc PR35737-workaround.ll
>
>     $ clang++ PR35737-workaround.s
>
>     $ ./a.out
>
>     bar
>     return: 1
>
>     Please give me some advice, thanks a lot!
>
>     -- 
>     Regards,
>     Leslie Zhai - https://reviews.llvm.org/p/xiangzhai/
>     <https://reviews.llvm.org/p/xiangzhai/>
>
>
>     _______________________________________________
>     LLVM Developers mailing list
>     llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
>     http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>     <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>
>
>

-- 
Regards,
Leslie Zhai - https://reviews.llvm.org/p/xiangzhai/



More information about the llvm-dev mailing list