support for attach embedded metadata to function/argument/basicblock proposal

hi all,

As i know attach embedded metadata nodes to function/argument/basicblock is not support yet, but such feature maybe useful to us. for example, we got the conversation

Sorry, forgot to post to list.

For 2.7 I'm wondering if you could use custom metadata attached to the first instruction of a "special" block? You could register a unique kind (not sure how to guarantee uniqueness), and attach a metadata node via the context to the first instruction with this kind. Your pass would look for this. I have never tried this, so I don't know if predecessor passes that your pass would depend on would affect this metadata; if different threads with their own context would see metadata attached via a specific context; and what the resultant performance effect would be.

Just a thought


   > Hi,
> > We 're working on an llvm interpreter. We perform some static analysis
> to detect some blocks with a specific property, and we need the
> interpreter to be able to recognise these blocks fast in time it
> reaches them. We thought of adding a new instruction in the LLVM
> instruction set and put it in the beginning of such blocks, so that
> the interpreter would be instantly alerted that the current block is
> 'special'. Is there an easier/quicker way to do this?
> > Cheers,
> yannis

if we could attach metadata to a basicblock, this problem will be easily done.

so i am going to add support for attaching metadata to function/argument/basicblock.

the syntax of attaching metadata to a basicblock will go like this:
bbname, !mdname !md [, !othermdname !othermd ...]:

for example:

entry, !foo !bar: ; attach bar to entry block
entry, !foo !bar, !foo1 !bar1: ; attach bar and bar1 to entry block

and we could add a function/argument attribute named "metadata" for attaching metadata to function or argument.

define void @functionname() metadata(!mdname !md, [, !othermdname !othermd ...]) [other funtion attributes] { ... }

declare i32 @functionname(i8 metadata(!mdname !md, [, !othermdname !othermd ...]) [other parameter attributes])

for example:

define void @f() metadata(!foo !bar) { ... } ;attach bar to function f
define void @f(i8 metadata(!foo !bar) a) { ... } ;attach bar to argument a

so, i think i shoud:

1.change "typedef DenseMap<const Instruction *, MDMapTy> MDStoreTy; in MetadataContextImpl"
"typedef DenseMap<const Value *, MDMapTy> MDStoreTy;"
and the corresponding method in MetadataContextImpl and MetadataContext?

2.modify the code of asm reader/writer
3.modify bitcode reader/writer

any comment or advice is appreciate

best regards