[cfe-dev] CodeGen

Nikola Smiljanic popizdeh at gmail.com
Wed Jul 30 21:31:50 PDT 2014


There is no function overloading in C. Change your file's extension to cpp.


On Thu, Jul 31, 2014 at 11:44 AM, 郭志全 <gzq_study at 163.com> wrote:

> I'm learning the clang source code,try to understand how llvm translate
> .cpp to .ll
> when I read the CodeGenModule.cpp
>
> 02271   if (GV->getType()->getElementType() != Ty) {
> 02272     // If the types mismatch then we have to rewrite the definition.
> 02273     assert(GV->isDeclaration() && "Shouldn't replace
> non-declaration");
> 02274
> 02275     // F is the Function* for the one with the wrong type, we must
> make a new
> 02276     // Function* and update everything that used F (a declaration)
> with the new
> 02277     // Function* (which will be a definition).
> 02278     //
> 02279     // This happens if there is a prototype for a function
> 02280     // (e.g. "int f()") and then a definition of a different type
> 02281     // (e.g. "int f(int x)").  Move the old function aside so that it
> 02282     // doesn't interfere with GetAddrOfFunction.
> 02283     GV->setName(StringRef());
> 02284     auto *NewFn = cast<llvm::Function>(GetAddrOfFunction(GD, Ty));
> 02285
> 02286     // This might be an implementation of a function without a
> 02287     // prototype, in which case, try to do special replacement of
> 02288     // calls which match the new prototype.  The really key thing
> here
> 02289     // is that we also potentially drop arguments from the call site
> 02290     // so as to make a direct call, which makes the inliner happier
> 02291     // and suppresses a number of optimizer warnings (!) about
> 02292     // dropping arguments.
> 02293     if (!GV->use_empty()) {
> 02294       ReplaceUsesOfNonProtoTypeWithRealFunction(GV, NewFn);
> 02295       GV->removeDeadConstantUsers();
> 02296     }
> 02297
> 02298     // Replace uses of F with the Function we will endow with a body.
> 02299     if (!GV->use_empty()) {
> 02300       llvm::Constant *NewPtrForOldDecl =
> 02301           llvm::ConstantExpr::getBitCast(NewFn, GV->getType());
> 02302       GV->replaceAllUsesWith(NewPtrForOldDecl);
> 02303     }
> 02304
> 02305     // Ok, delete the old function now, which is dead.
> 02306     GV->eraseFromParent();
> 02307
> 02308     GV = NewFn;
> 02309   }
>
>
> I have a test
>
>
> //aa.c
>
>
> #include <stdio.h>
>
> void fun(int a,int b);
>
> void fun()
> {
>         printf("no parameters\n");
> }
> int main()
> {
>         fun();
>         return 0;
> }
>
>
> compiler using clang
>
>
> aa.c:11:6: error: too few arguments to function call, expected 2, have 0
>         fun();
>         ~~~ ^
> aa.c:5:1: note: 'fun' declared here
> void fun()
> ^
> 1 error generated.
>
> This Is it right?
>
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20140731/90b9bdad/attachment.html>


More information about the cfe-dev mailing list