/*
 * BSD 3-Clause License
 *
 * Copyright (c) 2017, Thomas Pointhuber
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice, this
 *  list of conditions and the following disclaimer.
 *
 * Redistributions in binary form must reproduce the above copyright notice,
 *  this list of conditions and the following disclaimer in the documentation
 *  and/or other materials provided with the distribution.
 *
 * Neither the name of the copyright holder nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package at.pointhi.irbuilder.irwriter.visitors.model;

import com.oracle.truffle.llvm.parser.model.enums.Linkage;
import com.oracle.truffle.llvm.parser.model.enums.Visibility;
import com.oracle.truffle.llvm.parser.model.globals.GlobalAlias;
import com.oracle.truffle.llvm.runtime.types.symbols.Symbol;

import at.pointhi.irbuilder.irwriter.IRWriter;
import at.pointhi.irbuilder.irwriter.IRWriterVersion;

public class IRWriterModelVisitorV38 extends IRWriterModelVisitor {

    public IRWriterModelVisitorV38(IRWriterVersion.IRWriterVisitors visitors, IRWriter.PrintTarget target) {
        super(visitors, target);
    }

    private static final String UNRESOLVED_FORWARD_REFERENCE = "<unresolved>";

    /*
     * @see http://releases.llvm.org/3.8.0/docs/LangRef.html#aliases
     */
    @Override
    public void visit(GlobalAlias alias) {
        write(alias.getName());
        write(" = ");

        if (alias.getLinkage() != Linkage.EXTERNAL || alias.getValue() == null) {
            write(alias.getLinkage().getIrString());
            write(" ");
        }

        if (alias.getVisibility() != Visibility.DEFAULT) {
            write(alias.getVisibility().getIrString());
            write(" ");
        }

        write(LLVMIR_LABEL_ALIAS);
        write(" ");

        final Symbol val = alias.getValue();
        if (val == null) {
            writeln(UNRESOLVED_FORWARD_REFERENCE);
            return;
        }
        writeSymbolType(alias);

        write(", ");
        writeSymbolType(val);

        write(" ");
        writeInnerSymbolValue(val);
        writeln();
    }

}

@@ -1829,16 +1829,74 @@
 lAlias;%0A
+import com.oracle.truffle.llvm.runtime.types.PointerType;%0A
 import c
@@ -3074,16 +3074,17 @@
       %7D%0A
+%0A
         
@@ -3092,24 +3092,61 @@
 rite
-Symbol
+Type(((Pointer
 Type
-(
+) 
 alias
+.getType()).getPointeeType()
 );%0A%0A

Fix LLVM 3.8 Alias