[llvm-commits] llvm-gcc part of PR1017
Chris Lattner
clattner at apple.com
Wed Apr 25 10:11:37 PDT 2007
On Apr 25, 2007, at 7:39 AM, Anton Korobeynikov wrote:
> Hello, Everyone.
>
> Please find attached llvm-gcc patch for symbol aliasing support. Now
> libstdc++ can be build as shared library on x86/linux, stripping 10M
> from the llvm-gcc distribution.
>
> This fixes: PR843, PR1006, PR1017.
Ooh, cool.
A running example:
int X() alias "Y";
+ // Get or create LLVM global for our alias.
+ GlobalValue *V = cast<GlobalValue>DECL_LLVM(decl);
Two things: first please use ()'s around DECL_LLVM. I assume this
works because DECL_LLVM expands to being surrounded by parens, but
this looks very strange.
Second, does this create a decl for "X" or for "Y"? I think it
creates a global for X, which you later hack out and replace with a
GlobalAlias instance. This is ugly because you're creating a global
or function, only to remove it. Would it be possible to make
make_decl_llvm create the GlobalAlias for you directly?
+ // Query SymTab for aliasee
+ const char* AliaseeName = IDENTIFIER_POINTER(target);
+ if (!Aliasee) {
+ if (isa<Function>(V)) {
+ Aliasee = TheModule->getFunction(AliaseeName);
+ } else if (isa<GlobalVariable>(V)) {
+ Aliasee = TheModule->getNamedGlobal(AliaseeName);
+ } else if (isa<GlobalAlias>(V)) {
+ Aliasee = TheModule->getNamedAlias(AliaseeName);
+ }
+ }
This can be made simpler. Try something like this:
Aliasee = TheModule->getValueSymbolTable().lookup(AliaseeName);
+ // Last resort. Query for name set via __asm__
..
+ if (isa<Function>(V)) {
+ Aliasee = TheModule->getFunction(starred);
+ } else if (isa<GlobalVariable>(V)) {
+ Aliasee = TheModule->getNamedGlobal(starred);
+ } else if (isa<GlobalAlias>(V)) {
+ Aliasee = TheModule->getNamedAlias(starred);
+ }
Likewise.
+ if (!Aliasee)
+ if (stage) {
+ TheModule->dump();
+ error ("%J%qD aliased to undefined symbol %qE",
+ decl, decl, target);
+ } else
+ return -1;
This probably shouldn't dump TheModule if it is a user error. :) If
a user shouldn't be able to trigger this, turn this into an assert.
+ std::string savedName = V->getName();
+ GlobalAlias* GA = new GlobalAlias(Aliasee->getType(), Linkage,
savedName,
+ Aliasee, TheModule);
..
+ V->eraseFromParent();
+ GA->setName(savedName);
The name gymnastics would be more efficient as:
GlobalAlias* GA = new GlobalAlias(Aliasee->getType(), Linkage, "",
Aliasee, TheModule);
GA->takeName(V);
but hopefully you can eliminate them entirely by fixing make_decl_llvm.
+++ b/gcc/varasm.c Wed Apr 25 17:03:17 2007 +0400
@@ -4645,17 +4647,17 @@ find_decl_and_mark_needed (tree decl, tr
if (!cgraph_global_info_ready)
{
if (TREE_CODE (decl) == FUNCTION_DECL)
- {
- fnode = cgraph_node_for_asm (target);
- if (fnode == NULL)
- vnode = cgraph_varpool_node_for_asm (target);
- }
+ {
+ fnode = cgraph_node_for_asm (target);
+ if (fnode == NULL)
+ vnode = cgraph_varpool_node_for_asm (target);
+ }
this looks like indentation changes, please remove from the diff.
There are several others in this file.
Otherwise, looks great!
-Chris
More information about the llvm-commits
mailing list